Selenium3+python異常后截圖(screenshot)


前言

在執行用例過程中由於是無人值守的,用例運行報錯的時候,我們希望能對當前屏幕截圖,留下證據。

在寫用例的時候,最后一步是斷言,可以把截圖的動作放在斷言這里,那么如何在斷言失敗后截圖呢?

 

一、截圖方法

1.get_screenshot_as_file(self, filename)

--這個方法是獲取當前window的截圖,出現IOError時候返回False,截圖成功返回True。

filename參數是保存文件的路徑。
Usage:
driver.get_screenshot_as_file('/Screenshots/foo.png')

 

2.get_screenshot_as_base64(self)

--這個方法也是獲取屏幕截圖,保存的是base64的編碼格式,在HTML界面輸出截圖的時候,會用到。

比如,想把截圖放到html測試報告里。
Usage:
driver.get_screenshot_as_base64()

 

3.get_screenshot_as_png(self)
--這個是獲取屏幕截圖,保存的是二進制數據,很少用到.
Usage:
driver.get_screenshot_as_png()

 

二、異常后截圖

1.為了能拋異常,把定位登錄按鈕的id換了個錯的id。

2.給圖片命名時候加個時間戳,避免同一個文件名稱被覆蓋掉。

3.文件路徑,這里直接寫的文件名稱,就是跟當前的腳本同一個路徑。如果圖片輸出到其它文件路徑,需要些文件的絕對路徑了。

4.截圖的結果,如果沒截到圖返回False,截圖成功會返回True。

三、selenium實例

1.在unittest框架里寫用例的時候,我們希望在斷言失敗的時候,對當前屏幕截圖。

2.如果加try...except捕獲異常后結果,此時所有的測試用例都是通過的了,會影響測試結果。解決辦法其實很簡單,再把異常拋出來就行了。

3.參考代碼:

# coding:utf-8
from selenium import webdriver import time,unittest from selenium.webdriver.support import expected_conditions as EC class Login(unittest.TestCase): def setUp(self): url_login = "https://passport.cnblogs.com/user/signin" self.driver = webdriver.Firefox() self.driver.get(url_login) def test_01(self): '''前面輸入賬號密碼,讓正確運行到assert這一步,斷言故意設置為False不成功'''
        try: self.driver.find_element_by_id("input1").send_keys(u"李**") self.driver.find_element_by_id("input2").send_keys("xxx") # 登錄id是錯的,定位會拋異常
            self.driver.find_element_by_id("signin").click() # 判斷登錄成功頁面是否有賬號:"李**"
            time.sleep(3) locator = ("id", "lnk_current_user") result = EC.text_to_be_present_in_element(locator,u"李**")(self.driver) self.assertFalse(result) except Exception as msg: print(u"異常原因%s"%msg) # 圖片名稱可以加個時間戳
            nowTime = time.strftime("%Y%m%d.%H.%M.%S") self.driver.get_screenshot_as_file('%s.jpg' % nowTime) raise

    def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()

 整理的代碼:

# -*-coding:utf-8 -*-
import os import inspect from datetime import datetime from functools import wraps """ 此模塊用於屏幕截圖 """
# 獲取截截圖保存的路徑
base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) img_base_path = os.path.join(base_path, 'img') # 截圖
def screenshot(driver, case_name, img_base_path): screenshotPath = os.path.join(img_base_path, case_name) time_now = datetime.now().strftime('%Y%m%d%H%M%S') screen_shot_name = "CheckPoint_NG.png" screen_img = screenshotPath + '_' + time_now + '_' + screen_shot_name # screen_img = os.path.join(screenshotPath, screenshotName)
 driver.get_screenshot_as_file(screen_img) return screen_img # 得到當前類的實例方法名 # 也就是獲得用例的名稱
def get_current_function_name(): return inspect.stack()[1][3] # case 斷言失敗截圖裝飾器
def screenshot_about_case(func): # 保持傳入的case的名稱不被裝飾器所改變
 @wraps(func) # t = func
    def get_screenshot_about_case(self, *args, **kwargs): try: func(self, *args, **kwargs) except Exception as e: # 獲取case_name的名稱
            case_name = '{}_{} invoked'.format(self.__class__.__name__, get_current_function_name()) # 截屏的路徑
            screenshotPath = os.path.join(img_base_path, case_name) # 獲得現在的時間戳
            time_now = datetime.now().strftime('%Y%m%d%H%M%S') # 名字的一部分
            screen_shot_name = "CheckPoint_NG.png"
            # 組裝圖片需要傳入的路徑和推片名稱
            screen_img = screenshotPath + '_' + time_now + '_' + screen_shot_name # 截圖並保存到相應的名稱的路徑
 self.driver.get_screenshot_as_file(screen_img) raise e return get_screenshot_about_case

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM