亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 PyTest 捕獲測試用例失敗的屏幕截圖

如何使用 PyTest 捕獲測試用例失敗的屏幕截圖

一只斗牛犬 2022-07-26 16:36:56
目前,我正在使用以下解決方案在 PyTest 的每個測試函數結束時截取屏幕截圖。如何確保僅在測試失敗時才截取屏幕截圖?這是一個關于 PyTest 機制的問題。這個問題與硒或 appium 無關。我在 Stackoverflow 上發現了類似的問題,但并不完全相同。為其他問題提供的解決方案無法回答我的問題。由于使用 PyTest 對測試失敗進行截圖是一個常見問題,我相信它應該得到一個單獨且非常具體的答案。@pytest.fixture(scope="function", autouse=True)def take_screenshot(self, appium_driver):    yield    time.sleep(1)    current_filename_clean = os.path.basename(__file__).replace("test_", "").replace(".py", "")    current_test_name = os.environ.get("PYTEST_CURRENT_TEST").split(":")[-1].split(" ")[0].replace("test_", "")    appium_driver.get_screenshot_as_file(        f'test_reports/{current_filename_clean}_android_{current_test_name}_{datetime.today().strftime("%Y-%m-%d")}.png')
查看完整描述

2 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

conftest.py這是在 docker 容器中無頭運行文件的完整解決方案:


import time

from datetime import datetime    

import pytest

import os

from selenium import webdriver as selenium_webdriver

from selenium.webdriver.chrome.options import Options


# set up webdriver fixture

@pytest.fixture(scope='session')

def selenium_driver(request):

    chrome_options = Options()

    chrome_options.add_argument('--headless')

    chrome_options.add_argument('--no-sandbox')

    chrome_options.add_argument('--disable-dev-shm-usage')


    driver = selenium_webdriver.Chrome(options=chrome_options)

    driver.set_window_size(1920, 1080)

    driver.maximize_window()

    driver.implicitly_wait(5)


    yield driver

    driver.quit()


# set up a hook to be able to check if a test has failed

@pytest.hookimpl(tryfirst=True, hookwrapper=True)

def pytest_runtest_makereport(item, call):

    # execute all other hooks to obtain the report object

    outcome = yield

    rep = outcome.get_result()


    # set a report attribute for each phase of a call, which can

    # be "setup", "call", "teardown"


    setattr(item, "rep_" + rep.when, rep)


# check if a test has failed

@pytest.fixture(scope="function", autouse=True)

def test_failed_check(request):

    yield

    # request.node is an "item" because we use the default

    # "function" scope

    if request.node.rep_setup.failed:

        print("setting up a test failed!", request.node.nodeid)

    elif request.node.rep_setup.passed:

        if request.node.rep_call.failed:

            driver = request.node.funcargs['selenium_driver']

            take_screenshot(driver, request.node.nodeid)

            print("executing test failed", request.node.nodeid)


# make a screenshot with a name of the test, date and time

def take_screenshot(driver, nodeid):

    time.sleep(1)

    file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H:%M")}.png'.replace("/","_").replace("::","__")

    driver.save_screenshot(file_name)


查看完整回答
反對 回復 2022-07-26
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

還有另一種方法,類似于@Ostap 的方法:使用pytest_runtest_makereport(文檔、API 參考)后處理功能。簡單一點:


@pytest.hookimpl(tryfirst=True, hookwrapper=True)

def pytest_runtest_makereport(item, call):

    outcome = yield

    rep = outcome.get_result()

    if rep.when == 'call' and rep.failed:

        now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')

        driver.save_screenshot(f".\\Screenshots\\fail_{now}.png")


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號