web_ui自动化在实现分布式并发执行时,实例化出来的drvier应该怎么管理呢?

整个学习的课程中,只是单独的介绍了一个浏览器执行,实例化之后的driver在BasePage中进行定义。
目前的需求是:利用selenium grid进行分布式的并发执行,用多进程同时启动谷歌+火狐浏览器,也就是实例化了2个driver。目前的能做到的就是,可以同时打开2个浏览器,打开测试的网址,但是实例化出来的driver如果赋值给BasePage里定义的driver变量,再引用的时候是空的。
这种并发的情况下,实例化的driver应该怎么管理的?各位老师是否能给一下思路,最好给简单的给一个示例的demo代码最好了,感谢!!!

首先不建议使用多线程,这个对编程习惯要求比较高,避免出现多线程竞争死锁,使用多进程运行会好些。另外就是你的driver不要用在类变量中,要用到实例变量里,这样会比较安全。

目前用的就是多进程,如果用到实例变量的话,在测试用例中实例化页面page类的时候,会初始化basepage的init初始化函数,按单个浏览器来说可以处理一下init函数只让赋值一次driver驱动,如果是实例化了2个浏览器的driver,basepage里面的init函数就不能限制只赋值一次了driver了,那该怎么处理呢?

理论上如果是你分为2个进程,各自实例化各自的。他们之间不会互相覆盖的。
如果是多线程,你实例化的时候,他们的page是不同的,driver之间也不会互相覆盖的。

如果出现了覆盖,说明你应该是什么地方代码写的有问题,可以贴下 代码

basepage的初始化代码:
class BasePage():

    _First_init = False
    _driver = None

    def __init__(self, base_driver = None):
        if base_driver:
            BasePage._driver = base_driver
        self._driver = BasePage._driver
        self._driver.implicitly_wait(5)
        self.wait = WebDriverWait(self._driver, 5)

多进程实例化driver的代码:
def driver(url, browser_type):
    driver = DriverTool().get_driver_Remote(url, browser_type)
    BasePage(driver)

def run():
    p1 = Process(target=driver, args=("http://192.168.56.1:5555/wd/hub", "chrome",))
    p2 = Process(target=driver, args=("http://192.168.56.1:5556/wd/hub", "firefox",))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

在basepage的init函数里面设置隐式等待的时候,就报错了,提示的是driver没有实际赋值到basepage中: AttributeError: ‘NoneType’ object has no attribute ‘implicitly_wait’

这是实例化driver的类
class DriverTool():

    def get_driver_Remote(self, selenium_hub, browser_type):
        driver = None
        browser_type = browser_type.lower()
        if browser_type == "ie":
            opt = ie_webdriver.Options()
            opt.force_create_process_api = True
            opt.ensure_clean_session = True
            opt.add_argument("--private")
            ie_capabilities = webdriver.DesiredCapabilities.INTERNETEXPLORER.copy()
            ie_capabilities.update(opt.to_capabilities())
            self.driver = webdriver.Remote(selenium_hub, ie_capabilities)
            
        elif browser_type == "chrome":
            driver = webdriver.Remote(selenium_hub, webdriver.DesiredCapabilities.CHROME.copy())

        elif browser_type == "firefox":
            firefox_options = webdriver.FirefoxOptions()
            """可以先设置浏览器的firefox_profile"""
            # firefox_options.add_argument("--headless")
            driver = webdriver.Remote(selenium_hub, webdriver.DesiredCapabilities.FIREFOX.copy())

        driver.get("https://www.baidu.com/")
        return driver

麻烦老师帮看下,哪里不对。谢谢,这个目前是调试的代码,一直还没通。

多进程要用jenkins job去控制。每个job里去跑自己的测试脚本就可以了。

另外_driver不应该用于类变量,要用实例变量去处理。

意思是:创建2个job任务,每个job设置参数变量,传不同的浏览器类型去实例化driver驱动,但是hub是同一个地址,之后注册两个node节点,是吗?老师。多进程的处理并不在代码里面去处理,单浏览器怎么弄的这个还是怎么弄,只不过把浏览器的类型给参数化。之后去启动2个job任务?

是的,课程教的也是这种方法,通过外部变量控制 browser=chrome pytest …

好的,老师