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

selenium webdriver——設定元素等待

如今大多數Web應用程式使用ajax技術,當瀏覽器在載入頁面時,頁面上的元素可能並不是同時被載入完成,這給定位元素的定位增加了困難,

如果因為在載入某個元素時延遲而造成ElementNotVisibleException(不可見元素異常)的情況出現,那麼就會降低自動化指令碼的穩定性,設定元素等待可改善這種問題造成的不穩定。

WebDriver提供了兩種型別的等待:

  • 顯示等待:

具體格式如下:

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 def abc(): #開啟瀏覽器 driver = webdriver.Firefox() driver.get('http://www.baidu.com') #顯示等待 element = WebDriverWait(driver,5,0.5).until(ec.presence_of_all_elements_located((By.ID,"kw"))) driver.find_element_by_id("kw"
).send_keys("selenium")

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions).until()

driver:瀏覽器驅動
timeout:最長超時時間,預設以秒為單位
poll_frequency:檢測的間隔(步長)時間,預設為0.5S
ignored_exceptions:超時後的異常資訊,預設情況下拋NoSuchElementException
WebDriverWait()一般由until()或until_not()方法配合使用,下面是方法說明
until(method,message=”)
呼叫該方法提供的驅動程式作為一個引數,直到返回值為True
until_not(method,message=”)
呼叫該方法提供的驅動程式作為一個引數,直到返回值為False
presence_of_all_elements_located()
判斷元素是否存在

#找到id 為dropdown1的父元素
WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed())

#滑鼠定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()

is_displayed()
該元素是否使用者可以見

move_to_element(menu)
移動滑鼠到一個元素中,menu上面已經定義了他所指向的哪一個元素
to_element:元件移動到

perform()
執行所有儲存的行為

  • 隱式等待:

通過一定的時長等待頁面上某元素載入完成,如果超出了設定的時長元素還沒有被載入,則丟擲NoSuchElementException異常,WebDriver

提供了implicitly_wait()方法來實現隱式等待,預設設定為0

from selenium import webdriver

def abc():
    #開啟瀏覽器
    driver = webdriver.Firefox()
    #隱式等待 設定等待時間為10秒
    driver.implicitly_wait(10)
    driver.get('http://www.baidu.com')
  • sleep休眠方法

在指令碼執行中固定休眠

from selenium import webdriver
from time import sleep

def abc():
    #開啟瀏覽器
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    sleep(3)
    driver.quit()