一、背景
在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'])