Selenium 遇到錯誤時的處理(ScreenShot)

Selenium 遇到錯誤時的處理 (ScreenShot)

Selenium 因為是模擬人對於 Browser 進行操作,

因此很多情況下,會因為時間的關係或是網頁下載的速度,

導致該網頁的網站元件找不到(NoSuchElementException)

這篇文章主要說明,當遇到這種狀況的時候,如何讓 Selenium可以根據當下的網頁狀態 Take ScreenShot,

方便讓我們事後分析為什麼該自動化測試失敗的主要原因。

錯誤發生時的處理

這裡主要運用  try ….except Exception的小技巧,當錯誤發生的時候,職協 exception那段程式。

try:……

except Exception:
   raise

擷取畫面

Selenium Web Driver 提供這個函數 save_screenshot ,只要給予檔名,就可以針對當下的畫面擷取,並且儲存。預設會儲存在與該執行 python script 相同路徑下。


driver.save_screenshot(file_name)

利用時間命名檔名

為了避免檔名重複被蓋掉,這邊用一個小技巧,使用 timestamp 加入作為檔名的一部分。

import datetime, time
...
...
st = datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d_%H%M%S')
file_name = "ScreenShot_on_Fail" + st + ".png"

程式碼範例

from selenium import webdriver
import datetime, time, unittest

class ScreenShotTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.get("http://www.google.com")


    def test_screen_shot(self):
        driver = self.driver
        try:
            # Visit Google page and locate the Search button
            googleSearchbtn = driver.find_element_by_name("btnK")
            # Get the Search butoon value "Google Search"
            self.assertEqual("Google Search", googleSearchbtn.get_attribute("value"))

            # try to get another web element not exist
            googleSearchbtn2 = driver.find_element_by_name("btnK2")


        except Exception:
            st = datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d_%H%M%S')
            file_name = "main_page_missing_button" + st + ".png"
            driver.save_screenshot(file_name)
            raise

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main(verbosity=2)
Selenium Screenshot Taken on Fail

Leave a Reply

Your email address will not be published.