Selenium 元素等待

2021-08-20 11:08:26 字數 2299 閱讀 3973

這是乙個在寫自動化指令碼時經常遇到的問題。試想這樣的乙個場景,通過指令碼開啟乙個網頁,可是由於網路的問題頁面並沒有及時載入進來,這時候如果已經執行到之後查詢元素的**那麼勢必會丟擲錯誤找不到相應元素,而事實並非如此。如果沒有合適的元素等待處理,這樣的測試**不僅不夠健壯,過多的誤報會消耗測試人員大量的精力去查詢測試失敗的原因。元素等待就是在指定的時間內等待元素載入進來之後再執行下面的**,否則一直等待下去直到超過指定時間。

selenium中一共有三種等待的方法,下面依次介紹一下。

1. sleep(seconds)

這是最傻的一種方式,也就是不管指定的元素是否載入進來,都等待指定的秒數。唯一的好處是寫起來非常簡單,個人在除錯或者寫demo的時候會這麼做。壞處則是嚴重降低執行效率,頁面元素明明已經載入了還在那兒傻等。當用例數量巨大的時候,每個用例多一秒的等待多會嚴重拖累整個測試集的執行效率。所以在正式的測試指令碼中非萬不得已不能使用這種方法。

2. webdriver.implicit_wait(seconds)

這是webdriver類裡提供的乙個方法,為這個session設定乙個全域性的等待時間。他的行為是在指定的時間內等待元素的載入,一旦找到了指定元素則立刻繼續執行之後的**。好處是顯而易見的,提高了測試效率不在一味傻等。而且因為是全域性的設定,不需要在之後的**中再單獨處理元素等待。所以這是最高效地處理元素等待的方式。

3.webdriverwait及expected_conditions

這個方法使用起來相對方法二更複雜,只對指定的元素進行等待,相對可自己設定的引數也更多。webdriverwait類一般配合其until()或until_not()方法使用。下面是官方文件對各引數的一些解釋。個人覺得挺模糊的不好理解,這裡說一下自己的理解。當使用webdriverwait.until(method)則表示持續等待直到method方法返回true,然後返回method返回的對像。如果超過timeout時間則丟擲timeout的exception。 not_until則是等待直到method方法返回false

webdriverwait(driver, timeout,poll_frequency=0.5, ignored_exceptions=none).until(method,message='')

driver: 瀏覽器物件

timeout: 最長超時時間,以秒為單位

poll_frequency: 檢測的間隔時間,以秒為單位,預設為0.5

ignored_exception: 包含異常類的可迭代結構,用來包含執行期間需要忽略的異常,預設只包含nosuchelementexception。這個怎麼理解呢,就是在執行過程中如果丟擲的異常在被包含在這個迭代中,那麼異常不會丟擲而是繼續等待直到超過timeout的時間。

method: 瀏覽器物件提供的方法,一般配合expected_conditions類提供的方法來使用。

expected_conditions: 這個類提供了一系列判斷元素狀態的方法,例如元素是否存在,是否可見,是否被選中等等。詳細的方法列表請參考官方文件。

下面舉幾個具體的例子來看怎麼應用webdriverwait來進行元素等待。

driver = webdriver.firefox()

driver.get('')

search_textbox= webdriverwait(driver, 10, 0.5).until(expected_conditions.presence_of_element_located(by.id, 'kw')

search_textbox.send_keys('selenium')

time.sleep(5)

search_textbox.clear()

driver = webdriver.firefox()

driver.get('')

search_textbox= webdriverwait(driver, 10, 0.5).until(expected_conditions.visibility_of_element_located(by.id, 'kw')

search_textbox.send_keys('selenium')

time.sleep(5)

search_textbox.clear()

看上去跟前面的例子非常相似,這裡強調一下presence_of_element_located()

與visibility_of_element_located()的區別。前者只要搜尋框載入到了dom樹里就返回了元素物件,而後者必須元素物件在頁面上可見才返回。因為載入成功並不代表在頁面上可見,請注意。

好了,selenium元素等待的方法就全介紹完了。

Selenium元素等待

一 為什麼要使用元素等待?原因 由於電腦配置或者網路原因,在查詢元素時,元素 未在第一時間內被載入出來,而丟擲未能找到元素的異常。二 什麼是元素等待?元素在第一次未找到時,元素等待設定的時長被啟用,如果在設定的有效時長內找到元素,繼續執行 如果超出設定的時長未找到元素,丟擲未找到元素異常。三 元素等...

selenium頁面元素等待問題

頁面元素等待問題 有遇到過自動化的case不穩定的情況嗎?有時候通過,有時候不通過。一些自動化框架為了應對這種case,甚至開發出來fail自動重run幾次的功能。作為自動化框架,實現該功能是不錯的,但是作為寫自動化case的工程師,應該盡量寫出穩定的自動化case。對於webui的自動化而言,一種...

Selenium中元素載入和等待

本來實現了退出功能的,但是想把自動化寫得功能完善點。我加了個方法,給個等待時間,判斷元素是否存在。結果悲劇了。函式執行有問題,把能跑過的case,給整失敗了。元素沒有獲取到。我只得退回原來的情況,把退出重新寫起來。結果也失敗了。然後debug,debug能過,把載入時間延長。結果有的時候能過,有的時...