提升 Selenium 測試穩定性的秘訣:深入理解等待 API 的使用

目錄

  1. 為什么需要等待
  2. Selenium 等待 API 簡介
  3. 隱式等待
  4. 顯式等待
  5. Fluent Wait
  6. 等待策略的選擇
  7. 示例代碼
  8. 總結

正文

1. 為什么需要等待

在 Web 自動化測試中,等待是一個關鍵因素。網絡應用通常是動態的,頁面加載時間、元素的顯示時間都可能不同步。直接操作這些元素可能會導致 NoSuchElementException 或者 ElementNotVisibleException 等錯誤。因此,等待機制可以幫助我們確保元素加載完成后再進行操作,從而提高測試的穩定性和可靠性。

2. Selenium 等待 API 簡介

Selenium 提供了三種主要的等待機制:

  • 隱式等待 (Implicit Wait)
  • 顯式等待 (Explicit Wait)
  • Fluent Wait

3. 隱式等待

隱式等待是全局設置的一種等待方式,它會在查找元素時等待一定的時間,默認時間為 0 秒。

from selenium import webdriverdriver = webdriver.Chrome()
driver.implicitly_wait(10)  # 設置隱式等待時間為 10 秒
driver.get("http://www.example.com")element = driver.find_element_by_id("element_id")

當元素未立即可見時,WebDriver 將會每隔一段時間檢查一次,直到達到指定的等待時間。如果在規定時間內找到了元素,將立即返回,否則拋出 NoSuchElementException

4. 顯式等待

顯式等待是針對特定元素的等待,它在等待條件滿足前會定期檢查元素的狀態。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("http://www.example.com")try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "element_id")))
finally:driver.quit()

WebDriverWait 結合 expected_conditions 模塊可以靈活地等待元素的不同狀態,如元素的可見性、元素的可點擊性等。
expected_conditions 是 Selenium 提供的一組條件類,用于顯式等待。這些條件可以用來判斷特定元素或頁面狀態,以決定是否繼續執行后續的操作。以下是一些常用的 expected_conditions 及其示例說明:

常用的 expected_conditions
  1. title_is
  2. title_contains
  3. presence_of_element_located
  4. visibility_of_element_located
  5. visibility_of
  6. presence_of_all_elements_located
  7. text_to_be_present_in_element
  8. text_to_be_present_in_element_value
  9. frame_to_be_available_and_switch_to_it
  10. invisibility_of_element_located
  11. element_to_be_clickable
  12. staleness_of
  13. element_to_be_selected
  14. element_located_to_be_selected
  15. alert_is_present
示例說明
1. title_is

等待頁面標題等于指定值。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver, 10).until(EC.title_is("Expected Title"))
2. title_contains

等待頁面標題包含指定文本。

WebDriverWait(driver, 10).until(EC.title_contains("Partial Title"))
3. presence_of_element_located

等待元素出現在頁面上。

from selenium.webdriver.common.by import Byelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "element_id"))
)
4. visibility_of_element_located

等待元素可見。

element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "element_id"))
)
5. visibility_of

等待一個已知元素對象可見。

element = driver.find_element_by_id("element_id")
WebDriverWait(driver, 10).until(EC.visibility_of(element))
6. presence_of_all_elements_located

等待一組元素全部出現在頁面上。

elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "class_name"))
)
7. text_to_be_present_in_element

等待元素中包含指定文本。

WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, "element_id"), "Expected Text")
)
8. text_to_be_present_in_element_value

等待元素的值包含指定文本。

WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value((By.ID, "input_id"), "Expected Value")
)
9. frame_to_be_available_and_switch_to_it

等待 iframe 可用并切換到該 frame。

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "frame_name"))
)
10. invisibility_of_element_located

等待元素不可見。

WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.ID, "element_id"))
)
11. element_to_be_clickable

等待元素可點擊。

element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "clickable_element_id"))
)
element.click()
12. staleness_of

等待元素不再附加在 DOM 樹上。

element = driver.find_element_by_id("stale_element_id")
WebDriverWait(driver, 10).until(EC.staleness_of(element))
13. element_to_be_selected

等待元素被選中。

element = driver.find_element_by_id("select_element_id")
WebDriverWait(driver, 10).until(EC.element_to_be_selected(element))
14. element_located_to_be_selected

等待特定定位器的元素被選中。

WebDriverWait(driver, 10).until(EC.element_located_to_be_selected((By.ID, "select_element_id"))
)
15. alert_is_present

