Python爬蟲: Selenium 的 expected_conditions 與 例外狀況; from selenium.webdriver.support import expected_conditions as EC ; from selenium.common.exceptions import NoSuchElementException, TimeoutException

加入好友
加入社群
Python爬蟲: Selenium 的 expected_conditions 與 例外狀況; from selenium.webdriver.support import expected_conditions as EC ; from selenium.common.exceptions import NoSuchElementException, TimeoutException - 儲蓄保險王
Python爬蟲: Selenium 的 expected_conditions 與 例外狀況; from selenium.webdriver.support import expected_conditions as EC ; from selenium.common.exceptions import NoSuchElementException, TimeoutException - 儲蓄保險王

code:

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import os
import json
from typing import List,Tuple
import time
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException, TimeoutException


locator下載=(By.CSS_SELECTOR, 'button[title="下載"]')
#:Tuple[str,str]
while True:
    try:
        # download_buttons = WebDriverWait(driver, 10).until(
        #     EC.presence_of_all_elements_located(locator下載)
      
        download_buttons = WebDriverWait(driver, 10).until(
            EC.visibility_of_all_elements_located(locator下載)
        #如果沒有先定義好 locator下載:Tuple[str,str]
        #EC.visibility_of_all_elements_located()
        #會需要(());外層是屬於function;內層是屬於tuple
        for btn in download_buttons:
            btn.click()
            time.sleep(0.5)  # 給予頁面一定的響應時間

        # 檢查下一頁按鈕是否可點擊
        # next_page_button = WebDriverWait(driver, 10).until(
        #     EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.btn-next:not([disabled])'))
        # )
        #最後一頁的時候,
        #WebDriverWait 等待條件 
        #element_to_be_clickable 不會滿足
        #因為按鈕有 disabled 屬性不可點擊)。
        #Selenium 會在等待 10 秒後拋出 TimeoutException
        #並進入 except TimeoutException 部分

        # 檢查"下一頁"按鈕是否存在
        next_page_button = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'button.btn-next'))
        )

        if next_page_button.get_attribute("disabled"): # == "true"
            print("已经是最後一页")
            break
        next_page_button.click()
"""
        # 等待頁面刷新或加載新的內
        WebDriverWait(driver, 10).until(
            EC.visibility_of_any_elements_located(locator下載)
        )
#while迴圈最一開始已經有
download_buttons = WebDriverWait(driver, 10).until(
            EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'button[title="下載"]'))
#不用多檢查一次下載按鈕是否可見
"""      
    except TimeoutException as e:
        print(f"等待超時,可能已經是最後一頁或頁面未正確加載\n{e}")
        break

    except NoSuchElementException as e:
        print(f"元素未找到,可能已經是最後一頁\n{e}")
        break

presence_of_element_located
作用:
等待單個元素存在於 DOM 中(不關心是否可見、是否可點擊)。
返回值:
匹配的單個 WebElement。
使用場景:
當你只需要確認特定元素存在於 DOM 中即可
(例如獲取屬性、內部值、
確認下一頁按鈕是否出現disabled屬性),
而不需要進行交互時使用。

presence_of_all_elements_located
作用:
等待所有與定位器匹配的元素存在於 DOM 中
(不關心是否可見)。
返回值:
匹配的 WebElement 列表。
使用場景:
當你需要確認多個元素已經加載到 DOM 中時使用
(例如,表格行、按鈕列表等)。

presence_of_any_elements_located
作用:
等待至少一個與定位器匹配的元素存在於 DOM 中
(不關心是否可見)。
返回值:
匹配的 WebElement 列表。
使用場景:
當你只需要確認是否有
至少一個匹配的元素存在於 DOM 中時使用。

visibility_of_element_located
作用:
等待單個元素存在於 DOM 中並且是可見的
(元素的 display 不為 none,
visibility 不為 hidden,且寬高大於 0)。
返回值:
匹配的單個 WebElement。
使用場景:
當你需要對單個元素進行交互(如點擊、輸入)時使用,
因為元素必須是可見的才能交互。

visibility_of_all_elements_located
作用:
等待所有與定位器匹配的元素存在於 DOM 中並且是可見的。
返回值:
匹配的 WebElement 列表。
使用場景:
當需要對多個可見的元素進行操作
(如點擊、提取文本)時使用。

visibility_of_any_elements_located
作用:
等待至少一個與定位器匹配的元素存在於 DOM 中並且是可見的。
返回值:
匹配的 WebElement 列表。
使用場景:
當你只需要確認是否有
一個可見的元素存在並對其進行操作時使用。

除了 presence 和 visibility,
還有條件如 clickable、invisibility、staleness 等,
這些條件主要用來處理特定的場景,
比如元素是否可點擊、是否消失或失效等。

但需要注意的是:
只有 presence 和 visibility 支持
all_elements 和 any_elements 的多元素範圍選擇。
其他條件(如 clickable、staleness)僅適用於單個元素。

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python爬蟲: Selenium 的 expected_conditions 與 例外狀況; from selenium.webdriver.support import expected_conditions as EC ; from selenium.common.exceptions import NoSuchElementException, TimeoutException - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *