咱們在作web網站自動化測試的過程當中,會常常遇到web應用程序使用了AJAX技術。當瀏覽器加載頁面的時候,而頁面上的元素還未同時被加載完成,那麼咱們此時進行元素的定位每每會出現錯誤,影響咱們在自動化測試工做進程。這樣在加載某個元素延遲而形成了ElementNotVisibleException的報錯,就會下降自動化腳本的穩定性。如何解決這個問題呢?咱們能夠經過設置元素等待改善這種問題形成的負面影響。咱們能夠描繪成這種場景,程序員和女朋友約好吃西餐,結果程序員在西餐廳吃的美滋滋回來後看到女朋友還在梳妝檯化妝,好奇的問怎麼還在化妝沒有出門呢?女朋友內心頓時無名的火涌上心頭,欺負我慢不和你談對象了,拋個異常跟你分手。程序員
webdriver爲咱們提供了三種等待方法:web
一、強制等待瀏覽器
第一種是辦法簡單粗暴就是強制等待sleep(),強制讓程序員等待xx時間,無論女友能不能來到約會地點,仍是已經提早到了,都必須等待xx時間測試
1 from time import sleep 2 from selenium import webdriver 3 url='https://www.baidu.com/' 4 driver=webdriver.Chrome() 5 driver.get(url) 6 sleep(3) 7 print(driver.current_url) 8 driver.quit()
這種叫強制等待,無論你瀏覽器是否加載完了,程序都得等待3秒,3秒一到,繼續執行下面的代碼,做爲調試頗有用,有時候也能夠在代碼裏這樣等待,不過不建議總用這種等待方式,太死板,嚴重影響程序執行速度。網站
二、隱性等待ui
第二種方法就比強制等待方法較細膩人性化了,implicitly_wait(xx),咱們能夠想象成這樣的場景:程序員和女朋友約定好,不論程序員何時到了約定地點,都必需要等女朋友一家子xx秒,若是女朋友一家子這段時間內來了,好的和女朋友手挽手去西餐廳共進晚餐,可是若是女朋友在規定的時間內沒趕到,則程序員本身去,結果天然就是女朋友發飆給你拋個異常噁心一下。url
1 from selenium import webdriver 2 url='https://www.baidu.com/' 3 driver=webdriver.Chrome() 4 driver.implicitly_wait(20)#隱性等待,最長等待20s 5 driver.get(url) 6 print(driver.current_url) 7 driver.quit()
隱形等待是設置了一個最長等待時間,若是在規定時間內網頁加載完成,則執行下一步,不然一直等到時間截止,而後執行下一步。可是這裏有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是咱們能夠看到瀏覽器標籤欄那個小圈再也不轉,纔會執行下一步,一般頁面想要的元素早就在加載完成了,可是由於個別js之類的東西特別慢,得等到頁面所有完成才能執行下一步,那咱們須要主題元素出現就能夠下一步該如何去作呢,那就要看selenium提供的另外一種等待方式——顯性等待wait了。這裏須要強調的是:隱性等待對整個driver的週期都起做用,因此只要設置一次便可。spa
三、顯性等待調試
第三種方法就是顯性等待,WebDriverWait,配合該類的until()和until_not()方法,就可以根據判斷條件來進行靈活地等待了。它主要的意思是:程序每隔xx秒看如下條件是否知足,若是條件成立了,則執行下一步,不然繼續等待,直到超過設置的最長時間,而後拋出TimeoutException。咱們能夠想象成這樣的場景:程序員和女朋友約定好,不論程序員何時到了約定地點,都必需要等女朋友一家子xx秒,而與第二個場景不一樣的是程序員隔一段時間觀望主體女朋友是否出現,若來了程序員就不須要再等待,直接拉着女朋友手挽手去西餐廳共進晚餐不用管女朋友一家子了。code
1 from selenium import webdriver 2 from selenium.webdriver.support.wait import WebDriverWait 3 from selenium.webdriver.support import expected_conditions as EC 4 from selenium.webdriver.common.by import By 5 url='https://www.baidu.com/' 6 driver = webdriver.Chrome() 7 driver.implicitly_wait(20) # 隱性等待和顯性等待能夠同時用,但要注意:等待的最長時間取二者之中的大者 8 driver.get(url) 9 locator = (By.ID, 'su') 10 try: 11 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) 12 finally: 13 driver.close()
上例中,咱們設置了隱性等待和顯性等待,在其餘操做中,隱性等待起決定性做用,在WebDriverWait..中顯性等待起主要做用,但要注意的是:最長的等待時間取決於二者之間的大者,若是隱性等待時間 > 顯性等待時間,則該句代碼的最長等待時間等於隱性等待時間。