等待警告框出現。

WebDriverWait(driver, 10).until(EC.alert_is_present())
alert = driver.switch_to.alert
alert.accept()

通過這些 expected_conditions,你可以更加靈活地控制 Selenium 測試的等待邏輯,確保測試腳本在正確的時間點進行操作。

5. Fluent Wait

Fluent Wait 是顯式等待的一種擴展,它允許我們定義等待的最大時間、輪詢的頻率以及在等待期間遇到的異常處理。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutExceptiondriver = webdriver.Chrome()
driver.get("http://www.example.com")wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[TimeoutException])
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))

Fluent Wait 通過指定輪詢頻率,可以更精確地控制等待行為。

6. 等待策略的選擇

選擇合適的等待策略取決于測試的具體需求:

  • 隱式等待 適用于大部分情況下的全局設置,但可能導致調試困難,因為它在所有元素查找時都生效。
  • 顯式等待 提供了更精確的控制,適用于需要等待特定條件的場景。
  • Fluent Wait 是顯式等待的高級版本,適用于需要自定義輪詢頻率和異常處理的復雜場景。

7. 示例代碼

綜合使用不同等待機制的示例代碼:

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 ECdriver = webdriver.Chrome()
driver.get("http://www.example.com")# 設置隱式等待
driver.implicitly_wait(10)try:# 使用顯式等待element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "element_id")))# 使用 Fluent Waitwait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[TimeoutException])element = wait.until(EC.element_to_be_clickable((By.ID, "clickable_element_id")))element.click()
finally:driver.quit()

8. 總結

等待機制在 Selenium 測試中起到了至關重要的作用。通過合理選擇和使用隱式等待、顯式等待和 Fluent Wait,可以大大提高自動化測試的穩定性和可靠性。希望這篇博客能幫助你更好地理解和應用 Selenium 的等待 API,在實際項目中寫出更加健壯的測試用例。


希望這個博客大綱和詳細內容對你有所幫助!如果有任何進一步的問題或需要更多示例,請隨時告訴我。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37348.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

致敬經典:在國產開源操作系統 RT-Thread 重溫 UNIX 彩色終端

引言 上篇文章里我們向大家介紹了 RT-Thread v5.1.0 的一些新特性。其中包括了終端環境的進一步完善。終端是人機交互的重要接口。實用的終端工具可以顯著地提升系統使用者的幸福指數。舉例來說,當我們想要修改一些系統配置,或是編寫腳本時,一…

Linux——echo命令,管道符,vi/vim 文本編輯器

1.echo 命令 作用 向終端設備上輸出字符串或變量的存儲數據 格式 echo " 字符串 " echo $ 變 量名 [rootserver ~] # echo $SHELL # 輸出變量的值必須加 $ /bin/bash [rootserver ~] # str1" 我愛中國 " # 自定義變量 echo 重定向輸出到文件 ec…

MySQL數據庫——在Centos7環境安裝

MySQL在Centos7環境安裝 1.切換root用戶 安裝與卸載中,用戶全部切換成為root,安裝好后,普通用戶也能使用 2.卸載不要的環境 要將自己環境中有關mysql的全都刪除,避免安裝過程中被影響 ps axj | grep mariadb 先檢查是否有mari…

近似最近鄰查找的幾種方法

