讓Selenium穩定運行的技巧

Selenium簡介

Selenium是很是流行的Web自動化測試工具。它具備自動化測試用例製做簡單,支持多種瀏覽器和不一樣的操做系統等優勢。python

Selenium腳本不穩定的問題

有不少時候Selenium的自動化測試腳本運行並非很穩定。常常會遇到系統明明正常運行,可是測試卻失敗的狀況。例如,點擊上傳圖片按鈕並上傳圖片,若是在上傳加載完成以前就操做下一步,會提示錯誤信息。web

出現問題的緣由多是服務器的響應速度慢,在頁面內容沒有加載完畢的狀態下Selenium就執行了下一條命令,從而致使測試失敗。上面的上傳圖片場景,雖然在上傳圖片後能夠加入固定的等待幾秒鐘的代碼,可是由於上傳圖片的速度並非固定的時間,當服務器的負載較高的時候,上傳圖片的速度變慢,因此形成了測試的失敗。chrome

腳本運行不穩定的解決方法

  • 固定等待時間

上面的問題的解決方法之一就是使用python程序語言的sleep函數,來暫停固定秒數的時間,經過延遲執行下一條命令,多少能有所改善。可是這個方法爲了解決偶爾發生的問題,不得不在測試(用例)腳本中插入不少sleep語句,會形成測試時間的變長,所以並不推薦。瀏覽器

下面是經過python語言來實現固定等待時間的相關代碼:服務器

import time

time.sleep(2) #默認等待2秒
  • 設置隱性等待時間

能夠經過下面代碼來設置selenium內置的智能等待時間,可是在上傳圖片等待的狀況下智能等待沒有生效。網絡

from selenium import webdriver   #導入瀏覽器驅動

browser = webdriver.Chrome("/home/kyle/bin/chromedriver")
browser.implicitly_wait(10)  #設置智能等待10秒
  • 使用selenium提供的WebDriverWait方法

經過下面代碼可使用selenium提供的等待頁面元素加載的方法:函數

from selenium.webdriver.support.wait import WebDriverWait

# 使用selenium提供的WebDriverWait方法,每0.5秒檢查一次定位的元素,超時設置是2秒
WebDriverWait(browser, 2).until(
        lambda driver: driver.find_element_by_tag_name('body'))
  • 更好的解決方法

經過利用python的異常捕獲機制和循環語句,使程序在必定時間內即便selenium執行命令失敗,也會繼續重複執行同一條命令屢次,直到成功爲止。 下面是相關的python程序代碼:工具

import time
from selenium import webdriver   #導入瀏覽器驅動

def smart_wait(self, element_id):  # 智能等待時間,60秒超時
    for i in range(60):            # 循環60次,從0至59
        if i >= 59 :               # 當i大於等於59時,打印提示時間超時
            print("timeout")    
            break
        try:                       # try代碼塊中出現找不到特定元素的異常會執行except中的代碼
            if browser.find_element_by_id(element_id): # 若是能查找到特定的元素id就提早退出循環
                break
        except:                    # 上面try代碼塊中出現異常,except中的代碼會執行打印提示會繼續嘗試查找特定的元素id
            print("wait for find element")
        time.sleep(1)

實例說明

在實際測試工做中,有上傳圖片的場景,上傳圖片的時間和服務器的響應時間以及客戶端網絡情況有關係,因此有時候速度慢,有時候速度快。這種狀況不適合使用固定等待時間的解決方法。能夠經過上面提到的第二種方案來處理,先經過下面代碼開始上傳圖片。開發工具

browser.find_element_by_id(button_id).find_element_by_name("file").send_keys(file_path)
# 注意:上面語句中find_element_by_id(button_id)中button_id爲上傳圖片按鈕的元素id

而後調用上面提到的smart_wait(check_id)函數,傳入參數要查找的元素id,這個參數的id是下面截圖中紅框標記處的id。找到這個元素id證實上傳圖片已經成功,能夠開始下一步操做,若是找不到這個元素id說明上傳圖片尚未完成,還須要繼續等待上傳完成。測試

若是selenium能找到這個元素id證實上傳已經完成,會提早退出循環,繼續執行下一步代碼語句。若是找不到這個元素id就等待1秒以後繼續查找,在默認的60次循環內直到找到爲止。若是直到最後一次循環都沒有找到想要的元素就打印提示信息:「timeout」。

參考文獻:

《高效團隊開發工具與方法》 池田尚史,藤倉和明,井上史彰 著

相關文章
相關標籤/搜索