Python Selenium代码未找到HTML元素时如何避免中止并继续运行
解决方案
WebDriverWait的until方法在规定时间内未满足等待条件时,会抛出TimeoutException异常导致程序中止,你只需要通过try-except捕获该异常即可实现失败后继续运行的效果。
第一步:导入异常类
先在代码顶部引入对应的异常类:
from selenium.common.exceptions import TimeoutException
第二步:封装通用操作函数(推荐,大幅简化重复代码)
你当前的三段代码逻辑完全一致,都是「点击选择框→输入关键词→点击匹配选项」,可以封装成通用函数减少重复代码,同时统一处理异常:
def fill_select_field(driver, click_xpath, input_xpath, option_xpath, input_content, field_name): try: # 点击选择框 WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, click_xpath))).click() # 定位输入框并输入内容 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, input_xpath))) element.send_keys(input_content) time.sleep(0.2) # 点击匹配选项 WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, option_xpath))).click() print(f"{field_name} - {input_content}") except TimeoutException: # 元素未找到时打印提示,程序继续执行 print(f"操作失败:未找到{field_name}对应的页面元素,跳过该字段填写") return
第三步:替换原有代码
原来的三段重复代码可以直接替换为三次函数调用:
# 填写目的地城市 fill_select_field( driver=driver, click_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[11]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/div[1]/span[1]", input_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[11]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/input[1]", option_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[11]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/ul[1]/li[1]/div[3]/span[1]/div[1]", input_content=destin_city[:3], field_name="DESTINATION CITY" ) # 填写运费支付类型 fill_select_field( driver=driver, click_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[12]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/div[1]/span[1]/span[1]", input_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[12]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/input[1]", option_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[12]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/ul[1]/li[1]/div[3]/span[1]/div[1]", input_content=f_payment[:3], field_name="FREIGHT PAYMENT TYPE" ) # 填写货币类型 fill_select_field( driver=driver, click_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[13]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/div[1]/span[1]", input_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[13]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/input[1]", option_xpath="/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/form[1]/ivd-form-field[13]/div[1]/div[1]/ivd-field[1]/div[1]/ivd-select-box-field[1]/div[1]/div[1]/ul[1]/li[1]/div[3]/span[1]/div[1]", input_content=currency[:1], field_name="CURRENCY" )
额外优化建议
- 你当前使用的是绝对路径XPath,页面结构稍有调整就会定位失败,建议替换为相对路径XPath,通过元素的
id、class、text等属性定位,稳定性会高很多。 - 硬编码的
time.sleep可以根据实际场景替换为更灵活的显式等待条件,减少不必要的等待时间。
内容的提问来源于stack exchange,提问作者HAPPYHELL
相关产品推荐
相关产品推荐