近似最近鄰查找 定義主要方法1. 局部敏感哈希(LSH)2. KD樹(k-d tree)3. 球樹(Ball Tree)4. 隨機投影樹(Random Projection Trees)5. 圖結構方法(Graph-Based Methods&…

自制全網最便宜的雷達感應燈光畫,成本只需5元

自制全網最便宜的雷達感應燈光畫,成本5元 ? 成本組成:帶熱釋電的人體感應燈(0.5元)雷達感應模塊(3.5元)首飾盒(0.45元)微噴油畫布(1元)5.45元 ? 說一下做燈…

Flutter學習:從搭建環境到運行

一、開發環境的搭建 本文所示內容都是在Windows系統下進行的。 1、下載 Flutter SDK Flutter 官網(https://docs.flutter.cn/release/archive?tabwindows) 或者通過 git clone -b master https://github.com/flutter/flutter.git 下載 2、配置環境…

[數據集][目標檢測]井蓋未蓋好檢測數據集VOC+YOLO格式20123張2類別

數據集格式:Pascal VOC格式YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數):20123 標注數量(xml文件個數):20123 標注數量(txt文件個數):20123 標…

Gamepad API 控制游戲的 JavaScript 指南

在現代網頁游戲中,通過游戲手柄來控制游戲是一種常見的需求。HTML5 提供了一個名為 Gamepad API 的接口,使得從瀏覽器中讀取游戲手柄輸入變得相對簡單。 什么是 Gamepad API? Gamepad API 是 HTML5 的一部分,允許開發者通過 Jav…

.net 奇葩問題調試經歷之2——內存暴漲,來自非托管的內存泄露

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,我們面對的不僅僅是技術還有人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔序言 這是一個序列文章,請看以往文…

AI推介-信息抽取(information extraction,NER)論文速覽(arXiv方向):2023.11.15-2023.12.31

文章目錄~ 1.Large Language Models for Generative Information Extraction: A Survey2.Commonsense for Zero-Shot Natural Language Video Localization3.Unified Lattice Graph Fusion for Chinese Named Entity Recognition4.Solving Label Variation in Scien…

代碼統計工具V1.0.0(支持各種文件類型)

點擊下載《代碼統計工具(支持各種文件類型)》 1. 前言 本文介紹了一款使用C#開發的代碼行數統計軟件。該軟件允許用戶通過選擇文件目錄和設置統計項目類型,來統計指定目錄下的代碼行數。軟件提供了三種統計方式:按文件名統計、按…

線性圖標繪制指南:從基礎到精通

圖標在生活中隨處可見。相比文字來說,圖標可以讓人在更短的時間內認知并了解信息,并且大大提升信息的視覺美觀性,增加設計的藝術感染力。在用戶界面中使用圖標,是一種用戶熟知的設計模式。而線性圖標是通過提煉圖形輪廓&#xff0…

jquery動態插件之gsap和TextPlugin

<!DOCTYPE html> <html> <head><title>數字化人才認證數動畫</title><script src"https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script src"https://cdnjs.cloudflare.com/ajax…

【強化學習】第02期:動態規劃方法

筆者近期上了國科大周曉飛老師《強化學習及其應用》課程&#xff0c;計劃整理一個強化學習系列筆記。筆記中所引用的內容部分出自周老師的課程PPT。筆記中如有不到之處&#xff0c;敬請批評指正。 文章目錄 2.1 動態規劃&#xff1a;策略收斂法/策略迭代法2.2 動態規劃&#xf…

GD32F4時鐘配置

1.前言 硬件&#xff1a;GD32F450 最高時鐘頻率200MHZ(外部晶振8MHZ) 軟件&#xff1a;KEIL(V5.35) 固件包&#xff1a;GD32F4xx_Firmware_Library_V3.2.0 2.時鐘樹 時鐘配置大概流程如下圖紅線指示&#xff0c;GD32F470的最高頻率可以到240MHZ&#xff0c;GD32F450最高…

【frp】cron定時檢查zfrpc.service是否啟動成功

zfrpc 經常自動啟動失敗cron定時檢查zfrpc.service是否啟動成功 ChatGPT 要使用 cron 定期檢查 zfrpc.service 是否啟動成功,并在服務未運行時嘗試啟動它,你可以按照以下步驟進行操作: 創建腳本 首先,你需要創建一個腳本,這個腳本將檢查 zfrpc.service 的狀態,并在服務未…

字符串反轉字符串單詞(1)

大家好&#xff0c;今天我們來探討一道經典的編程問題——翻轉字符串里的單詞。這個問題要求我們編寫一個函數&#xff0c;將輸入字符串中的所有單詞進行翻轉&#xff0c;但單詞內部的字符順序保持不變。 問題分析&#xff1a; 1. 首先&#xff0c;我們需要理解翻轉字符串里的…

Codeforces Round 143 (Div. 2) C. To Add or Not to Add 題解 前綴和 二分

To Add or Not to Add 題目描述 A piece of paper contains an array of n n n integers a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1?,a2?,...,an?. Your task is to find a number that occurs the maximum number of times in this array. However, before l…

點云壓縮配置開發環境遇到一些bug

1、配置基于cuda的計算庫&#xff0c;Chamfer3D和pointops 編譯chamfer3D時候會遇到一個cub版本的校驗錯誤。 解決方法&#xff1a;根據錯誤提示&#xff0c;進入cuda的config配置文件中&#xff0c;使用#define將校驗功能關閉 編譯pointops&#xff0c;會遇到報錯&#xff1a;…

C++Primer Plus 第十四章代碼重用:14.4.4 數組模板示例和非類型參數2

14.4.4 數組模板示例和非類型參數 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右…