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://aaa.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'])
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值