一、背景
在UI自动化项目设定中,不同场景采用的是不同文件来进行执行的,在不同文件中会引用启动浏览器的类(webdriver 每次实例化都会重新启动一次浏览器)这样的话就会出现你执行几个场景 启动几个浏览器,本来想要的在一个浏览器上执行不同场景的功能就实现不出来。
经过查询得知
通过webdriver启动一个浏览器会话大概会有这样三个阶段:
1、启动的浏览器驱动代理(hromedriver,Firefox的驱动程序,等等);
2、创建一个命令执行器。用来向代理发送操作命令;
3、使用代理建立一个新的浏览器会话,该代理将与浏览器进行通信。用sessionId来标识会话
二、解决办法
#webdriver 实例化类
from selenium import webdriver
import yaml
class DriverUtil():
def __init__(self):
self.driver = webdriver.Chrome()
def start(self):
#记录sessionID 和 url
executor_url = self.driver.command_executor._url
session_id = self.driver.session_id
with open(conf) as f:
data = yaml.safe_load(f)
data['executor_url'] = executor_url
data['session_id'] = session_id
#保存至配置文件中
with open(conf, 'w') as f:
yaml.safe_dump(data, f, default_flow_style=False)
self.driver.get('https://guide-oa-test.feihe.com/')
self.driver.implicitly_wait(15)
self.driver.maximize_window()
return self.driver
#
if __name__ == '__main__':
DriverUtil().start()
#重写start_session 方法类
from selenium.webdriver import Remote
from selenium.webdriver.chrome import options
from selenium.common.exceptions import InvalidArgumentException
class ReuseChrome(Remote):
def __init__(self, command_executor, session_id):
self.r_session_id = session_id
Remote.__init__(self, command_executor=command_executor, desired_capabilities={})
def start_session(self, capabilities, browser_profile=None):
"""
重写start_session方法
"""
if not isinstance(capabilities, dict):
raise InvalidArgumentException("Capabilities must be a dictionary")
if browser_profile:
if "moz:firefoxOptions" in capabilities:
capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
else:
capabilities.update({'firefox_profile': browser_profile.encoded})
self.capabilities = options.Options().to_capabilities()
self.session_id = self.r_session_id
self.w3c = False
###执行不同自动化场景的文件
from venv.ReussChrome import ReuseChrome
import yaml
class SearchTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
#读取配置文件中的url和session_id
with open(conf) as f:
data = yaml.safe_load(f)
#进行链接上一个会话
cls.driver = ReuseChrome(command_executor=data['executor_url'], session_id=data['session_id'])