selenium中有三種等待方式可以使用:強制等待,隱式等待和顯式等待;
一、強制等待:強制等待我們可以透過time模組中time.sleep()來實現,不管瀏覽器是否載入完成,只要程式執行到等待設定的時間,就會等待,時間一到,就繼續執行後面的程式了
time.sleep(5) #強制等待5秒
二、隱式等待:透過webdriver物件的implicitly_wait()方法,該方法一次設定,全域性有效。當我們去定位頁面元素時,如果元素沒有找到,不會立即丟擲異常,而是週期性地(通常為 0.5s)去重新尋找,直到該元素找到或者超過最大等待時間才結束(丟擲異常或者返回 None
# 設定隱式等待為10秒
driver.implicitly_wait(10)
implicitly_wait()預設引數的單位為秒,本例中設定等待時長為10秒。
首先這10秒並非一個固定的等待時間,它並不影響指令碼的執行速度。
其次,它並不針對頁面上的某一元素進行等待。當指令碼執行到某個元素定位時,如果元素可以定位,則繼續執行;
如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。
假設在第6秒定位到了元素則繼續執行,若直到超出設定時長(10秒)還沒有定位到元素,則丟擲異常。
注意:當我們使用implicitly_wait()時,如果想要定位的元素已經找到,但是它的內容(如文字內容,屬性等)沒有載入出來,此時隱式等待無效,仍會直接丟擲NoSuchElementException異常,這也是為什麼我們很多時候仍需要使用time.sleep()的原因。
三、顯式等待:顯式等待是程式碼中等待一定條件發生後再進一步執行你的程式碼,透過webDriverWait結合ExpectedCondition實現。實現的方法:程式每隔幾秒判斷一下設定的條件,如果條件成立,則執行下一步,否則就繼續等待,直到超過設定的最長時間,然後丟擲異常,
顯示等待更加靈活,可以讓我們針對某一個元素進行等待設定。
透過WebDriverWait類的until()和until_not()方法來實現。
until():條件為成立返回True,等待結束,如果超時,丟擲TimeoutException異常。
until_not():條件不成立返回True,等待結束,如果超時,丟擲TimeoutException。
# 呼叫格式
WebDriverWait(driver,timeout,poll_frequency,ignored_exception).until(func,error_message)
WebDriverWait(driver,timeout,poll_frequency,ignored_exception).until_not(func,error_message)
"""
driver:webdriver例項物件
timeout:最大等待時間
poll_freqency:呼叫頻率,可選的,預設0.5s一週期
ignored_exception:可選的,要忽略的異常,預設為None
func:要執行的方法
error_message:自定義異常資訊,可選的
"""