前戲
在我們做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()
不是總結的總結
學了等待的三種方法,我最常用的還是顯示等待,寫一個公共的方法,把通過什么定位和定位元素抽離出來,什么時候用,傳這兩個參數就可以了