1. 程式人生 > >Selenium入門記錄_006_設定元素等待(淺析)

Selenium入門記錄_006_設定元素等待(淺析)

環境配置問題見 這裡

Selenium2 Python自動化測試實戰(第二版) 蟲師——

如今大多數的web 應用程式使用AJAX 技術。當瀏覽器在載入頁面時,頁面內的元素可能並不是同時
被載入完成的, 這給元素的定位新增的困難。如果因為在載入某個元素時延遲而造成
ElementNotVisibleException 的情況出現,那麼就會降低的自動化指令碼的穩定性。
WebDriver 提供了兩種型別的等待:顯式等待和隱式等待。

0-不設定等待

在不設定等待的情況下,如果網頁出現載入速度不夠快,下一步執行需要的元素尚未載入完成,則會出現無法找到元素,自動執行失敗的情況

。為了避免這種情況,等待設定可以說是自動化測試必須的。根據不同的情況,使用不同的等待。

1-隱式等待

先來說說比較簡單的隱式等待:

隱式等待是通過一定的時長等待頁面所元素載入完成。哪果超出了設定的時長元素還沒有被載入測拋 NoSuchElementException
異常。WebDriver 提供了implicitly_wait()方法來實現隱式等待,預設設定為0。

工作原理:隱式等待通過設定每次操作之間間隔的最長時間,超過設定的時間則報錯並中斷程式;沒超過則正常實行。
作用範圍:該設定為全域性設定,僅需設定一次,即可對整個過程中生效。

#coding=utf-8
from
selenium import webdriver driver = webdriver.Chrome() #設定隱式等待時間,這邊設為5秒。如需驗證是否生效,可設定一個較短的時間,如1秒。 driver.implicitly_wait(5) driver.get("http://10.7.1.101") #下面寫其他操作。

*有別於Selenium2 Python自動化測試實戰(第二版)中的描述,在我的環境下不需要以下的匯入也可以進行隱式等待。

from selenium.webdriver.support.ui import WebDriverWait

2-顯式等待

顯式等待使WebdDriver 等待某個條件成立時繼續執行,否則在達到最大時長時拋棄超時異常(TimeoutException)。

顯式等待比較複雜,用來等待某個特定條件出現。例如:等待,直到A按鈕出現。
工作原理:顯示等待可以通過各種引數設定不同的條件、等待時間、時間間隔、報錯資訊等。可以用來等待一些需要特殊觀察的物件。
作用範圍:僅對被設定的物件生效。

格式為:

#coding=utf-8
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))

WebDriverWait()
它是由webdirver 提供的等待方法。在設定時間內,預設每隔一段時間檢測一次當前頁面元素是否存在,如果超過設定時間檢測不到則丟擲異常。具體格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

引數 解釋
driver WebDriver 的驅動程式(Ie, Firefox,Chrome 等)
timeout 最長超時時間,預設以秒為單位
poll_frequency 執行判斷的間隔(步長)時間,預設為0.5 秒
ignored_exceptions 超時後的異常資訊,預設情況下拋NoSuchElementException 異常。

until()

方法 解釋
until(method, message=’ ’) 呼叫該方法提供的驅動程式作為一個引數,直到返回值為Ture。
until_not(method, message=’ ’) 呼叫該方法提供的驅動程式作為一個引數,直到返回值為False。

然後是一個完整的demo:

#coding=utf-8
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.Chrome()
driver.get("http://www.baidu.com1")
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()

還有很多可以調整的引數,有機會再展開。

3-Sleep休眠

最簡單的等待,也只有一個引數,作用就是在跑到這行的時候等待x秒
工作原理:就是等一下,哈哈。
作用範圍:程式碼出現時執行一次。
例:

sleep(3) #即等待3秒,sleep方法在time model下,import time即可。