1. 程式人生 > >python+selenium中的wait事件

python+selenium中的wait事件

selenium中的wait事件

1. 顯示用法(WebDriverWait)

WebDriverWait的使用
配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。
它主要的意思就是:
程式每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設定的最長時間,然後丟擲TimeoutException。

程式碼演示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from
selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) #等待的最大時間 url = 'http://www.baidu.com?tn=baiduhome' browser.get(url) try: # 獲取輸入框 input = wait.until( #判斷該元素是否載入完成
EC.presence_of_element_located((By.CSS_SELECTOR, '#kw')) ) # 輸入查詢關鍵字 input.send_keys("python") # 獲取搜尋點選按鈕 submit = wait.until( #判斷該元素是否可以點選 EC.element_to_be_clickable((By.CSS_SELECTOR, '#su')) ) submit.click() except TimeoutException: print('exception'
)

隱性等待和顯性等待,在其他操作中,隱性等待起決定性作用,在WebDriverWait..中顯性等待起主要作用,
注意的是:最長的等待時間取決於兩者之間的大者,如果隱性等待時間 > 顯性等待時間,則該句程式碼的最長等待時間等於隱性等待時間。

這裡需要特別注意的是until或until_not中的可執行方法method引數,很多人傳入了WebElement物件,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id(‘kw’)) # 錯誤

這裡的引數我可以使用selenium提供的 expected_conditions 模組 下文有提到

2. 隱示用法(implicitly_wait)

implicitly_wait(xx)
隱形等待是設定了一個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間截止,然後執行下一步。注意這裡有一個弊端,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步,我想等我要的元素出來之後就下一步怎麼辦?這時候我們就使用顯示的wait方法

程式碼演示:

from selenium import webdriver


driver = webdriver.Chrome()
driver.implicitly_wait(30) # 隱性等待,最長等30秒
driver.get('http://www.baidu.com')
print driver.current_url
driver.quit()

這裡需要注意:
隱性等待對整個driver的週期都起作用,所以只要設定一次即可

3.time.sleep()方法

這個比較簡單,起到一個強制的作用,
就是不管怎麼樣,都會等到你設定的時長,才會往下執行

4.selenium提供的 expected_conditions 模組

expected_conditions 模組下的判斷條件:

    selenium.webdriver.support.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