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

