【问题标题】:pytest, initialize webdriver for each test file with teardown quitpytest,使用拆卸退出为每个测试文件初始化 webdriver
【发布时间】:2020-09-03 17:01:52
【问题描述】:

测试模块中的当前部分代码:

def test_01():
    driver.get('https://www.google.com')

测试代码:

import pytest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait


@pytest.fixture(autouse=True)
def browser():
    driver = webdriver.Chrome(executable_path=r"C:\webdrivers\1\chromedriver.exe")
    driver.implicitly_wait(5)
    wait = WebDriverWait(driver, 10)
    driver.maximize_window()
    yield
    driver.quit()

结果:“E NameError: name 'driver' is not defined”

目标结果:在没有类的情况下初始化 webdriver,将 webdriver 设置为每个测试函数的驱动程序,使用它运行函数,并在 conftest 中使用fixtures 后置条件退出。我有很多测试文件,所以我应该做一次。

我也尝试过从夹具返回变量,但据我了解,测试函数仍然需要夹具变量,而且对我来说它看起来不对。例如:fixture - return x, testfunction(fixture): x = fixture.而且它仍然无法与 webdriver\driver 一起使用(或者说我没有弄明白)。

【问题讨论】:

    标签: python testing webdriver pytest fixtures


    【解决方案1】:

    您的测试函数需要将夹具作为参数,这是问题的第一部分。

    例如:

    def test_01(driver):
        driver.get('https://www.google.com')
    

    但是您还没有driver 灯具,只有一个名为browser 的灯具,因此您需要更改灯具的名称:

    @pytest.fixture(autouse=True)
    def driver(request):
       ...
    

    最后,fixture需要返回驱动,这样你就可以使用了。

    @pytest.fixture(autouse=True)
    def driver(request):
        ...
        yield driver
        ...
    

    【讨论】:

    • 非常感谢先生,它有效!你能澄清一下 - 如果我使用自动使用参数,为什么我应该将参数链接到我的测试函数?只是为了了解我和有类似任务的人。
    • 我相信autouse 确保在每次测试之前调用夹具,例如,如果您想在每次测试之前进行一些通用设置。我认为它的目的是主要用于夹具不返回任何东西的地方。如果夹具确实返回了某些东西,那么您的测试需要一种方法来访问返回的东西。有几种方法可以做到这一点: 1. 将结果添加到全局命名空间 2. 将结果作为参数传递给测试 1 是混乱的,我不相信 pytest 会这样做。我认为2 会发生这种情况,因此您的测试需要定义该参数。
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多