【筆記】Selenium的三種等待方式

更新於 發佈於 閱讀時間約 9 分鐘
為了更好的讓程式運行,或多或少會需要使用等待方式,順利的讓driver取得元素後順利運行,本篇會提到Selenium的三種等待方式,以及常用的操作語法。

等待方式有三種,分別是強制等待、隱性等待、顯性等待:

強制等待

from time import sleep ​
#強制等待10秒​
sleep(10)

強制等待在不管任何情況下,等待設定的時間,簡單易用,等待期間會完全暫停程式的執行,可用於單純的等待場景。

缺點:因為是無條件的固定等待時間,在一些比較複雜的情況下無法設定自己想要的情境,如果使用強制等待的目的是讓頁面某個元素出現,即便元素出現了,也是要繼續等待。


隱性等待

#隱性等待10秒​
driver.implicitly_wait(10)

隱性等待不用導入任何套件,是一個全局設定,整個WebDriver都適用,當等待元素出現在頁面時,就會繼續執行後面的程式,或是等待設定的秒數。

可以跟顯性等待混用,會取時間長的那個。

缺點:等待時間不夠精確,每個場景所需要的等待時間不一定一樣,沒辦法個別針對場景進行設定等待時間,會造成資源不必要的浪費,另外也沒有辦法特定等待條件:比如點一個按鈕,才會出現提示框,這種隱性等待就沒有辦法處理。


顯性等待

#顯性等待​
from selenium.webdriver.support.ui import WebDriverWait
#預期條件函數,網頁元素在瀏覽器中的的出現、可見、可點擊
from selenium.webdriver.support import expected_conditions
#等待超時異常處理
from selenium.common.exceptions import TimeoutException

#創造一個顯性等待,等待時間20秒,每1秒檢查一次、忽略找不到元素的錯誤​
driver_wait = WebDriverWait(driver, timeout=20, poll_frequency=1, ignored_exceptions=[NoSuchElementException])

顯性等待可以設定許多條件,來達到完全我們需要的場景,明確等待某個特定條件,等出現後才會去執行:


timeout,等待時間,以秒為單位,強制等待跟隱性等待的等待時間也是以秒為單位。

poll_frequency,指定等待條件檢查的頻率,以秒為單位,預設值是0.5秒,可以不設定,如果不設定的情況下,那WebDriver會按照預設值每0.5秒檢查一次元素是否出現,有設定則按照預設值。

ignored_exceptions,在等待期間希望忽略的例外錯誤,有些錯誤會導致程式的中斷,它可以很好的讓程式順利運行,常見的忽略類型如下:

  • NoSuchElementException:找不到元素,就是你的元素定位定錯了,可能多字或少字,或是方法錯了,比如NAME你用ID去搜。


  • TimeoutException:在設定的等待時間內仍找不到元素,有可能未加載完全或是其他原因導致。


  • StaleElementReferenceException:訪問已不存在的元素,原先存在的元素,因為進行了某些操作,該元素不見或是刷新頁面導致。


  • ElementNotVisibleException:當元素存在但不可見時,比如頁面把元素藏起來了,display: none 或是visibility: hidden,或是在頁面以外,需要往下滑動才會看到。


  • ElementNotSelectableException:當元素存在但不可點擊,比如登入按鈕需要帳號密碼都輸入才能點登入,如果帳號密碼沒有輸入時,就會出現此情況。

顯性等待語法我們可以簡化成:

#去除掉​參數文字,簡化的情況下,順序一定要是 時間、頻率、忽略例外錯誤
driver_wait = WebDriverWait(driver, 20, 0.5, [NoSuchElementException])

如果想同時忽略多個例外錯誤,直接後面繼續加就可以了:

#同時忽略多個錯誤
driver_wait = WebDriverWait(driver, 20, 1, [NoSuchElementException, ElementNotVisibleException, StaleElementReferenceException])


顯性等待實際使用

#這裡我們拿expected_conditions的字首e跟c出來取別名叫做EC,不然整串程式碼太長了
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException

​driver.get("https://www.google.com/")

#等待時間20秒,搜尋頻率1秒一次​
driver_wait = WebDriverWait(driver,20,1)

#顯性等待抓取元素​
search_box = driver_wait.until(EC.presence_of_element_located((By.NAME,"q")))

#隱性等待抓取元素​(對照組)
search_box = driver.find_element(By.NAME,"q")

