You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+Selenium编写多场景判断的循环脚本?

解决方案

你的核心问题是每次尝试查找元素时,只要其中一个不存在就会抛出异常导致程序终止,而非继续判断另一个元素。需要在内部对两个元素的查找分别做异常处理,或使用更灵活的等待方式判断元素是否存在。

以下是可行的代码实现:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
import time

while True:
    try:
        # 点击下拉菜单,超时找不到则退出循环
        btnOptions = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "/html/body/div...."))
        ).click()
        
        # 尝试查找元素1,超时10秒
        try:
            element1 = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "//*[text()='My text1']"))
            )
            element1.click()
            # 执行元素1对应的后续操作
            WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "/html/body/...."))
            ).click()
            time.sleep(2)
            # 重启循环,回到点击下拉菜单步骤
            continue
        except TimeoutException:
            # 元素1不存在,尝试查找元素2
            pass
        
        # 尝试查找元素2,超时10秒
        try:
            element2 = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "//*[text()='My text2']"))
            )
            element2.click()
            # 执行元素2对应的后续操作
            WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "/html/body/...."))
            ).click()
            time.sleep(2)
            # 重启循环
            continue
        except TimeoutException:
            # 两个元素都不存在,退出循环
            break
            
    except TimeoutException:
        # 下拉菜单找不到,退出循环
        break

代码说明:

  • 外层try-except处理下拉菜单的查找超时,确保找不到下拉菜单时正常退出循环。
  • 内部嵌套try-except分别处理元素1和元素2的查找:
    • 先尝试找元素1,找到则执行对应操作后continue重启循环。
    • 若元素1超时未找到,跳过并尝试找元素2,找到则执行操作后重启循环。
    • 若两个元素都找不到,触发break退出循环。
  • 使用TimeoutException而非NoSuchElementException,因为WebDriverWait超时抛出的是TimeoutException,之前的代码捕获异常类型错误也是问题之一。

之前代码的问题:

  1. 第一段代码只捕获了NoSuchElementException,但WebDriverWait超时会抛出TimeoutException,且只处理了元素1的场景,遇到元素2直接报错。
  2. 第二段代码错误地将driver.find_elements传入until,until需要的是预期条件(如EC.presence_of_all_elements_located),而非直接调用查找方法。
  3. 第三段代码的or逻辑无效,因为WebDriverWait找不到元素会直接抛出异常,不会返回布尔值,第一个查找失败就会终止程序。

内容的提问来源于stack exchange,提问作者arnold78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:30:43