整个学习的课程中,只是单独的介绍了一个浏览器执行,实例化之后的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 …
好的,老师