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即可。