為什麼要等待:需要的元素尚未載入出來(原因可能有:網速慢、**內容過多),**已經執行到元素位置,此時會報錯;為避免這種錯誤,需要使用到等待,等待元素載入出來再執行元素
1、顯式等待
顯式等待是針對於某個特定的元素設定的等待時間
格式:webdriverwait(driver, timeout, poll_frequency=0.5, ignored_exceptions=none)
示例:webdriverwait(driver,10,0.2).until(ec.presence_of_element_located((by.css_selector,'.box-conteny')))
解釋:webdriverwait(driver,10,0.2)意思是:使用瀏覽器driver顯式等待,10秒內,每0.2秒進行一次後面的元素定位,若發現可以定位元素,則跳過,執行下一行**;若元素未載入出來,無法定位,一直等待,等到10秒過後還無法定位則報錯(會卡在這裡,不通過不會執行下一行**);presence_of_element_located()方法作用是判斷後面的元素是否存在
#顯式等待
#匯入webdriver
from selenium import
webdriver
#匯入by
from selenium.webdriver.common.by importby#
匯入等待類webdriver
from selenium.webdriver.support.ui import
webdriverwait
#匯入預期條件設定類expected_conditions 命名為ec
from selenium.webdriver.support import
expected_conditions as ec
import
time
#建立乙個瀏覽器
driver =webdriver.firefox()
driver.maximize_window()
#訪問**
driver.get('')
#設定顯式等待預置條件
#webdriverwait(driver,10,0.2):使用瀏覽器driver顯式等待,10秒內,每0.2秒進行一次後面的元素定位,若發現可以定位元素,則跳過,執行下一行**;
若元素未載入出來,無法定位,一直等待,等到10秒過後還無法定位則報錯(會卡在這裡,不通過不會執行下一行**)
#until意思是直到,直到後面的條件滿足為止,即10秒內可以定位則跳過,10秒內定位不了則報錯
webdriverwait(driver,10,0.2).until(ec.presence_of_element_located((by.css_selector,'
.box-content
')))
#下拉滾動條
for i in range(5):
js = '
window.scrollto(0,%s)
' % (i*100)
driver.execute_script(js)
time.sleep(0.5)
driver.quit()
顯示等待稍微複雜
2、隱式等待
使用implicitly_wait()方法實現隱式等待,設定的是全域性等待(對頁面的所有元素有效);若設定了隱式等待,執行到元素定位時定位不到元素,會在時間內多處嘗試定位,超過時間則報錯;設定的時間非固定,不影響指令碼執行,不針對某個特定的元素進行等待;指令碼執行到元素定位,可以定位則繼續執行;定位不了則以輪詢的方式不多判斷元素 是否定位到,在時間內定位到則繼續執行;時間內定位不到,則報錯
格式: driver.implicitly_wait(10)
from selenium importwebdriver
#建立乙個瀏覽器物件,設定為最大化螢幕
driver =webdriver.firefox()
driver.maximize_window()
#訪問**
driver.get('
')#下拉滾動條
for i in range(100):
js = '
window.scrollto(0,%s)
' % (i*100)
driver.execute_script(js)
#隱式等待(10秒):隱式並不針對某個元素進行等待,指令碼執行到元素定位時,元素若已經載入出來,可以定位,則不等待,繼續執行;
若元素未載入出來,還不能定位,則等待10秒,10秒內載入出來則繼續執行,載入不出來則報錯
driver.implicitly_wait(10)
#定位元素(此元素需要下拉滾動條,否則不載入出來;若驗證隱式等待的效果,可以注釋下拉操作執行**)
driver.find_element_by_css_selector('
.hotsale-hd > em:nth-child(1)')
#關閉瀏覽器
driver.quit()
3、休眠
time.sleep(2),休眠2秒;此方式需要匯入time模組,屬於強制**休眠
#匯入模組
from selenium import
webdriver
import
time
#建立瀏覽器,設定為最大化
driver =webdriver.firefox()
driver.maximize_window()
#driver.get('
')#強制休眠2秒
time.sleep(2)
#driver.find_element_by_id('
kw')
顯式等待針對的是某個 特定的元素,需要設定查詢元素是否能被定位到頻率等;隱式等待設定的是全域性,對整個網頁所有元素有效;休眠則強制**休眠時間,顯式和隱式 不休眠,只是等待
Selenium強制等待 顯式等待 隱式等待的區別
學習這一章的時候,無法清楚的了解到顯式等待與隱式等待的區別。這一篇講得挺清楚的 為什麼需要設定元素等待?usr bin env python coding utf 8 title time 2020 3 25 17 52 author 小菠蘿測試筆記 blog from time import sl...
selenium中顯式等待和隱式等待區別
等待 是設定了乙個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間截止,然後執行下一步。注意這裡有乙個弊端,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的...
selenium自學之路 顯式等待,隱式等待
顯示等待 使webdriver等待某個條件成立時繼續執行,否則在達到最大時長時拋棄超時異常 from selenium import webdriver from selenium.webdriver.common.by import by from selenium.webdriver.suppo...