Pytest+Allure+Selenium 实现失败用例自动截图

前言

好久都没有更新我的博客了,最近由于项目组变更,原来的项目的自动化工作停止了,我本人感到非常的遗憾和失落,毕竟这个自动化项目是我从零到一搭建起来的,我本人也是首次接触Web自动化测试,遇到不少坑,也是一路学习过来了,还是决定写一点东西记录一下吧。

Pytest如何实现失败用例自动截图

要实现这个功能具体使用到了pytest中的pytest_runtest_makereport函数,该函数会在pytest生成测试报告的时候被调用,通过重写改方法加入截图功能,具体到代码如下:

def _fail_picture():    
    driver.fail_picture()    

#失败用例自动截图函数
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    '''
    hook pytest失败
    :param item:
    :param call:
    :return:
    '''
    # execute all other hooks to obtain the report object
    outcome = yield
    rep = outcome.get_result()
    # we only look at actual failing test calls, not setup/teardown
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            # let's also access a fixture for the fun of it
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        _fail_picture()
    

其中,_fail_picture 函数为截图函数,调用get_screenshot_as_file函数 ,get_screenshot_as_file函数封装的是具体的webdriver截图功能实现。

    def fail_picture(self):
        f = self.get_screenshot_as_file()
        self.log.debug('失败用例截图:{filename}'.format(filename=f))
        allure.attach.file(f, '失败用例截图:{filename}'.format(filename=f), 	allure.attachment_type.PNG)
    def get_screenshot_as_file(self):
        '''在本地截图函数'''
        try:
            pic_pth = self.conf.pic_path
            filename = pic_pth + str(time.time()).split('.')[0] + '.png'
            filename = filename.replace('\\', '/')
            self.webdriver.get_screenshot_as_file(filename)
            self.log.debug('get_screenshot_as_file {filename}'.format(filename=filename))
            return filename
        except Exception as e:
            self.log.error(e)
            return None

最后在confest.py文件中初始化用例即可:

//confest.py

driver = None
#  module confest
#初始化用例
@pytest.fixture(scope='module', autouse=False)
def Sys_user_manage_page():     
    print('初始化用例')
    global driver
    if driver is None:
        driver = Sys_user_manage('Chrome')      
        driver.login('superadmin', '123456')
    yield driver    
    print('结束用例')
    driver.close_Browser()  
    driver = None
  
# confest.py中定义截图函数
def _fail_picture():    
    driver.fail_picture()   

# 编写钩子函数
#失败用例自动截图函数
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    '''
    hook pytest失败
    :param item:
    :param call:
    :return:
    '''
    # execute all other hooks to obtain the report object
    outcome = yield
    rep = outcome.get_result()
    # we only look at actual failing test calls, not setup/teardown
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            # let's also access a fixture for the fun of it
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        _fail_picture()  #调用截图函数


由于我代码中的driver是封装过的,可能有些读者看不懂,请参考微博:
https://www.cnblogs.com/guo2733/p/10525755.html
这里需要注意的是因为不同的博主使用的报告插件不同(我用的事allure,有些可能用htmlout),造成pytest_runtest_makereport 具体实现有些差异。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
作为AI语言模型,我无法在计算机上执行任何操作,因此无法提供pytest allure用例执行失败截图。但是,以下是如何在使用pytest allure自动截取用例执行失败截图的示例代码: ```python import allure import pytest from selenium import webdriver @pytest.fixture(scope="function") def browser(): driver = webdriver.Chrome() yield driver driver.quit() @allure.step("Open website '{url}'") def open_website(browser, url): browser.get(url) @allure.step("Click on element '{locator}'") def click_element(browser, locator): element = browser.find_element(*locator) element.click() @allure.step("Verify element '{locator}' is present") def verify_element_present(browser, locator): assert browser.find_element(*locator).is_displayed() @allure.step("Enter text '{text}' into element '{locator}'") def enter_text(browser, locator, text): element = browser.find_element(*locator) element.send_keys(text) @allure.step("Verify text '{text}' is present in element '{locator}'") def verify_text_present(browser, locator, text): assert text in browser.find_element(*locator).text def test_login_failure(browser): with allure.step("Given the user is on the login page"): open_website(browser, "https://www.example.com/login") with allure.step("When the user enters invalid credentials"): enter_text(browser, (By.ID, "username"), "invalid_username") enter_text(browser, (By.ID, "password"), "invalid_password") click_element(browser, (By.NAME, "login_button")) with allure.step("Then an error message is displayed"): verify_element_present(browser, (By.CSS_SELECTOR, ".error_message")) verify_text_present(browser, (By.CSS_SELECTOR, ".error_message"), "Invalid username or password") # Take screenshot on failure allure.attach( browser.get_screenshot_as_png(), name="Screenshot", attachment_type=allure.attachment_type.PNG, ) ``` 在测试用例失败时,pytest allure自动捕获失败截图并将其添加到测试报告中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

To be TestHacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值