1. 程式人生 > >設定元素等待

設定元素等待

大多數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()

執行結果如下圖:
在這裡插入圖片描述

注:

  1. 本例中設定等待時間10秒,但是這10秒並非一個固定等待時間,他並不影響指令碼執行進度
  2. 並不針對頁面上的某一元素進行等待,當指令碼定位到某一元素時,如果元素可以定位,則繼續執行;如果元素定位不到,他則以輪詢的方式不斷判斷元素是否被定位到,直到超出10秒還沒定位到,則丟擲異常

三、sleep休眠方法

sleep方法會固定休眠多久,然後繼續執行