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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:39:02