pytest+allure使用confgtest.py失败截图

pytest+allure使用confgtest.py失败截图
在写用例时怎么传到setup中?
我知道用例中可以def test(self,browser)就可以直接driver

但是不知道setup中怎么用,想在setup中初始化浏览器,登录,不知道大虾们什么方案解决的,难道直接不用setup跟teardown么

引用 皆我百晓生 小程序回复内容作答:
可以在conftest.py文件中定义一个fixture函数来实现在每个测试用例执行之前进行初始化操作。

例如,可以在conftest.py文件中定义一个fixture函数来初始化浏览器和登录:

import pytest
from selenium import webdriver

@pytest.fixture(scope="session", autouse=True)
def setup(request):
    # 初始化浏览器
    driver = webdriver.Chrome()
    request.cls.driver = driver
    # 进行登录操作
    login(driver)

    def teardown():
        # 关闭浏览器
        driver.quit()

    request.addfinalizer(teardown)

在上述代码中,fixture函数的作用范围是session级别,autouse参数设置为True时,所有的测试用例都会自动使用该fixture函数进行初始化操作。

可以在测试用例类中引用conftest.py中的fixture函数,如下所示:

import pytest

class TestLogin:
    def test_login(self):
        # 可以直接使用初始化后的driver对象
        self.driver.get("http://www.example.com")
        assert self.driver.title == "Example Title"

在上述代码中,测试用例类可以直接使用初始化后的driver对象进行操作。

注意:conftest.py文件必须与测试用例在同一目录下,并且文件名必须为conftest.py。

【以下回答由 GPT 生成】

首先,为了在conftest.py中初始化浏览器并登录,你可以使用fixture实现。fixture可以在conftest.py中定义,然后在测试用例中使用。在fixture中,你可以初始化浏览器并登录,然后将浏览器对象返回给测试用例。

下面是一个示例代码:

# conftest.py

import pytest
from selenium import webdriver

@pytest.fixture(scope="session")
def browser():
    # 初始化浏览器
    driver = webdriver.Chrome()

    # 登录操作
    driver.get("login_page_url")
    # 输入用户名和密码
    driver.find_element_by_id("username").send_keys("your_username")
    driver.find_element_by_id("password").send_keys("your_password")
    driver.find_element_by_id("login_button").click()

    # 返回浏览器对象
    yield driver

    # 在所有测试用例结束后关闭浏览器
    driver.quit()

在上面的代码中,我们定义了一个browserfixturescope参数设置为session表示在整个测试会话中只初始化一次浏览器对象,然后将其返回。在yield语句之后,使用driver.quit()关闭浏览器对象。

接下来,在测试用例中,你就可以直接使用browser了。下面是一个示例测试用例:

# test_example.py

def test_login_success(browser):
    # 使用 browser 对象进行操作
    # ...
    # 登录成功的测试逻辑
    # ...

在上面的测试用例中,我们使用browser作为参数,这样pytest会自动传递browser对象给测试用例。

至于失败截图的问题,你可以使用pytestrequest对象来获取测试用例的执行结果,并在失败时进行截图。修改conftest.py文件如下:

# conftest.py

import pytest
import allure
from selenium import webdriver

@pytest.fixture(scope="session")
def browser(request):
    # 初始化浏览器
    driver = webdriver.Chrome()

    # 登录操作
    driver.get("login_page_url")
    # 输入用户名和密码
    driver.find_element_by_id("username").send_keys("your_username")
    driver.find_element_by_id("password").send_keys("your_password")
    driver.find_element_by_id("login_button").click()

    # 添加失败截图的钩子
    def take_screenshot_when_failure():
        if request.node.rep_call.failed:
            driver.save_screenshot("failure_screenshot.png")
            allure.attach.file("failure_screenshot.png", name="Failure Screenshot", attachment_type=allure.attachment_type.PNG)

    request.addfinalizer(take_screenshot_when_failure)

    # 返回浏览器对象
    yield driver

    # 在所有测试用例结束后关闭浏览器
    driver.quit()

在上面的代码中,我们使用addfinalizer方法将take_screenshot_when_failure方法作为清理函数添加到request对象中。在测试用例执行完成之后,如果测试用例失败,就会执行take_screenshot_when_failure方法。在该方法中,我们通过seleniumsave_screenshot方法保存截图,并使用allureattach.file方法将截图添加到allure报告中。

这样,在每个失败的测试用例结束时,都会自动生成一个失败截图,并在allure报告中显示出来。

希望以上解决方案对你有帮助。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^