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

Python Selenium的find_element_by_id传变量触发NoSuchElementException报错

报错原因排查
  • 核心原因:JSON数据提取方式错误,导致itemID中意外包含了多余的单引号。从报错日志可以看到,最终定位用的选择器是[id=\"'-3088730200806839963'\"],id值多了一层单引号包裹,和页面实际id不匹配。你看到的打印输出'-3088730200806839963'里的单引号不是打印格式符,是实际存在于itemID变量中的内容。
  • 问题来源:JSON加载后data['food_apps'][optionFood]本身是字典对象,你不需要将其转为字符串再切割提取id,手动切割很容易把原有的引号符号带入结果。
  • 次要原因:没有做元素加载等待,即使id正确,也可能因为页面未渲染完成导致找不到元素。
  • 附带逻辑错误:多条件判断语法全部错误,比如y == "y" or "yes"会永远返回True,因为非空字符串在布尔判断中为真,实际逻辑等同于(y == "y") or True,不管用户输入什么都会执行后续逻辑。
修复方案

1. 正确提取JSON中的id值

把你原来手动切割字符串的代码:

item = str(data['food_apps'][optionFood])
itemID = item.split(':')[1].lstrip().split(' ')[0].lstrip('"').rstrip('"}')

替换为直接从字典取值的代码:

food_dict = data['food_apps'][optionFood]
itemID = food_dict[appChoice]

这样直接拿到的就是干净的id字符串,没有多余符号。

2. 修复所有错误的多条件判断

把所有类似a == b or c or d的写法,替换为a in (b, c, d)的格式:

  • 取餐方式判断修改为:
if choiceOrder in ("pick up", "pickup", "pick-up"):
  • 餐品分类判断修改为:
if startFood in ("apps", "appetizers"):
  • 确认选择判断修改为:
if y in ("y", "yes"):

3. 添加元素显式等待,避免加载延迟问题

先导入显式等待相关模块:

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

把原来的元素定位和点击代码替换为:

# 最多等待10秒直到元素可点击
addFood = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, itemID))
)
addFood.click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:06