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" |
程式碼範例
[pastacode lang=”python” message=”Selenium Screenshot Taken on Fail” highlight=”” provider=”manual”]
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)
[/pastacode]