一、為什麼要使用元素等待?
原因:由於電腦配置或者網路原因,在查詢元素時,元素**未在第一時間內被載入出來,而丟擲未能找到元素的異常。
二、什麼是元素等待?
元素在第一次未找到時,元素等待設定的時長被啟用,如果在設定的有效時長內找到元素,繼續執行**,如果超出設定的時長未找到元素,丟擲未找到元素異常。
三、元素等待分類
四、隱式等待
1、概念:定位元素時,如果能定位到元素則直接返回該元素,不觸發等待;如果不能定位到元素,則間隔一段時間後再去定位元素;如果在達到最大時長時還沒有找到指定元素,則丟擲元素不存在的異常nosuchelementexception。
2、方法:(timeout:為等待最大時長,單位:秒)
driver.implicitly_wait(timeout)
說明:隱式等待為全域性設定(只需要設定一次,就會作用於所有元素)
3、案例:定位微博登入使用者名稱輸入框(因為開啟頁面需要載入,常常出現元素找不到異常)
d:\anaconda3\python.exe e:/id/test_implicit_waiting.py
traceback (most recent call last):
file "e:/id/test_implicit_waiting.py", line 12, in driver.find_element_by_css_selector("#loginname").send_keys("微博")
file "d:\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 598, in find_element_by_css_selector
return self.find_element(by=by.css_selector, value=css_selector)
file "d:\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
file "d:\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
file "d:\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.nosuchelementexception: message: unable to locate element: #loginname
process finished with exit code 1
from selenium import webdriver
from time import sleep
#獲取瀏覽器物件
driver=webdriver.firefox()
#頁面需要載入,因此使用隱式等待10秒
driver.implicitly_wait(10)
#獲取網路鏈結
url=""
driver.get(url)
#定位登入使用者名稱,輸入微博
driver.find_element_by_css_selector("#loginname").send_keys("微博")
sleep(3)
driver.quit()
執行效果:
五、顯示等待
1、概念:定位指定元素時,如果能定位到元素則直接返回該元素,不觸發等待; 如果不能定位到元素,則間隔一段時間後再去定位元素;如果在達到最大時長時還沒有找到指定元素,則丟擲超時異常timeoutexception。
在selenium中把顯式等待的相關方法封裝在webdriverwait類中
2、實現方法
(1)導包,等待類:from selenium.webdriver.support.wait import webdriverwait
(2)webdriverwait(driver,timeout,poll_frequency=0.5)
①driver:瀏覽器驅動物件
②timeout:超時的時長,單位秒
③poll_frequency:檢測間隔時間,預設為0.5秒
(3)呼叫方法until(method):直到....時
①method:函式名稱,該函式用來實現對元素的定位
②一般使用匿名函式來實現:lambda x: x.find_element_by_***("***")
(4)如:element=webdriverwait(driver,10,1).until(lambda x: x.find_element_by_***("***")
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import webdriverwait
#獲取瀏覽器物件
driver=webdriver.firefox()
#獲取網路鏈結
url=""
driver.get(url)
#定位登入使用者名稱,輸入微博,使用顯式等待載入頁面
#例項化webdriverwait()並呼叫until方法(返回的是乙個元素)
sleep(3)
driver.quit()
實現效果:
Selenium 元素等待
這是乙個在寫自動化指令碼時經常遇到的問題。試想這樣的乙個場景,通過指令碼開啟乙個網頁,可是由於網路的問題頁面並沒有及時載入進來,這時候如果已經執行到之後查詢元素的 那麼勢必會丟擲錯誤找不到相應元素,而事實並非如此。如果沒有合適的元素等待處理,這樣的測試 不僅不夠健壯,過多的誤報會消耗測試人員大量的精...
selenium頁面元素等待問題
頁面元素等待問題 有遇到過自動化的case不穩定的情況嗎?有時候通過,有時候不通過。一些自動化框架為了應對這種case,甚至開發出來fail自動重run幾次的功能。作為自動化框架,實現該功能是不錯的,但是作為寫自動化case的工程師,應該盡量寫出穩定的自動化case。對於webui的自動化而言,一種...
Selenium中元素載入和等待
本來實現了退出功能的,但是想把自動化寫得功能完善點。我加了個方法,給個等待時間,判斷元素是否存在。結果悲劇了。函式執行有問題,把能跑過的case,給整失敗了。元素沒有獲取到。我只得退回原來的情況,把退出重新寫起來。結果也失敗了。然後debug,debug能過,把載入時間延長。結果有的時候能過,有的時...