說明:

1.創建WebDriverWait的物件時,需要有兩個參數是必要的,分別是瀏覽器的控制跟等待時間,這裡我們瀏覽器的控制是"driver",後面必填的是等待時間(timeout),至於頻率跟忽略例外錯誤是選配,可加可不加。

2.需要三層( )的原因是:

driver_wait.until( ) 第一層,用來指示要使用顯性等待。

EC.presence_of_element_located( )第二層,表示要使用的方法,像這裡是使用"元素出現"這個等待條件。

(By.NAME,"q")第三層,定位元素本身作為一種參數,外面需要一層套用在第二層上。

以下是 expected_conditions,或是說顯性等待常見的幾種等待條件:

presence_of_element_located:元素出現,元素存在DOM中並可以使用元素定位方法取得,字尾"located"指的是Locator(元素定位方法),像是(By.NAME,"皮卡丘")。

#​presence_of_element_located
search_box = driver_wait.until(EC.presence_of_element_located((By.NAME,"q")))


presence_of_all_elements_located:所有元素出現,元素存在DOM,並透過元素定位方法,把指定的元素都找出來,並形成一個陣列。

#​presence_of_all_elements_located
search_results = driver_wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.g")))


visibility_of_element_located:元素可見,元素存在瀏覽器畫面上,即元素沒有被隱藏(display:none、visibility:hidden),並且高寬都大於0,可用Locator定位。

#​visibility_of_element_located
search_box = driver_wait.until(EC.visibility_of_element_located((By.NAME,"q")))


element_to_be_clickable:元素可點擊,元素存在瀏覽器畫面,沒有被隱藏,並且可點擊,可用Locator定位。

#​element_to_be_clickable
search_box = driver_wait.until(EC.element_to_be_clickable((By.NAME,"q")))
search_box.click()


text_to_be_present_in_element:文本出現,等待網頁DOM可見,並且指定的元素出現特定的文本。

#​text_to_be_present_in_element
search_box = driver_wait.until(EC.text_to_be_present_in_element((By.ID, "pikachu"), "皮卡丘"))


alert_is_present:出現彈出窗口,當瀏覽器畫面出現彈窗時,做相應的處理。

#​alert_is_present,出現彈窗,印出提示,並接受
alert = driver_wait.until(EC.alert_is_present())
alert_text = alert.text
print("彈窗內容顯示:", alert_text)
alert.accept()


註:DOM,文件物件模型(Document Object Model),簡單來說就是瀏覽器開發者模式中,元素分頁那頁的內容。


至於顯性等待的缺點:它有點複雜



avatar-img
21會員
18內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
  一種想法可能會覺得,這是我們的體感問題,很快搭到車的時候我們不會特別注意,但如果等待時間久一點,我們就會特別不高興,也會特別印象深刻。我同意會有這種狀況,但事實是,即便不關於這種體感差異,我們等公車的時間就是會比「隨機等公車的理論值」--「二分之一車班間距」來得更長一些。這便關連到了檢查悖論。
