設定元素等待
阿新 • • 發佈:2018-12-27
大多數web應用程式應用AJAX技術,瀏覽器載入頁面時,頁面元素可能並不是同時載入完成,這給元素定位增加了難度,可以通過元素等待改善這種問題
一、顯示等待
顯示等待使wbedriver等待某個條件成立時繼續執行,否則在達到最大時長時丟擲超時異常(TimeoutExecption)
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 driver = webdriver.Firefox() driver.get("https://www.baidu.com/") element = WebDriverWait(driver,5,0.5).until( EC.presence_of_element_located((By.ID,'kw')) ) element.send_keys('selenium') driver.quit()
注:
WebDriverWait(driver,timeout,poll_frequency = 0.5,ignored_exceptions = None)
1、driver:瀏覽器驅動
2、timeout:最長超時時間,預設以秒為單位
3、poll_frequency:檢測的間隔(步長),預設為0.5s
4、ignored_exceptions:超時後的異常資訊,預設情況下拋NoSuchElementExecption異常
WebDriverWait一般由until和until_not配合使用,下面是until和until_not的使用方法:
1、until(method,message=")呼叫該方法的驅動程式作為一個引數,直到返回值為true
2、until_not(method,message=’’)呼叫該方法的驅動程式作為一個引數,直到返回值為false
本例中,通過AS關鍵字將expected_conditions重新命名為EC,並呼叫presence_of_element_located()方法判斷元素是否存在
expected_condtions類所提供的預期條件判斷的方法
除了上面的expected_conditions類提供的方法,還可以用is_displayed方法判斷元素是否可見:
from selenium import webdriver from time import sleep,ctime driver = webdriver.Chrome() driver.get('https://www.baidu.com/') print(ctime()) for i in range(10): try: el = driver.find_element_by_id('kw22') if el.is_displayed(): break except:pass sleep(1) else: print('timeout') driver.close() print(ctime())
截圖如下:
二、隱式等待
隱式等待是通過一定時長來等待頁面元素載入完成,如果超過了設定的時長元素還沒有被加載出來,則會丟擲NoSuchElementException異常。webdriver提供了隱式等待implicitly_wait(),預設設定為0
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com/')
try:
print(ctime())
driver.find_element_by_id('kw22').send_keys('selenium')
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
執行結果如下圖:
注:
- 本例中設定等待時間10秒,但是這10秒並非一個固定等待時間,他並不影響指令碼執行進度
- 並不針對頁面上的某一元素進行等待,當指令碼定位到某一元素時,如果元素可以定位,則繼續執行;如果元素定位不到,他則以輪詢的方式不斷判斷元素是否被定位到,直到超出10秒還沒定位到,則丟擲異常
三、sleep休眠方法
sleep方法會固定休眠多久,然後繼續執行