首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次py.test断言失败时调用方法?

如何在每次py.test断言失败时调用方法?
EN

Stack Overflow用户
提问于 2016-05-20 15:44:31
回答 3查看 1.9K关注 0票数 5

背景:

我正在使用py.test和pytest-selenium,现在我想在断言失败时截取页面截图。

目前,我已经在我的基本页面对象类中定义了小帮助器方法:

代码语言:javascript
复制
class PageBase(object):
    def __init__(self,driver):
        self.driver = driver
        self.fake = Factory.create()

    def screenshot(self,name):
        self.driver.save_screenshot(datetime.now().strftime('%Y-%m-%d %H:%M:%S') + 'scr_'+name+'.png')

    @contextmanager
    def wait_for_page_load(self, timeout=45):
        old_page = self.driver.find_element_by_tag_name('html')
        yield
        WebDriverWait(self.driver, timeout).until(
            EC.staleness_of(old_page)
        )

问题是,我想让它成为自动机制而不是“手动”用法:(测试类示例):

代码语言:javascript
复制
class TestLogin:
    @allure.feature('Ability to login into admin panel')
    def test_admin_login(self, prepare, page):

        print URLMap.admin('test')
        driver = prepare
        driver.get(URLMap.admin(page))

        login_page = LoginPage(driver)
        assert login_page.is_page_correct(),'Login page not loaded correctly'

        login_page.fill_login_data('testadmin','testadmin')
        login_page.click_login_button()
        assert login_page.is_user_logged_in(),'User cannot log in with provided credentials'
        login_page.screenshot(page+'_logged_in')

如何针对每个断言失败运行特定的方法?

EN

回答 3

Stack Overflow用户

发布于 2016-05-27 17:36:33

票数 0
EN

Stack Overflow用户

发布于 2019-02-01 12:14:26

你必须使用钩子。https://docs.pytest.org/en/latest/example/simple.html#post-process-test-reports-failures

代码语言:javascript
复制
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()
    setattr(item, "rep_" + rep.when, rep)
    return rep

@pytest.fixture(autouse=True, scope='session')
def driver(platform, request):
    """ some driver setup code """
    yield driver

    if request.node.rep_call.failed:
        try:
            driver.get_screenshot_as_png()
        except:
            pass

    driver.quit()

如果您想附加一个屏幕截图来吸引报告,只需执行以下操作:

代码语言:javascript
复制
@pytest.fixture(autouse=True, scope='session')
def driver(platform, request):
    """ some driver setup code """
    yield driver

    if request.node.rep_call.failed:
        # Make the screen-shot if test failed:
        try:
            allure.attach(
                driver.get_screenshot_as_png(),
                name=request.function.__name__,
                attachment_type=allure.attachment_type.PNG)
        except: 
            """ do something """

        driver.quit()
票数 0
EN

Stack Overflow用户

发布于 2016-05-20 16:10:17

我认为screenShotInSelenium页面应该为您提供足够的信息,告诉您在满足断言条件时如何创建屏幕截图。

您缺少的是@AfterMethod的使用

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37340865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档