頁面自動化中,不得不提的元素等待操作,selenium為我們提供了三大等待方式:強制等待、隱性等待和顯性等待
1.強制等待:time.sleep(秒)
如果使用time.sleep(10)表示讓程序死等10秒鍾,無論發生什么都會在10秒后再去執行后續的代碼。
智能等待分為:隱性等待、顯性等待
2.隱式等待:implicitly_wait(20)
全局設置一次(與顯性等待不同)
隱形等待元素不一定是可見的(與顯性等待不同)
智能等待的隱形等待:會話開始之后使用隱形等待,之后整個會話周期內所有的找元素都會調用隱形等待,等待元素可見,等待命令執行,全局都可用
from selenium import webdriver
# 打開谷歌瀏覽器,建立會話。啟動Chromedriver.exe 打開Chrome
driver = webdriver.Chrome()
# 智能等待的隱形等待:會話開始之后使用隱形等待,之后所有的找元素都會調用隱形等待,等待元素可見,等待命令執行
# implicitly_wait(譯:隱婆思類.威特)
driver.implicitly_wait(20)
# 訪問百度首頁
driver.get("http://www.baidu.com")
# 點擊登錄按鈕
driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
# 點擊 用戶名登錄 按鈕
driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
# 關閉瀏覽器
driver.quit()
3.顯性等待:他有非常多的條件
與隱形等待的不同;可以處理很多中情況如:
- 等待元素可見
- 等待元素可用
- 等待新窗口出現
- 等待 url地址=xxx的時候
- 等待 的上限是多少秒,每隔0.5秒去查看條件是否成立
- 明確等到某個條件滿足之后,再去執行下一步操作。
- 程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到等待的元素可見
- 超過設置的最長時間,然后拋出TimeoutException. --- .
- WebDriverWait類:顯性等待類。
- WebDriverWait(driver,等待時長,輪循周期).until()/until_ not()
- expected_ conditions模塊: 提供了-系列期望發生的條件。
什么時候用?
- 當你的操作,引起了頁面的變化,而你接下來要操作變化 的元素的時候,就一定要加等待。
1.使用之前,引入相關的庫
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.by import By
使用方法:
2、確定元素的定位表達式
web_ locator = 'XXXX'
3、調用webdriverWait類設置等待總時長、輪詢周期。並調用期until、until_ not方法。
WebDriverWait(webdriver對象名,等待總時長,輪詢周期),until(判斷條件)
4、使用expected_ conditions對 應的方法來生成判斷條件。
EC.類名((定位方式、定位表達式))
例: EC.presence_ of_ element_ located((By.CSS_ SELECTOR,web locator)))
例:等待百度登陸的彈出框出現,再去操作彈出框。
# 使用之前,引入相關的庫
from selenium.webdriver.support.wait import WebDriverWait # 等待條件
from selenium.webdriver.support import expected_conditions as EC # 等待元素可見的條件
from selenium.webdriver.common.by import By # 定位類型八種定位方式
from selenium import webdriver
# 打開谷歌瀏覽器,建立會話。啟動Chromedriver.exe 打開Chrome
driver = webdriver.Chrome()
# 訪問百度首頁
driver.get("http://www.baidu.com")
# 點擊登錄按鈕
driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
# 等待元素 id=TANGRAM__PSP_10__footerULoginBtn 可見。等待上限是10秒。直到 條件可見
loc = (By.ID, "TANGRAM__PSP_10__footerULoginBtn")
# EC.visibility_of_element_located(loc) # 等待元素可見的條件
# until 直到什么什么
WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located(loc))
# 點擊 用戶名登錄 按鈕
driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
# 關閉瀏覽器
driver.quit()
以下是列舉expected_conditions模塊中常用的條件類:
這兩個條件類驗證title,驗證傳入的參數title是否等於或包含於driver.title
title_is
title_contains
這兩個人條件驗證元素是否出現,傳入的參數都是元組類型的locator,如(By.ID, 'kw')
顧名思義,一個只要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行
presence_of_element_located
presence_of_all_elements_located
這三個條件驗證元素是否可見,前兩個傳入參數是元組類型的locator,第三個傳入WebElement
第一個和第三個其實質是一樣的
visibility_of_element_located
invisibility_of_element_located
visibility_of
這兩個人條件判斷某段文本是否出現在某元素中,一個判斷元素的text,一個判斷元素的value
text_to_be_present_in_element
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
這個條件判斷元素是否可點擊,傳入locator
element_to_be_clickable
這四個條件判斷元素是否被選中,第一個條件傳入WebElement對象,第二個傳入locator元組
第三個傳入WebElement對象以及狀態,相等返回True,否則返回False
第四個傳入locator以及狀態,相等返回True,否則返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一個條件判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否刷新了
staleness_of
上面是所有17個condition,與until、until_not組合能夠實現很多判斷,如果能自己靈活封裝,將會大大提高腳本的穩定性。

