Selenium之等待機制

2022-07-18 09:36:12 字數 3930 閱讀 1075

當進行自動化測試的時候:

from selenium import

webdriver

driver =webdriver.chrome()

driver.get(

"")driver.find_element_by_id("kw

").send_keys("

聽雨危樓-cnblogs")

driver.find_element_by_id("su

").click()

#import time

#time.sleep(3)

driver.find_element_by_link_text("

聽雨危樓 -

").click()

driver.quit()

上述**如果不睡幾秒的話,很可能會報如下報錯:

selenium.common.exceptions.nosuchelementexception

沒有找到標籤元素,當然,可能原因是找錯了標籤,但很可能是這個標籤由於網速等原因遲遲沒有載入出來,你就直接獲取這個標籤,很明顯是報錯,現有的簡單粗暴的解決辦法就是time.sleep(3),睡幾秒,也就是設定執行緒等待,等這個標籤載入出來之後,再去使用。這麼著雖然簡單,但是相對死板,因為我們不知道這個標籤什麼時候載入出來,就大概寫死睡個幾秒,這可以,但如果這個標籤在極短的時間內就載入出來了,而你還在睡.......

所以,可以使用selenium提供的兩種等待機制:

先來看顯式等待機制。

上面程式解決報錯使用了time模組完成,現在,使用selenium的等待機制來完成:

from selenium import

webdriver

from selenium.webdriver.support import

expected_conditions as ec

from selenium.webdriver.support.ui import

webdriverwait

from selenium.webdriver.common.by import

bydriver =webdriver.chrome()

driver.get(

"")driver.find_element_by_id("kw

").send_keys("

聽雨危樓-cnblogs")

driver.find_element_by_id("su

").click()

#driver.find_element_by_link_text("聽雨危樓 - ").click()

#沒錯,就是下面這行**

webdriverwait(driver, 10, 0.5).until(ec.presence_of_element_located((by.link_text, '

聽雨危樓 -

'))).click()

driver.quit()

selenium提供了webdriverwait類實現等待機制。該類接收4個引數來指定等待機制。

from selenium import

webdriver

from selenium.webdriver.support.ui import

webdriverwait

driver =webdriver.chrome()

webdriverwait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=none)

各引數:

webdriverwait類提供了兩個方法來完成等待機制:

上面用到的method驅動程式為expected_conditions重新命名後的ec,並呼叫其presence_of_element_located方法判斷指定元素是否存在。

expected_conditions模組提供了各種判斷:

顯式等待的另一種寫法,首先例項化乙個顯式等待物件,這樣可以在各個地方靈活的呼叫:

from selenium import

webdriver

from selenium.webdriver.support import

expected_conditions as ec

from selenium.webdriver.support.ui import

webdriverwait

from selenium.webdriver.common.by import

bydriver =webdriver.chrome()

wait = webdriverwait(driver, 10, 0.5) #

首先例項化乙個定製好等待機制的等待物件

driver.get("

")driver.find_element_by_id("kw

").send_keys("

聽雨危樓-cnblogs")

driver.find_element_by_id("su

").click()

#webdriverwait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=none).until(ec.presence_of_element_located((by.link_text, '聽雨危樓 - '))).click()

wait.until(ec.presence_of_element_located((by.link_text, '

聽雨危樓 -

'))).click()

driver.quit()

一般的,推薦上述這種方式,比較靈活嘛。

與顯式等待不同的是,隱式等待我們可以直接通過瀏覽器驅動物件呼叫,並且用法也相對簡單:

from selenium import

webdriver

driver =webdriver.chrome()

driver.implicitly_wait(time_to_wait=10) #

只需要乙個等待超時時間引數

driver.get("

")driver.find_element_by_id("kw

").send_keys("

聽雨危樓-cnblogs")

driver.find_element_by_id("su

").click()

driver.find_element_by_link_text(

'聽雨危樓 -

').click()

driver.quit()

implicitly_wait等待時間單位為秒,如上例所示,指定了10秒。需要注意的是,隱式與顯式等待有明顯的區別,隱式等待應用於全域性,每當使用driver驅動找某個元素時,隱式等待機制就會被觸發(導致測試速度變慢),如果元素存在,則繼續執行,否則,它將以輪詢的方式判斷元素是否定位成功,直至等待超時,丟擲錯誤nosuchelementexception。而顯式等待則只是指定某(些)個元素是否存在時執行。

最後,使用python提供的休眠機制(也就是time模組啦),這沒啥可說的,睡就完了,想在哪等就在哪等.......

import

time

time.sleep(1)

在等待機制的選擇上,我們可以在三種等待機制中靈活選擇:

see also:python selenium expected_conditions使用例項 | implicitly_wait()隱式等待

selenium等待機制

因為你要查詢的標籤由於網速等原因遲遲沒有載入出來,你就直接獲取這個標籤,很明顯是報錯,現有的簡單粗暴的解決辦法就是time.sleep 3 睡幾秒,也就是設定執行緒等待,等這個標籤載入出來之後,再去使用。這麼著雖然簡單,但是相對死板,因為我們不知道這個標籤什麼時候載入出來,就大概寫死睡個幾秒,這可以...

WebDriver元素等待機制

能否構建健壯和可靠的測試是ui自動化測試能否成功的關鍵因素之一。但實際情況是當乙個測試接著乙個測試執行的時候,常會遇到各種不同的狀況。比如指令碼去定位元素或去驗證程式的執行狀態時,有時會發現找不到元素,這可能是由於突然的資源受限或網路延遲等引起響應速度太慢所導致,這時會返回測試失敗的結果。so我們需...

09 元素等待機制

隱式等待相當於在webdriver級別的顯式等待 因為隱式等待一旦找到就會返回結果,而返回結果到指令碼,再接收到下一條操作剛才找到的元素的命令需要一段時間。這段時間可能頁面已經因為載入後續內容而發生了變化,之前找到的元素也受到了影響,於是操作元素的命令就無法正常執行了。因為隱式等待只要能定位到元素就...