问答 selenium 编写 po 模型时,page 页面继承 driver,测试时会同时打开多个浏览器页面

Maruying · 2023年10月25日 · 最后由 陈先生 回复于 2024年02月19日 · 7090 次阅读

各个大佬,最近摸索用 selenium 写基于 PO 模型的 ui 自动化框架。
由于每个页面写一个 page,其中 page 容易继承和初始化 driver 驱动,导致测试时会同时打开多个浏览器页面。
请问这如何避免,用 setup\teardown\conftest 可以解决吗?或者同时打开多个浏览器是否会有大影响吗?谢谢

共收到 9 条回复 时间 点赞

试试 driver 设置单例模式?

你要解决问题的思路是,为什么其中 page 容易继承和初始化 driver 驱动,导致测试时会同时打开多个浏览器页面。

显然是你的传参有问题。不是每一步都创建 driver,创建 driver 只调用一次,包括了打开浏览器、关闭浏览器,配合 yeild,放在 conftest 里面,在 setUp 和 tearDown 分别调用。

盲猜,你的 PO 模式的,page 模块的 driver 不是入参。每个模块都会重复创建。 我写个伪代码吧,帮你提供思路,仅供参考:

你的 conftest 配置:

# ./conftest.py
import  pytest
import ... ...

@pytest.fixture(scope='function')
def   operatorSeleniumDriver():
        driver = 创建dirver
        driver.打开浏览器
        yield  driver 
        driver.关闭浏览器


你的 page 模块的封装:

#./Page/ Login.py

class LoginStep:

  def 选择登录的方式(self,driver):
       driver.find_element(xxxxxxx)
       pass

  def 输入用户名密码登陆(self,driver):
       driver.find_element(xxxxxxx)
       pass


你的测试用例这样写:

# ./TestCase/test_login.py
import   Page.xxx.Login

class Test_login:

    def  test_login(operatorSeleniumDriver)
    driver = operatorSeleniumDriver
    action = LoginStep()
    action.选择登录的方式(driver)
    action.输入用户名密码登陆(driver)
    ......


胡八万 回复

感谢回复。目前 Base 公共类继承 driver,Page 继承 Base,每个 Test 文件中,实例化相应的 Page,所以每执行一个 Test,便新建了一个 driver 浏览器。请问有何优化建议吗?

kkMone 回复

感谢回复。新思路😆

from selenium import webdriver

class DriverInit:

    def driver(self):
        driver = webdriver.Chrome()
        return driver

driver = DriverInit().driver()

我直接单搞了一个类专门调用 driver 的,开始直接初始化一个,然后 basepage 直接用这个 driver 就行了

Mr.Shuo 回复

感谢回复。昨晚也尝试了这种单例模式😆

创建一个 case 类,在 case 里面保持一个 driver 就行了,如果用了并行执行 case,那可能就要搞个 threadlocal 隔离下,但未必也能行,因为执行机器就一个 chrome,没测试过只能试试看

挥霍。 回复

感谢回复。后面试试该新思路😀

我们是用 threadlocal 解决的,自定义注解 aware,通过注解 aware 注入到测试类,在监听类实现,自己注册个监听的类,单个机器多个 chrome 是可以跑的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册