1、什麼是元素等待

WebDriver定位頁面元素時如果未找到,會在指定時間內一直等待的過程。為了保證指令碼執行的穩定性,需要指令碼中新增等待時間。

2、為什麼要設定元素等待

在元素定位的時,可能出現指令碼已經執行到定位某個元素的時候,但該元素尚未載入到頁面,此時指令碼會因無法定位到該元素而導致執行失敗。換句話說就是程式碼執行的速度,快於頁面元素載入的速度,我們需要等待頁面元素全部載入完成之後,再做定位元素。元素等待本質是為了解決元素定位時序上不匹配的問題。

頁面載入速度慢的原因

  1. 由於網路速度原因。
  2. 電腦配置原因。
  3. 伺服器處理請求原因。

3、Selenium中常用的等待方式

Selenium中常用的等待時間方式有三種:

  1. 強制等待:time.sleep()
  2. 隱式等待:implicitly_wait()
  3. 顯式等待: WebDriverWait()

4、強制等待

設定等待最簡單的方法就是強制等待,其實就是time.sleep()方法。不管它什麼情況,讓程式暫停執行一定時間,時間過後繼續執行。缺點是不智慧,如果設定的時間太短,元素還沒有加載出來一樣會報錯。設定的時間太長,則會浪費時間。因而在實際UI自動化指令碼開發中,這個方式一般比較少用。

5、隱式等待

(1)隱式等待介紹

WebDriver提供了mplicitly_wait()方法來實現隱式等待。隱式等待相當於設定全域性等待,在定位元素時,對所有元素設定的超時時間。implicitly_wait()預設引數的單位為秒,預設設定超時時間為0,設定後這個隱式等待會在WebDriver物件例項的整個生命週期起作用。

從等待作用上看,是可以滿足需要的,但是考慮到實際應用場景,Driver(瀏覽器)要等待的元素和指令碼要操作的元素未必相同,也就是說,指令碼要操作的元素已經出現,但因為設定了全域性等待,Driver(瀏覽器)也會繼續等待頁面上其他無關元素,直至整個頁面載入完畢。所以與顯式等待相比,可能會出現一些無效等待的情況。

如果超出了設定的時長,元素還沒有被載入,則拋NoSuchElementException異常(可自己指定異常或自定義異常)。

(2)示例

  1. """
  2. 1.學習目標:
  3. 掌握selenium隱式等待方法使用
  4. 2.操作
  5. 2.1 隱式等待方法
  6. driver.implicitly_wait(最大等待時間,單位:秒)
  7. 2.2 隱式等待作用
  8. 在規定的時間內等待頁面所有元素載入;
  9. 2.3 使用場景:
  10. 在有頁面跳轉的時候,可以使用隱式等待。
  11. 3.需求
  12. 實現selenium隱式等待方法
  13. """
  14. # 1.匯入selenium
  15. from selenium import webdriver
  16. import time
  17. from selenium.common.exceptions import NoSuchElementException
  18. # 2.開啟瀏覽器
  19. driver = webdriver.Chrome()
  20. # 3.開啟頁面
  21. url = "https://www.jd.com/"
  22. driver.get(url)
  23. # 4. 新增隱式等待
  24. print("等待開始時間", time.time())
  25. # 等待5秒鐘,最多等待5秒。
  26. # 如果在5秒內載入完成,載入完就繼續執行。
  27. driver.implicitly_wait(5)
  28. print("等待結束時間", time.time())
  29. # 5. 定位元素,點選連結
  30. try:
  31. driver.find_element_by_link_text("秒殺").click()
  32. except NoSuchElementException as e:
  33. print(e)
  34. finally:
  35. # 6.關閉瀏覽器
  36. time.sleep(3)
  37. driver.quit()
  38. """
  39. 輸出結果:
  40. 等待開始時間 1590511914.654972
  41. 等待結束時間 1590511914.6569717
  42. """

說明:

在上面的案例中implicitly_wait()設定等待時長為5秒。這個5秒的設定並不針對頁面上的某一個元素進行等待,也不是一個固定的等待時間。如果頁面全部元素提前載入完,不用等待全部時間。如果直到超出設定時長(5秒)還沒有定位到元素,則丟擲異常。

