Selenium元素等待

2021-09-29 12:11:24 字數 3171 閱讀 2538

一、為什麼要使用元素等待?

原因:由於電腦配置或者網路原因,在查詢元素時,元素**未在第一時間內被載入出來,而丟擲未能找到元素的異常。

二、什麼是元素等待?

元素在第一次未找到時,元素等待設定的時長被啟用,如果在設定的有效時長內找到元素,繼續執行**,如果超出設定的時長未找到元素,丟擲未找到元素異常。

三、元素等待分類

四、隱式等待

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能過,把載入時間延長。結果有的時候能過,有的時...