使用場景:有時候當我們操作頁面元素時,需要等待這個程序才能操作成功,
做Ui自動化的時候,考慮到穩定性:多次運行同一腳本,都能夠保證它是成功的,
一、強制等待:sleep(秒)
比如sleep(10),就必須等待10秒,才能執行下一步,
簡單粗暴,不過代碼將會有很多sleep,冗余度會提高,
二、智能等待:顯性等待
專門針對特定元素而設定的等待,在規定的時間內找到元素,找到了就執行下一步,
沒有找到拋出例外(TimeoutException),效率高,可以自定義條件,
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(會話物件, 超時時長(秒),去查看條件的周期默認0.5).until(條件)
WebDriverWait(會話物件, 超時時長(秒),去查看條件的周期默認0.5).until_not(條件)
selenium3當中,每一個條件是以類的形式實作的,每一個類都有__init__, __call__
selenium4當中,每一個條件是以函式的形式實作的,每一個函式都有一個_predicate內部函式,閉包
使用顯性等待的時候,先確定你的條件是什么,然后再去使用顯性等待,
等待效果只有一次,不像隱性等待全域可用,
比較多的用法:顯性等待 + 短暫的sleep
常用的條件:
visibility_of_element_located(locator) --- locator對應的元素是可見的
element_to_be_clickable(mark) --- mark對應的元素可點擊
三、智能等待:隱形等待
呼叫find_element/find_elements方法的時候,如果元素沒找到不會立馬報錯,
會主動使用隱性等待,達到最大等待時間后,拋出例外,
一個會話(瀏覽器打開到關閉這個程序)當中,只需要呼叫一次,全域可用,
沒有辦法對精準度的元素進行定位,會影響實際的運行效率,
三種方法一起使用代碼如下:
1 import time 2 from selenium import webdriver 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 6 driver = webdriver.Chrome() 7 driver.get("https://www.baidu.com") 8 #隱形等待 9 driver.implicitly_wait(10) 10 driver.maximize_window() 11 # 顯性等待 12 #每0.5秒掃描一次瀏覽器,總共掃描5秒,直到找到指定的元素為止,如果找到就回傳這個元素,沒有找到就拋出例外,并且提示沒找到元素 13 el = WebDriverWait(driver,5,0.5).until(lambda el:driver.find_element('xpath','//a[text()="hao123"]'),message="沒找到元素") 14 el.click() 15 # 強制等待 16 time.sleep(3) 17 driver.quit()
顯示等待結合預期條件判斷代碼如下:
1 import time 2 from selenium import webdriver 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 6 # driver = webdriver.Chrome() 7 # driver.get("https://www.baidu.com") 8 # #隱形等待 9 # driver.implicitly_wait(10) 10 # driver.maximize_window() 11 # # 顯性等待 12 # #每0.5秒掃描一次瀏覽器,總共掃描5秒,直到找到指定的元素為止,如果找到就回傳這個元素,沒有找到就拋出例外,并且提示沒找到元素 13 # el = WebDriverWait(driver,5,0.5).until(lambda el:driver.find_element('xpath','//a[text()="hao123"]'),message="沒找到元素") 14 # el.click() 15 # # 強制等待 16 # time.sleep(3) 17 # driver.quit() 18 # 19 driver = webdriver.Chrome() 20 driver.maximize_window() 21 driver.get("https://www.baidu.com") 22 23 locator = ('xpath','//a[text()="新聞"]') 24 # WebDriverWait()一般與 until()或 until_not()方法配合使用 25 # until(),直到回傳值為 True, 26 # until_not(),直到回傳值為 Flase, 27 # 判斷元素是否可見 28 # 在設定時間內,默認每隔一段時間檢測一次當前頁面元素是否可見,如果超過設定時間仍檢測不到,則拋出例外, 29 WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located(locator),message="元素可見") 30 # 判斷元素是否可以點擊 31 # 在設定時間內,默認每隔一段時間檢測一次當前頁面元素是否可點擊,如果超過設定時間仍檢測不到,則拋出例外, 32 WebDriverWait(driver,5,0.5).until(EC.element_to_be_clickable(locator)) 33 # 判斷元素是否存在 34 # 在設定時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設定時間仍檢測不到,則拋出例外, 35 WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(locator)) 36 driver.find_element(*locator).click() 37 # 判斷標題是否不存在 38 # 在設定時間內,默認每隔一段時間檢測一次標題是否不存在,如果超過設定時間仍檢測不到,則拋出例外, 39 WebDriverWait(driver,5,0.5).until_not(EC.title_is("123123"),message="標題不是這個") 40 time.sleep(3) 41 driver.quit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/540137.html
標籤:其他
上一篇:滲透實錄-01
