17、Selenium + Python 實現 UI 自動化測試-等待
原文地址:http://blog.csdn.net/huilan_same/article/details/52544521
作者這篇文章寫的很詳細,很經典,就不再重新寫了。
總結一下:
1、強制等待——sleep(xxx)
不管如何,都等待xxx秒,才繼續執行下面的程式碼。
適合除錯程式碼用。
2、隱性等待——implicitly_wait(xxx)
隱式等待是設定了一個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間截止,然後執行下一步。注意這裡有一個弊端,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步,我想等我要的元素出來之後就下一步怎麼辦?有辦法,這就要看selenium提供的另一種等待方式——顯性等待wait了
3、顯性等待
顯性等待某個元素,元素找到了,即便頁面其它的 js 等檔案載入不完,也執行。顯性等待效果好,但是操作較複雜,一般來說,掌握好前兩種等待方法,就能解決掉大部分的問題。
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get('http://www.baidu.com/') locator = (By.LINK_TEXT,'地圖') try: WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)) driver.find_element_by_link_text('地圖').click() finally: driver.quit()
補充一點:
有這樣一個頁面xxx,開啟後元素a,需要5秒才能加載出來,請問下面的程式碼是否能執行成功?
1、 使用implicitly_wait(20)
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get("xxx") driver.find_element_by_link_text('元素a').click() driver.quit()
2、使用implicitly_wait(20)
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get("xxx") ele = driver.find_element_by_link_text('元素a') ele.click() driver.quit()這個程式碼能執行成功嗎?
第一個程式碼,定位元素,然後點選click
第二個程式碼,先把元素賦值給變數,然後變數使用click方法
程式碼1執行成功
程式碼2執行失敗
分析:
程式碼1:implicitly_wait(20) ,對某個元素執行操作的時候,如果找不到元素就等待,找到了就執行操作,等20秒還找不到才報錯。
程式碼2:賦值語句,不是對元素進行操作,找不到元素,賦值直接失敗,報錯。