iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

在爬蟲時往往會需要等待頁面加載完成後才可以正確的讀到想要尋找的元素,而Selenium裡就有提供幾種等待元素的方式,讓我們一起來看看。

Selenium等待的方法有以下幾種:

  1. 隱式等待(Implicit Waits)
  • 使用driver.implicitly_wait()方法設置等待時間,單位為秒。
  • 這個設置會應用於當前driver的所有查找元素語句(全域)。
  • 它會在特定條件達成前,反覆運行查找元素語句,直到超過指定時間。
  • 如果元素可以在指定時間內找到,則返回元素。如果超時,則拋出NoSuchElementException異常。
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
myElement = driver.find_element_by_id("someId")
  1. 顯式等待(Explicit Waits)
  • 使用WebDriverWait類和expected_conditions類進行顯式等待。
  • 它會在特定條件達成前,反覆運行查找元素語句,直到超過指定時間。
  • 特定條件可以是檢查元素是否可見、是否可點擊、是否包含特定文本等。更多可見官方文檔
  • 如果元素可以在指定時間內找到,則返回元素。如果超時,則拋出超時異常。
  • 可接受參數為如下,其中可把until()換成until_not()就是當條件不符合時。
WebDriverWait(driver, 等待的最長時間, 檢查條件的頻率, 忽略的例外類別).until(expected_conditions條件, 超時例外的錯誤訊息)
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 EC

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
  1. 強制等待
  • 使用time.sleep()在設置的秒數后繼續執行。
  • 簡單直接,但不建議,因為它會暫停整個測試執行。
import time

time.sleep(5) # seconds
myElement = driver.find_element_by_id("someId") 

所以總結來說,建議使用隱式等待來設置全局等待時間,並在需要等待特定條件時,使用顯式等待。避免使用sleep()方法因為它會影響測試執行效率。


在上面提到了使用expected_conditions來尋找特定條件是否符合而Selenium中的expected_conditions類提供了多種可用條件,常見的有:

  • title_is - 頁面title符合預期
  • title_contains - 頁面title包含預期文字
  • presence_of_element_located - 元素出現在DOM中
  • visibility_of_element_located - 元素可見
  • element_to_be_clickable - 元素可點擊
  • element_to_be_selected - 元素被選中
  • alert_is_present - 警告框出現

些外還有:

  • text_to_be_present_in_element - 元素包含預期文字
  • invisibility_of_element_located - 元素不可見
  • element_to_be_selected - 元素被選中
  • staleness_of - 元素不在DOM或不可見

使用範例:

wait.until(EC.title_is("Expected Title"))
wait.until(EC.element_to_be_clickable((By.ID, 'submit')))

所以expected_conditions提供了很多種條件選擇,可以根據實際需要構建顯式等待。


上一篇
[DAY9]Selenium尋找元素
下一篇
[DAY11]Selenium點擊和輸入
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言