6、顯式等待

(1)顯式等待介紹

顯示等待是一種更智慧的等待方式。顯示等待比隱式等待更節省測試時間,個人更推薦使用顯示等待的方式來判斷頁面元素是否出現。程式會每隔一段時間(預設為0.5秒,可自定義)執行一下判斷條件,等待某個條件成立時繼續執行,否則在達到最大時長丟擲超時異常TimeoutException(實際上是until()丟擲的TimeoutException異常,這裡注意一下)。

WebDriverWait()類是由WebDirver提供的等待方法。在設定時間內,通過配合until()until_not()ExpectedCondition等條件的使用,預設每隔一段時間,輪詢檢測一次當前頁面元素是否存在,如果超過設定時間檢測不到則丟擲異常。這樣的等待方式可避免無效等待,在實際應用中推薦使用該方法。

(2)語法

  1. # 導包WebDriverWait
  2. from selenium.webdriver.support.wait import WebDriverWait
  3. # 顯示等待方法
  4. WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

說明:

  • driverWebDriver的驅動程式(IEFirefoxChrome等)。
  • timeout:最長超時時間,預設以秒為單位。
  • poll_frequency:休眠時間的間隔(步長)時間,預設為0.5秒(輪詢頻率)
  • ignored_exceptions:超時後的異常資訊,預設值ignored_exceptions=None,因為通常配合until()方法使用,until()方法預設情況下拋TimeoutException異常。

(3)until()until_not()方法

WebDriverWait()方法一般會和until()until_not()方法配合使用。

@1、until(method, message=' ')

  • method:在等待期間,每隔一段時間呼叫這個傳入的方法,直到返回值為True;
  • message:如果超時,丟擲TimeoutException,將message位置傳入異常。

@2、until_not(method, message=’ ’)

  • method:在等待期間,每隔一段時間呼叫這個傳入的方法,直到返回值為False。
  • message:如果超時,丟擲TimeoutException,將message位置傳入異常。

注:until_not是當某元素消失或什麼條件不成立則繼續執行。

(4)具體呼叫方式示例

呼叫方式如下

WebDriverWait(driver, 超時時長, 呼叫頻率(可選,有預設值), 忽略異常(可選,有預設值)).until(可執行方法, 超時時返回的資訊)

示例

  1. """
  2. 1.學習目標
  3. 必須掌握selenium中顯式等待使用方法
  4. 2.操作步驟(語法)
  5. 2.1匯入WebDriverWait類
  6. 2.2使用方法
  7. WebDriverWait(driver,timeout,pol1_frequency=0.5).until(method)
  8. driver:瀏覽器
  9. timeout:最大等待時間,單位:秒(和隱式顯示是一樣的)
  10. po11_frequency:輪詢時間
  11. until(method,message)
  12. method:將一個方法作為引數傳入
  13. 3.需求
  14. 在註冊A頁面中,使用顯示等待來定位賬號A輸入相
  15. """
  16. # 1.匯入selenium
  17. from selenium import webdriver
  18. import time
  19. from selenium.webdriver.support.wait import WebDriverWait
  20. from selenium.common.exceptions import NoSuchElementException
  21. # 2.開啟瀏覽器
  22. driver = webdriver.Chrome()
  23. # 3.開啟頁面
  24. url = "https://www.jd.com/"
  25. driver.get(url)
  26. # 4.使用顯示等待,定位元素,點選連結
  27. try:
  28. print("等待開始時間", time.time())
  29. """
  30. lambda x: x.find_element_by_link_text("秒殺")
  31. 是Python的匿名函式,主要記得這裡要傳入一個方法。
  32. x = driver
  33. 不過以後在我們的實際開發中,不這樣傳入一個方法。
  34. """
  35. login = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_link_text("秒殺"))
  36. print("等待結束時間", time.time())
  37. login.click()
  38. except NoSuchElementException as e:
  39. print(e)
  40. finally:
  41. # 5.關閉瀏覽器
  42. time.sleep(3)
  43. driver.quit()
  44. """
  45. 輸出結果:
  46. 等待開始時間 1590511979.5245922
  47. 等待結束時間 1590511979.5725648
  48. """

參考:https://www.testclass.cn/selenium_elements_wait.html