1. 程式人生 > >python3+selenium入門07-元素等待

python3+selenium入門07-元素等待

在使用selenium進行操作時,有時候在定位元素時會報錯。這可能是因為元素還沒有來得及載入導致的。可以等過元素等待,等待元素出現。有強制等待,顯式等待,隱式等待。

強制等待

就是之前文章中的time.sleep(),只是為了看到介面操作效果才那樣設定的。這個是不管找沒找到都會等待的。基本程式碼中不會用這個。

顯式等待

WebDriverWait類是WebDriver提供的等待方法。在設定的時間內,會每隔一段時間去檢查一次當前頁面元素是否存在,如果超過設定時間還沒有見到到就丟擲異常。具體格式如下:

需要先匯入from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:瀏覽器例項

timeout:超時時間,預設已秒為單位

poll_frequency:檢測時間間隔,預設0.5秒

ignored_exceptions:報錯資訊,預設丟擲NoSuchElementException

一般是配合until()和until_not()方法使用

until():可以傳兩個引數,第一個引數是判斷條件,直到第一個引數返回True。第二個引數可以寫文字說明。

until_not():可以傳兩個引數,第一個引數是判斷條件,直到第二個引數返回False。第二個引數可以寫文字說明

expected_conditions類下提供預期條件判斷方法,具體有哪些方法可以自己查下,以title_is()方法舉例,對比title是否正確的。

需要先匯入from selenium.webdriver.support import expected_conditions

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
dr = webdriver.Chrome()
dr.maximize_window()
dr.get("https://www.baidu.com")#開啟百度
tr = dr.title#獲取title
wait = WebDriverWait(dr,10)#例項化顯示等待,設定等待時間10秒
s = wait.until_not(expected_conditions.title_is(tr),'出錯了')#對比title
print(s)

因為title肯定一致,返回的是True,所以until_not()肯定不會對。會一直等待著,直到10秒結束。可以改成until()再看下。

隱式等待

WebDriver類下的implicitly_wait()方法可以設定隱式等待。這個只會在指令碼進行元素定位相關的時候執行,會在設定的時間內不斷的判斷這個元素是否被找到了

from selenium import webdriver
from time import ctime
dr = webdriver.Chrome()
dr.maximize_window()
dr.implicitly_wait(10)
try:
    dr.get("https://www.baidu.com")#開啟百度
    print(ctime())
    tr = dr.find_element_by_id('kw123')
except BaseException as f:
    print(f)
    print(ctime())
finally:
    dr.close()

因為沒有一個id是叫kw123,所以肯定會找不到,通過秒數可以看到等待了10秒。

一般這個用的比較多,在瀏覽器初始化之後設定。之後所有定位元素的操作,都會有等待時間的設定。