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
相关产品推荐
相关产品推荐

