之前的做法
之前的做法是通过在basepage中封装一个失败截图保存到allure报告中
的方法,如下
然后使用时,通过try...except 手动判断是否发生了断言异常,发生了则调用该方法
现在做法:通过在conftest设置钩子函数,自动获取每个用例失败结果,自动截图到allure
conftest文件中的内容
import os
import pytest
import allure
from selenium import webdriver
# 设置全局变量的原因是因为,pytest_runtest_makereport方法中要用到,而我们创建的driver是在方法里面,因此设置全局变量,两方都可解决
driver = None
# 设置全局的原因是,想只开一次浏览器,完成所有用例的执行;如果不想设置全局,则if driver is None这行代码要去掉,否则存在问题
@pytest.fixture(scope='session')
def browser():
global driver
# 只打开一次浏览器,完成所有用例的操作
if driver is None:
driver = webdriver.Chrome()
yield driver
driver.quit()
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
print('------------------------------------')
# 获取钩子方法的调用结果
outcome = yield
rep = outcome.get_result()
# 仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
if rep.when == "call" and rep.failed:
# 添加allure报告截图
# 如果当前webdriverr版本中有该方法,则使用
if hasattr(driver, "get_screenshot_as_png"):
with allure.step('添加失败截图...'):
allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)
用例中的内容
import pytest
from selenium import webdriver
lis = ['百度4下','百度一下','百度N下']
@pytest.mark.parametrize('data', lis)
def test_screen(browser,data):
driver = browser
driver.get("http://www.baidu.com")
text_value = driver.find_element("id", "su").get_attribute('value')
assert text_value == data
效果如下