Python+Selenium自動化-設置等待三種等待方法

Python+Selenium自動化-設置等待三種等待方法

 

若是遇到使用ajax加載的網頁,頁面元素可能不是同時加載出來的,這個時候,就須要咱們經過設置一個等待條件,等待頁面元素加載完成,避免出現由於元素未加載致使的錯誤的出現。web

WebDriver提供了兩種等待類型:顯示等待、隱式等待。ajax

1.顯示等待:WebDriverWait()類

  • 顯示等待:設置一個等待時間和一個條件,在規定時間內,每隔一段時間查看下條件是否成立,若是成立那麼程序就繼續執行,不然就提示一個超時異常(TimeoutException)。
  • 一般狀況下WebDriverWait類會結合ExpectedCondition類一塊兒使用。
實例:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 設置瀏覽器:driver 等待時間:20s
wait = WebDriverWait(driver, 20)
# 設置判斷條件:等待id='kw'的元素加載完成
input_box = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
# 在關鍵詞輸入:關鍵詞
input_box.send_keys('關鍵詞')
WebDriverWait的具體參數和方法:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
    driver: 瀏覽器驅動
    timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
    poll_frequency: 每次檢測的間隔時間,默認是0.5秒
    ignored_exceptions:超時後的異常信息,默認狀況下拋出NoSuchElementException異常


until(method,message='')
    method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False
    message: 若是超時,拋出TimeoutException,將message傳入異常


until_not(method,message='')
    until_not 與until相反,until是當某元素出現或什麼條件成立則繼續執行,
    until_not是當某元素消失或什麼條件不成立則繼續執行,參數也相同。
    method
    message
ExpectedCondition
  • ExpectedCondition中可以使用的判斷條件:
from selenium.webdriver.support import expected_conditions as EC
 # 判斷標題是否和預期的一致
title_is
# 判斷標題中是否包含預期的字符串
title_contains
 # 判斷指定元素是否加載出來
presence_of_element_located
# 判斷全部元素是否加載完成
presence_of_all_elements_located
 # 判斷某個元素是否可見. 可見表明元素非隱藏,而且元素的寬和高都不等於0,傳入參數是元組類型的locator
visibility_of_element_located
# 判斷元素是否可見,傳入參數是定位後的元素WebElement
visibility_of
# 判斷某個元素是否不可見,或是否不存在於DOM樹
invisibility_of_element_located
 # 判斷元素的 text 是否包含預期字符串
text_to_be_present_in_element
# 判斷元素的 value 是否包含預期字符串
text_to_be_present_in_element_value
 #判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
 #判斷是否有alert出現
alert_is_present
 #判斷元素是否可點擊
element_to_be_clickable
 # 判斷元素是否被選中,通常用在下拉列表,傳入WebElement對象
element_to_be_selected
# 判斷元素是否被選中
element_located_to_be_selected
# 判斷元素的選中狀態是否和預期一致,傳入參數:定位後的元素,相等返回True,不然返回False
element_selection_state_to_be
# 判斷元素的選中狀態是否和預期一致,傳入參數:元素的定位,相等返回True,不然返回False
element_located_selection_state_to_be
 #判斷一個元素是否仍在DOM中,傳入WebElement對象,能夠判斷頁面是否刷新了
staleness_of
調用方法以下:
WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)

2.隱式等待

  • implicitly_wait(xx):設置等待時間爲xx秒,等待元素加載完成,若是到了時間元素沒有加載出,就拋出一個NoSuchElementException的錯誤。
  • 注意:隱性等待對整個driver的週期都起做用,因此只要設置一次便可。
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(30)  # 隱性等待,最長等30秒

driver.get('https://www.baidu.com')

print(driver.current_url)
print(driver.title)

3.強制等待:sleep()

  • 強制等待:無論瀏覽器元素是否加載完成,程序都得等待3秒,3秒一到,繼續執行下面的代碼。
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

sleep(3)  # 強制等待3秒再執行下一步

print(driver.title)
相關文章
相關標籤/搜索