UI 自動化中截圖必不可少,截圖可以展現測試過程 ,也可以檢查錯誤情況。甚至在某種情況下還可以通過截圖對比來判斷程序的正確性。
自動化測試過程中 ,需要截圖有以下幾個用途:
- 記錄測試過程
- 腳本發生異常或者失敗情況時截圖
- 部分頁面需要截圖對比斷言
- 獲取驗證碼圖片用於驗證碼識別
- 其他需要記錄的情況
Selenium 中提供的截圖有兩種截圖方式。一種是截取當前瀏覽器窗口,第二種是截取可見元素。
截取當前窗口
截取當前瀏覽器窗口的截圖方法由 WebDriver 提供:
- 截圖保存爲文件
driver.save_screenshot(".\screenshot.png")
driver.get_screenshot_as_file(".\screenshot.png")
上面兩個方法的結果一樣,通過參數指定保存的文件位置,可以是相對路徑也可以是絕對路徑。最後截取圖片並保存。
注意,必須保存爲 png 格式的圖片。
- 截圖保存爲二進制數據
png = driver.get_screenshot_as_png()
該方法返回二進制數據,保存於內存中,可以寫入圖片。
- 截圖保存爲 base64 位字符串
img = get_screenshot_as_base64()
該方法是將截圖後的圖像信息保存爲 base64 位格式的字符串。可以直接寫入 HTML 頁面中。
以下例子,將圖像直接寫入 HTML 頁面中。可以用於將圖像放入測試報告。
from selenium import webdriver
driver.get("http://www.baidu.com")
img = driver.get_screenshot_as_base64()
string = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>圖像演示</title>
</head>
<body>
<div id="img">
<img src="data:image/png;base64,%s"> <!-- <= 替換到這裏-->
</div>
</body>
</html>
""" % img
with open('t1.html', 'w', encoding='utf-8') as f:
f.write(string)
注意:
窗口截取時,只會截取當前能看到的窗口,如果看不到的部分是不會截圖的。
如果需要將未顯示的元素顯示到當前窗口再截取,請使用指定元素的location_once_scrolled_into_view
將元素滾動到窗口可見範圍。具體參考《元素對象操作》。
截取頁面元素
元素對象 WebElement 也具有上面提到的幾種截圖方式,只是上面針對的是整個瀏覽器窗口,而元素對象的截圖針對的是具體的某個元素,值會截取到元素。
from selenium import webdriver
driver.get("http://www.baidu.com")
driver.find_element_by_id('su').screenshot('百度.png')
截取的圖像如下:
只包含元素的截圖。比如要做驗證碼處理的時候,可以通過此方式獲取驗證碼圖片。
比如 [showdoc] 網站的驗證碼:
driver.find_element_by_class_name('v_code_img').screenshot('驗證碼.png')
獲取到的圖片結果如下:
然後嘗試去識別吧,😁
同樣,元素對象也支持另外兩種截圖,返回二進制或者 base64 格式。
driver.find_element_by_id('su').screenshot_as_png() # => 保存爲二進制格式
driver.find_element_by_id('su').screenshot_as_base64() # => 保存爲 base64
base64: Base64 是一種用64個字符來表示任意二進制數據的方法。
用記事本打開exe、jpg、pdf這些文件時,我們都會看到一大堆亂碼,因爲二進制文件包含很多無法顯示和打印的字符,所以,如果要讓記事本這樣的文本處理軟件能處理二進制數據,就需要一個二進制到字符串的轉換方法。Base64是一種最常見的二進制編碼方法。
– 參考自廖雪峯網站《base64》