如何用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退出循环。
- 先尝试找元素1,找到则执行对应操作后
- 使用
TimeoutException而非NoSuchElementException,因为WebDriverWait超时抛出的是TimeoutException,之前的代码捕获异常类型错误也是问题之一。
之前代码的问题:
- 第一段代码只捕获了
NoSuchElementException,但WebDriverWait超时会抛出TimeoutException,且只处理了元素1的场景,遇到元素2直接报错。 - 第二段代码错误地将
driver.find_elements传入until,until需要的是预期条件(如EC.presence_of_all_elements_located),而非直接调用查找方法。 - 第三段代码的
or逻辑无效,因为WebDriverWait找不到元素会直接抛出异常,不会返回布尔值,第一个查找失败就会终止程序。
内容的提问来源于stack exchange,提问作者arnold78
相关产品推荐
相关产品推荐

