天天看點

selenium--等待的三種方式

前戲

在我們做UI自動化的時候,最不穩定的就是頁面了,由于各種原因頁面的元素沒有加載出來,比如網速慢,伺服器響應慢等等,這時候如果我們去操作頁面的元素,selenium會給我們抛出一個NoSuchElementException的異常。我們可以等待頁面頁面加載出來或者一段時間再去操作,這樣的話大大降低了這種錯誤的出現。

我們可以用python内置的sleep來強制等待,或者用selenium提供的顯示等待或者隐式等待的方法

相關子產品:

WebDriverWait 顯示等待針對元素必用

expected_conditions 預期條件類(用于顯示等待)

NoSuchElementException 用于隐式等待抛出異常

sleep

sleep強制等待,不管元素有沒有加載出來,都必須等到時間才會往下去執行

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
driver.find_element_by_css_selector('#kw').send_keys('python')
sleep(2)
driver.quit()      

隐式等待

隐式等待不針對某一個元素進行等待,全局元素等待,隐式等待會等待整個頁面加載完成,也就是說浏覽器視窗标簽欄中不在出現轉動的小圓圈,才會執行下一步

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep, ctime

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
# 設定隐式等待,最多等待 5s,如果五秒内什麼時候加載完就什麼時候進行操作
driver.implicitly_wait(5)
try:
    print(ctime())
    driver.find_element_by_css_selector('#kw').send_keys('python')
    driver.find_element_by_css_selector('#su').click()
except NoSuchElementException  as msg:
    print(msg)
finally:
    print(ctime())
sleep(2)
driver.quit()      

顯示等待

顯示等待是針對某一個元素進行相關等待判定

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
driver.find_element_by_css_selector('#kw').send_keys('python')

# 一共等待 5 秒鐘,每 0.5s 找一次,直到通過 ID 找到
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'su')))

element.click()
sleep(2)
driver.quit()      

不是總結的總結

學了等待的三種方法,我最常用的還是顯示等待,寫一個公共的方法,把通過什麼定位和定位元素抽離出來,什麼時候用,傳這兩個參數就可以了