Python + Selenium(十九)截圖

UI 自動化中截圖必不可少,截圖可以展現測試過程 ,也可以檢查錯誤情況。甚至在某種情況下還可以通過截圖對比來判斷程序的正確性。

自動化測試過程中 ,需要截圖有以下幾個用途:

  • 記錄測試過程
  • 腳本發生異常或者失敗情況時截圖
  • 部分頁面需要截圖對比斷言
  • 獲取驗證碼圖片用於驗證碼識別
  • 其他需要記錄的情況

Selenium 中提供的截圖有兩種截圖方式。一種是截取當前瀏覽器窗口,第二種是截取可見元素。

截取當前窗口

截取當前瀏覽器窗口的截圖方法由 WebDriver 提供:

  1. 截圖保存爲文件
driver.save_screenshot(".\screenshot.png")
driver.get_screenshot_as_file(".\screenshot.png") 

上面兩個方法的結果一樣,通過參數指定保存的文件位置,可以是相對路徑也可以是絕對路徑。最後截取圖片並保存。

注意,必須保存爲 png 格式的圖片。

  1. 截圖保存爲二進制數據
png = driver.get_screenshot_as_png()

該方法返回二進制數據,保存於內存中,可以寫入圖片。

  1. 截圖保存爲 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》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章