webdriver 的三種等待方式(強制等待、隱式等待、顯示等待)

来源:https://www.cnblogs.com/djdjdj123/archive/2023/08/14/17629488.html
-Advertisement-
Play Games

在自動化測試腳本的運行過程中,webdriver操作瀏覽器的時候,對於元素的定位是有一定的超時時間,大致應該在1-3秒的樣子,如果這個時間內仍然定位不到元素,就會拋出異常,中止腳本執行。我們可以通過在腳本中設置等待的方式來避免由於網路延遲或瀏覽器卡頓導致的偶然失敗,常用的等待方式有三種: ### 一 ...


在自動化測試腳本的運行過程中,webdriver操作瀏覽器的時候,對於元素的定位是有一定的超時時間,大致應該在1-3秒的樣子,如果這個時間內仍然定位不到元素,就會拋出異常,中止腳本執行。我們可以通過在腳本中設置等待的方式來避免由於網路延遲或瀏覽器卡頓導致的偶然失敗,常用的等待方式有三種:

一、強制等待

強制等待是利用python語言自帶的time庫中的sleep()方法:

from time import sleep
sleep(10)

sleep()顧明思義就是睡覺的意思,就是腳本一旦執行到條語句sleep(10)就睡10s,再執行後面的語句,他是一個強制等待的方式,使得整個腳本暫停。但是這種方式會導致這個腳本運行時間過長,不到萬不得已儘可能少用,特殊情況下,時間設置最好不超過1秒,一般0.5秒。

二、隱式等待

隱式等待相比強制等待更智能,顧明思義,在腳本中我們一般看不到等待語句,但是它會在每個頁面載入的時候自動等待;隱式等待只需要聲明一次,一般在打開瀏覽器後進行聲明。聲明之後對整個drvier的生命周期都有效,後面不用重覆聲明。

driver = webdriver.Chrome()
driver.implicitly_wait(10)

implicitly_wait()方法用來等待頁面載入完成(直觀的就是瀏覽器tab頁上的小圈圈轉完),implicitly_wait(10),超時時間10s,10秒內一旦載入完成,就執行下一條語句;如果10秒內頁面都沒有載入完,就超時拋出異常。隱式等待在自動化測試中的運用,看代碼:

from selenium import webdriver
import unittest
 
class TestBase(unittest.TestCase):
  def setUp(self):
    self.driver=webdriver.Chrome() #驅動瀏覽器
    self.driver.implicitly_wait(10) #設置隱式等待
    self.driver.maximize_window() #最大化瀏覽器
  def test(self): 
    print('這是一個測試用例')
  def tearDown(self):
    self.driver.quit()
if __name__=='__main__':
  unittest.main()

但是隱式等待依然存在一個問題,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步。所以,這裡webdriver提供了一種更加智能的等待方式:顯示等待

三、顯示等待

顯示等待與隱式等待相對,顯示等待必須在每個需要等待的元素前面進行聲明。

#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions類,並重命名為EC
from selenium.webdriver.support expected_conditions as EC
#引入By類
from selenium.webdriver.common.by import By
# Python小白學習交流群:711312441
#設置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))

顯示等待需要用到兩個類:

WebDriverWait和expected_conditions兩個類。

1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:瀏覽器驅動

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

poll_frequency:檢測的間隔步長,預設為0.5s

ignored_exceptions:超時後的拋出的異常信息,預設拋出NoSuchElementExeception異常。

WebDriverWait()中的until()和until_not()方法:

  • until

method: 在等待期間,每隔一段時間(__init__中的poll_frequency)調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常

  • until_not

與until相反,until是當某元素出現或什麼條件成立則繼續執行,
until_not是當某元素消失或什麼條件不成立則繼續執行,參數也相同。

2、expected_conditions類

各種類,達到某種條件,返回True和False

常用條件:

條件 說明
presence_of_element_located 判斷某個元素是否被加到了DOM樹里,並不代表該元素一定可見
visibility_of_element_located 判斷某個元素是否可見,可見代表元素非隱藏,並且元素的寬和高都不等於0

關於顯示等待,也可以自己寫條件:

#設置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函數
wait.until(lambda diver:driver.find_element_by_id('kw'))

顯示等待是一種智能程度較高的等待方式,可以有效的增強腳本的健壯性,以下條件適用:

當打開一個新頁面,執行第一個元素操作的時候
當某一步操作會引發頁面的載入,並且載入的內容包含了下一步需要操作的元素。一句話,就是當某個元素有載入過程的時候,就需要加上顯示等待。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # Electron-builder打包和自動更新 # 前言 文本主要講述如何為 electron 打包出來軟體配置安裝引導和結合 github 的 release 配置自動更新。 electron-builder 是將 Electron 工程打包成相應平臺的軟體的工具,我的工程是使用 [elect ...
  • 最近前輩推薦我讀《設計模式之禪》這本書,原因是我寫的代碼質量實在是一言難盡,開發速度很快,但是bug數就很多了,設計原則這種知識就需要掌握 寫這篇文主要是記錄自己的學習以及督促自己 第一章【單一職責】 從我理解的層面來談談單一原則:明確每個類每個方法的任務,只做一件事,不能一法兩用 這也是我最大的一 ...
  • # 加油站圈存機系統 ​ 對於加油卡而言,圈存是將`用戶賬戶`中已存入的資金劃轉到所持的加油卡上後方可使用。通俗一點的說法就是您在網點把錢存入主卡中,再分配到下麵的副卡,由於副卡都在使用車輛的駕駛員手中,需要在加油的時候在加油站讓加油站員工劃一下即可,就是所謂的圈存。 #### 圈存操作流程 ​ 如 ...
  • 電商系統中秒殺是一種常見的業務場景需求,其中核心設計之一就是如何扣減庫存。本篇主要分享一些常見庫存扣減技術方案,庫存扣減設計選擇並非一味追求性能更佳,更多的應該考慮根據實際情況來進行架構取捨... ...
  • springboot項目通常配合mybatisplus來做數據CRUD。 我們在查詢或更新數據的時候,有時要用到in來過濾數據。比如SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,130540525947283 ...
  • Lua程式設計第四版第二部分編程實操自做練習題答案,帶:star:為重點。 ## 9.1 > 請編寫一個函數integral,該函數以一個函數f為參數並返回其積分的近似值 使用右矩陣法近似積分值 ```lua function integral(f) return function(a, b) lo ...
  • 如果一個變數應該有一個固定的、不能改變的值,你可以使用`const`關鍵字。 `const`關鍵字將變數聲明為"常量",這意味著它是**不可改變和只讀**的。 **語法** `const CONSTNAME type = value` ## 聲明常量 聲明常量的示例: ```Go package m ...
  • 最近在寫支付的東西,調試時候需要讓支付平臺能夠回調本地介面來更新支付成功的狀態。但由於開發機器沒有公網IP,所以需要使用內網穿透來讓支付平臺能夠成功訪問到本地開發機器,這樣才能更高效率的進行調試。 推薦內網穿透的文章已經很多很多,還有很多大合集的推薦,但也因為推薦的太多,也會讓人眼花繚亂,不斷嘗試不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...