Thumbnail
給定一個陣列,分別代表每位顧客的抵達時間和廚師準備時間。請問平均的等待時間是多少? 等待時間定義為客人開始真正用餐的時間 - 客人抵達的時間。演算法為計算廚師的出餐時間。
Thumbnail
Selenium 是一個範圍廣泛的工具和函式庫的總稱專案,用於啟用和支援網頁瀏覽器的自動化。Selenium WebDriver 提供了 C#、JavaScript、Java、Python、Ruby 等多種語言的 API,可以用於編寫自動化測試軟體。 在定位元素時,WebDriver 提供對這 8
Thumbnail
等待著 等待著什麼 等待著車子在保養 等待著等會兒要去學校上課 等待著下午還要上班 等待著晚上還要上課 等待著回家和孩子玩抱抱 等待著整理一天的情緒 等待著反省 等待著睡眠 等待著夜裏睡眠的夢 等待著明晨的晨泳 等待著生命的日漸耗損 等待著生命無悔的等待 等待著等待  
Thumbnail
[等待] 有些事 就是要用一天 一天等待 有些地方 就是要一步 一步走 才會抵達 有些重要的東西 就是要一點一滴流逝 才能發覺它的重要
Thumbnail
可能包含敏感內容
迫不及待行動,耐心等待結果
Thumbnail
看到標題的朋友可能會覺得奇怪, 我們常常看到的不就是time.sleep嗎? 怎麼又多出了asyncio.sleep呢? 這兩者究竟差異在哪邊呢? 我們都知道sleep就是睡眠的意思, 那麼在程式的運作上就是等待, 等待一段時間之後繼續完成任務, time.sleep的部份很好理解, 就是在該段程
Thumbnail
很明顯是這「等待」帶來了細胞轉變。正是這「等待」使我成為了「存在」。正是這「等待」停止了舊的行為模式。
Thumbnail
關於「等待」它到底是一個正向辭彙還是一個負面語詞呢?等待的目的為何?等待的過程又是怎樣的心境?生命中有太多等待,我們必須學會等待,還要學會習慣眾多不盡如人意的等待。有時,等待也可以視為人生旅途中的一段小憩,小憩結束了,我們的旅途還要繼續,繼續下一個等待。 
Thumbnail
你有沒有常常覺得在漫長的歲月中, 大家都汲汲營營地往目標前去; 而你就像歲月停滯怠惰不前的感覺, 在某個時期浸至在其中 ? 在等待這段復原的時間內我常常這麼覺得, 日子在我這裡只是數字不斷變化; 像水流一般經過不曾為我留戀停留, 等待卻如此漫長。 今天是開工日不能免俗的我也來
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
  一種想法可能會覺得,這是我們的體感問題,很快搭到車的時候我們不會特別注意,但如果等待時間久一點,我們就會特別不高興,也會特別印象深刻。我同意會有這種狀況,但事實是,即便不關於這種體感差異,我們等公車的時間就是會比「隨機等公車的理論值」--「二分之一車班間距」來得更長一些。這便關連到了檢查悖論。
Thumbnail
給定一個陣列,分別代表每位顧客的抵達時間和廚師準備時間。請問平均的等待時間是多少? 等待時間定義為客人開始真正用餐的時間 - 客人抵達的時間。演算法為計算廚師的出餐時間。
Thumbnail
Selenium 是一個範圍廣泛的工具和函式庫的總稱專案,用於啟用和支援網頁瀏覽器的自動化。Selenium WebDriver 提供了 C#、JavaScript、Java、Python、Ruby 等多種語言的 API,可以用於編寫自動化測試軟體。 在定位元素時,WebDriver 提供對這 8
Thumbnail
等待著 等待著什麼 等待著車子在保養 等待著等會兒要去學校上課 等待著下午還要上班 等待著晚上還要上課 等待著回家和孩子玩抱抱 等待著整理一天的情緒 等待著反省 等待著睡眠 等待著夜裏睡眠的夢 等待著明晨的晨泳 等待著生命的日漸耗損 等待著生命無悔的等待 等待著等待  
Thumbnail
[等待] 有些事 就是要用一天 一天等待 有些地方 就是要一步 一步走 才會抵達 有些重要的東西 就是要一點一滴流逝 才能發覺它的重要
Thumbnail
可能包含敏感內容
迫不及待行動,耐心等待結果
Thumbnail
看到標題的朋友可能會覺得奇怪, 我們常常看到的不就是time.sleep嗎? 怎麼又多出了asyncio.sleep呢? 這兩者究竟差異在哪邊呢? 我們都知道sleep就是睡眠的意思, 那麼在程式的運作上就是等待, 等待一段時間之後繼續完成任務, time.sleep的部份很好理解, 就是在該段程
Thumbnail
很明顯是這「等待」帶來了細胞轉變。正是這「等待」使我成為了「存在」。正是這「等待」停止了舊的行為模式。
Thumbnail
關於「等待」它到底是一個正向辭彙還是一個負面語詞呢?等待的目的為何?等待的過程又是怎樣的心境?生命中有太多等待,我們必須學會等待,還要學會習慣眾多不盡如人意的等待。有時,等待也可以視為人生旅途中的一段小憩,小憩結束了,我們的旅途還要繼續,繼續下一個等待。 
Thumbnail
你有沒有常常覺得在漫長的歲月中, 大家都汲汲營營地往目標前去; 而你就像歲月停滯怠惰不前的感覺, 在某個時期浸至在其中 ? 在等待這段復原的時間內我常常這麼覺得, 日子在我這裡只是數字不斷變化; 像水流一般經過不曾為我留戀停留, 等待卻如此漫長。 今天是開工日不能免俗的我也來