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)