Selenium If-Elif分支问题求解:无法定位elem2元素
问题根源与解决方案
你的代码核心问题出在提前查找elem1和elem2的时机:在try块外直接调用driver.find_element(),只要其中一个元素不存在,就会立刻抛出NoSuchElementException,程序根本走不到后面的if-elif分支。而且原有的try-except范围没覆盖元素查找步骤,完全起不到捕获异常的作用。
修正后的代码
from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC for item in list: # 避免用input作为变量名(Python内置函数) input_box = driver.find_element(By.ID, "busquedaRucId") input_box.send_keys(item) # 用显式等待替代time.sleep,更可靠 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "busquedaRucId")) ) elem1_displayed = False elem2_displayed = False # 单独检查elem1是否存在且可见 try: elem1 = driver.find_element(By.ID, 'elem1') elem1_displayed = elem1.is_displayed() except NoSuchElementException: pass # 单独检查elem2是否存在且可见 try: elem2 = driver.find_element(By.ID, 'elem2') elem2_displayed = elem2.is_displayed() except NoSuchElementException: pass if elem1_displayed: # 第一个条件的爬取代码 # code to scrape given the first condition print("处理elem1分支") elif elem2_displayed: # 第二个条件的爬取代码 # code to scrape given the second condition print("处理elem2分支") else: # 两个元素都不存在时清空输入框 input_box.clear()
关键改动说明
- 拆分元素检查逻辑:对elem1和elem2分别用try-except包裹查找操作,一个元素不存在不会影响另一个的检查。
- 调整try-except范围:把元素查找的风险操作包裹起来,避免异常中断整个循环流程。
- 替换time.sleep为显式等待:time.sleep是固定等待,显式等待会在元素加载完成后立即执行,效率更高也更稳定。
- 避免内置变量名冲突:把
input改成input_box,避免覆盖Python内置的input()函数。
内容的提问来源于stack exchange,提问作者Oliver Briceño
相关产品推荐
相关产品推荐

