Selenium是很是流行的Web自動化測試工具。它具備自動化測試用例製做簡單,支持多種瀏覽器和不一樣的操做系統等優勢。python
有不少時候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提供的等待頁面元素加載的方法:函數
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」。
參考文獻:
《高效團隊開發工具與方法》 池田尚史,藤倉和明,井上史彰 著