很多時候,我們進行元素定位時無法按預期成功定位到元素,但是我們的**又確保準確無誤,那是什麼原因呢?
其實,原因很簡單,大致分為2種:
1,所定位的元素在frame/iframe中
2,未設定合理的等待
為什麼未設定合理等待的時候,很有可能無法正確定位元素呢?
我們知道,**的執行速度很快很快,但瀏覽器的渲染速度卻相對慢了很多,這就容易導致**執行完後還未渲染或載入成功過,從而導致無法成功定位元素。
等待分為3種:
1,強制等待
2,隱式等待
3,顯示等待
1,強制等待
強制等待是最為粗暴的一種等待方式,此等待方式不管定位結果如何都會一直等待,直到等待時長結束。此種等待方式會導致程式**中斷,當等待時間結束
後才會繼續往下執行。
所以,此種等待方式往往會拉低程式執行效率,拉長了測試時長。
在python種,強制等待用sleep()方法,使用此方法需匯入time(import)模組或time模組中的sleep()方法(from time import sleep)。
from selenium importwebdriver
from selenium.webdriver.common.by import
byfrom time import
sleep
driver =webdriver.firefox()
driver.get(
"")sleep(3)
driver.find_element(by.id, 'kw
').send_keys("
python")
driver.find_element(by.id, 'su
').click()
sleep(3)
driver.quit()
2,隱式等待:implicitly_wait(xx)
隱私等待會在等待時長內等待整個頁面的載入完成,如果在等待時長內頁面載入完成,則進行下一步。否則會一直等待頁面載入完成,直到達到等待時長。
隱式等待的乙個明顯弊端:一定會等到頁面載入完成後才會執行下一步,即使可能元素已經被找到了。
注意:隱性等待對整個driver的週期都起作用,所以只要設定一次即可。
from selenium importwebdriver
from selenium.webdriver.common.by import
bydriver =webdriver.firefox()
driver.get(
"")driver.implicitly_wait(10)
driver.find_element(by.id, "kw
").send_keys("
python")
driver.find_element(by.id, 'su
').click()
既然,隱式等待也可能會導致我們的程式執行速度變慢,那有沒有更好的等待方式呢?當然,顯示等待就可以。
3,顯示等待:webdriverwait,配合該類的until()和until_not()方法
顯示等待會在一定的時間頻率上來檢視是否定位到了元素,若找到了元素則進行下一步。若未找到,則超時後丟擲異常:timeoutexception
webdriverwait類需要匯入:from selenium.webdriver.support.wait import webdriverwait
webdriverwait()物件需3個引數:driver, timeout,poll_frequency=poll_frequency。
其中:driver為瀏覽器驅動,timeout為超時時間,poll_frequency為查詢頻率。
ec為exceped_conditions模組(縮寫)呼叫presence_of_element_located()來判斷元素是否已經在頁面的dom中(不需要元素在頁面是
可見的),在則返回webelement物件。
from selenium importwebdriver
from selenium.webdriver.common.by import
byfrom selenium.webdriver.support.wait import
webdriverwait
from selenium.webdriver.support import
expected_conditions as ec
driver =webdriver.firefox()
driver.get(
"")ele = webdriverwait(driver, 10, 0.5).until(ec.presence_of_element_located((by.id, 'kw'
)))ele.send_keys(
"python
")
重點:理解並熟練使用顯示等待,並對涉及到的webdriverwait類,excepted_conditions模組理解充分。
在webui自動化中,會對元素的定位進行二次封裝,而通常元素的定位就會用到顯示等待,並結合try...except來捕獲異常。
Selenium 三種等待方式詳解
我們在做web自動化時,一般要等待頁面元素載入完成後,才能執行操作,否則會報找不到元素的錯誤,這樣就要求我們在有些場景下加等待時間。我們平常用到的有三種等待方式 利用time模組的sleep方法來實現,最簡單粗暴的等待方法 coding utf 8 from time import sleep fr...
selenium 延遲等待的三種方式
1 最直接普通的方式 這個是設定固定的等待時間 thread.sleep 1000 2 顯示等待方式 explicit wait 就是明確的要等待的元素在規定的時間之內都沒找到,那麼就丟擲exception.示例如下 public loginpage loginexpectingfailure 這樣...
selenium的三種等待
1 強制等待 不管頁面是否載入出來,強制讓進城等待。2 隱式等待 driver.implicitly wait 20 3 顯示等待 滿足一些內建的等待條件,這要這些條件滿足,就等待結束。這些條件比如 特定頁面元素載入出來。建立顯示等待的步驟 導包from selenium.webdriver.sup...