網頁常常會因為網路原因,程式問題等等導致開啟網頁慢,一直在那裡打圈圈。
出現這種情況時網頁裡的很多元素就沒有載入完成,如果你剛好要定位的元素沒有載入完,這時定位的話程式就會丟擲異常。
所以程式裡要加入等待機制,等待元素載入完,要讓程式穩定執行,加等待(waits)這挺重要的,因為網路真的沒有那麼好。
等待頁面載入有三種方法。
1.time.sleep()方法
這是直接呼叫time裡的sleep來強制等待,我前面幾篇文章寫的例子就是用的sleep。
這不是selenium的官方寫法,官方認為使用sleep是比較糟糕的用法,官方寫法是下面兩種方法。之前是這樣寫是想簡化一下。
2.WebDriverWait()顯示等待
就是設定一個等待時間,直到這個元素出現就停止等待,如果沒出現就丟擲異常。
比如設定10秒等待時間,如果等待第6秒這個元素就出現了,就停止等待,繼續往下執行,如果第10秒元素還沒出現,就丟擲異常。
程式碼如下,使用的WebDriverWait().until()方法,WebDriverWait()裡填driver和要等待的時間,until裡填等待的元素。程式碼演示的是點選猿人學右上角的搜尋按鈕,等待class_name叫search-show的出現為止。
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.com')
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "search-show"))
)
element.click()
finally:
time.sleep(10)
driver.quit()
3.implicitly_wait()隱式等待
隱式等待是一個全域性設定,設定後所有的元素定位都會等待給定的時間,直到元素出現為止,等待規定時間元素沒出現就報錯。
因為設定後是所有定位都要等待,所以最好用顯示等待。
隱式等待的呼叫方法是:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
#等待5秒
driver.implicitly_wait(5)
driver.get('https://www.yuanrenxue.com')
driver.find_element_by_class_name('slide-left').click()
driver.quit()
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***