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

在Python Selenium中执行JavaScript脚本时遭遇KeyError问题求助

解决Python Selenium脚本中的KeyError及元素包含检查问题

首先,咱们来拆解你遇到的两个核心问题:

为什么会出现KeyError?

你的错误根源是Python字符串格式化和JS代码的大括号冲突。str.format()会把字符串里所有的{}都当作需要替换的占位符,但你JS代码里用来定义代码块的{和}(比如if(...) {里的大括号)并没有转义,Python会误以为这些也是占位符,找不到对应参数时就抛出了KeyError: '\n false\n '。

另外,你的JS代码还缺少return语句——即使格式正确,执行后也不会返回你需要的布尔值,只会得到undefined。

修复方案

方案1:修正JS脚本的格式化和返回逻辑

把JS里的普通大括号转义成{{和}},同时添加return语句确保返回值正确:

# 假设你的selector已经定义好
for box in range(len(browser.find_elements(*selector))):
    result = browser.execute_script("""
        var nodesArray = Array.prototype.slice.call(document.querySelectorAll(".o-boxes__item"));
        var targetElement = document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label");
        if(targetElement === nodesArray[{}]){{
            return false;
        }}else{{
            return nodesArray[{}].contains(targetElement);
        }}
    """.format(box+1, box, box))
    print(str(result))

方案2:用Selenium原生方法更简洁实现(推荐)

其实完全不需要依赖JS脚本,利用Selenium的find_element方法就能直接判断元素是否属于某个父元素的子节点——如果目标元素是父元素的后代,parent.find_element()会找到它,否则抛出NoSuchElementException:

from selenium.common.exceptions import NoSuchElementException

# 先获取所有父元素
parent_elements = browser.find_elements(By.CSS_SELECTOR, ".o-boxes__item")

for idx, parent in enumerate(parent_elements, start=1):
    # 构造目标元素的选择器
    target_selector = f"div:nth-child({idx}) > div > div.m-package-box__body > div:nth-child(10) > div > label"
    try:
        # 尝试在父元素范围内查找目标元素
        parent.find_element(By.CSS_SELECTOR, target_selector)
        result = True
    except NoSuchElementException:
        result = False
    print(result)

如果你的目标元素选择器是相对于父元素的路径,还可以进一步简化选择器,去掉依赖nth-child的索引,直接用相对路径查找,代码会更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:09