当前位置: 首页 > 知识库问答 >
问题:

使用会话范围pytest夹具更新Web驱动程序以供类范围夹具使用

弓泰
2023-03-14

谷歌在搜索答案方面让我失望,所以我现在转到这里。

我正在使用pytest和selenium设置一个自动web测试套件。在运行测试之前,我想先编写代码来检查chromewebdriver的更新。我认为最好的方法是使用fixture和webdriver\u manager模块。

我从以下开始,它起作用了

@pytest.fixture()
def chrome_driver_init(request):
    driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
    request.cls.driver = driver
    driver.get(URL)
    driver.maximize_window()
    yield
    driver.quit()

但每次测试都要检查webdriver的更新,这确实会减慢速度。因此,我尝试了这一点,但不知道如何让子设备使用父设备中的变量。我真的希望它只运行一次更新,并且从那时起子级使用变量,而不需要再次调用更新父级。

#Checks for latest ChromeDriver version
@pytest.fixture(scope='session')
def update_chrome_driver():
    chrome_driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
    return chrome_driver

#Initalizes chrome driver and opens testing window, runs at the beginning of each test
#Closes test window at end of test
@pytest.fixture(scope='class')
def chrome_driver_init(request, update_chrome_driver):
    driver = update_chrome_driver
    request.cls.driver = driver
    driver.get(URL)
    driver.maximize_window()
    yield
    driver.quit()

我尝试了两个装置的不同范围组合,但最终测试设置失败。有人知道一个干净的方法来让它工作吗?

共有1个答案

松昱
2023-03-14

这里有一件事应该优化您的代码-使用在会话范围内安装ChromeDriver,然后将路径传递给您的夹具。示例

import pytest
from selenium import webdriver

from webdriver_manager.chrome import ChromeDriverManager


@pytest.fixture(scope='session')
def path_to_chrome():
    return ChromeDriverManager().install()


@pytest.fixture
def chrome_driver_init(path_to_chrome):
    driver = webdriver.Chrome(executable_path=path_to_chrome)
    driver.get('https://google.com')
    driver.maximize_window()
    yield
    driver.quit()


def test_1(chrome_driver_init):
    pass


def test_2(chrome_driver_init):
    pass

然后你可以看到webdriver_manager只调用一次:

pytest tests/test_some.py 
========================================================================================== test session starts ===========================================================================================
platform darwin -- Python 3.7.2, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /Users/user/SOTriageProject/tests, configfile: pytest.ini
plugins: env-0.6.2, cov-3.0.0
collected 2 items                                                                                                                                                                                        

tests/test_some.py::test_1 
--------------------------------------------------------------------------------------------- live log setup ---------------------------------------------------------------------------------------------
INFO     WDM:logger.py:24 

INFO     WDM:logger.py:24 ====== WebDriver manager ======
INFO     WDM:logger.py:24 Current google-chrome version is 94.0.4606
INFO     WDM:logger.py:24 Get LATEST driver version for 94.0.4606
INFO     WDM:logger.py:24 Driver [/Users/user/.wdm/drivers/chromedriver/mac64/94.0.4606.61/chromedriver] found in cache
PASSED                                                                                                                                                                                             [ 50%]
tests/test_some.py::test_2 PASSED                                                                                                                                                                  [100%]

=========================================================================================== 2 passed in 5.96s ============================================================================================

P、 我不明白第一条消息里的意思

request.cls.driver = driver

是,所以我把它从例子中剪掉了。

 类似资料:
  • 我的测试结构是 当我收集测试时,我可以看到下面 由于oneTimeSetup1夹具的范围是类,我不确定为什么每个测试函数都在新的浏览器会话中运行。 我们可以有一个单一的Chrome浏览器会话,将执行我的test_one

  • HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须

  • 问题内容: 我需要从指令中的父控制器继承范围。我不一定要离开范围:false。我也不一定要使用孤立的作用域,因为要获得我确实关心的值正确链接(需要在父控制器中考虑很多值),就需要大量的工作。 如果要更新父范围,在我的指令中使用是否有意义? 请检查小提琴 问题答案: 尽管@user1737909已经引用了SO问题来阅读(AngularJS中范围原型/原型继承的细微差别是什么?它将解释该问题并建议各种

  • 我的框架目前只有一个conftest.py文件,其中包含一个名为浏览器的夹具,它将webDrive对象返回给测试。我们最近尝试在_generate_configuration_中实现metafunc.parametrize,以便在浏览器堆栈上测试跨浏览器和跨平台,但遇到了一个问题。当浏览器夹具在用户界面测试开始时被调用时,它不知道基于metafunc.parametrize方法的测试在当前浏览器/

  • 我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会