python 重新使用一个Webdriver的解决方法

一、背景
在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'])
上一篇:根本:详解receiver based Dstream


下一篇:R01 - 011、HBase 内部是什么机制?