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

driver.execute_script中括号转义报错问题及替代解决方案

解决Selenium中通过XPath判断元素选中状态的字符串转义问题

当WebDriver无法直接定位元素时,我尝试编写通用函数判断元素选中状态,最初的代码如下:

def is_checked(driver, xpath):
    checked = driver.execute_script(
        """function getElementByXpath(path) {{return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}}
return getElementByXpath({xpath}).checked;""".format(xpath=xpath)
    )
    return checked

运行时遇到两个异常:

  • 使用{{}}转义大括号时,触发selenium.common.exceptions.JavascriptException: Message: javascript error: Unexpected token '}'
  • 不转义大括号时,触发KeyError: 'return document'

错误原因分析

  1. 不转义大括号的情况:Python的str.format()会把字符串中{}包裹的内容视为占位符,代码里function定义内的{return document...}会被误判为需要替换的占位符,但没有对应的键,因此抛出KeyError。
  2. 转义大括号的情况:虽然{{}}会被转义为单个{},但{xpath}替换后没有添加引号,导致传入的XPath字符串在JS中被当作表达式而非字符串,引发JS语法错误。

可行解决方案

利用Selenium的execute_script()支持传入额外参数的特性,将XPath作为参数传递给JS代码,通过arguments[]获取参数,彻底避免字符串格式化的转义问题:

def is_checked(driver, xpath):
    checked = driver.execute_script("""
        function getElementByXpath(path) {
            return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        }
        return getElementByXpath(arguments[0]).checked;
    """, xpath)
    return checked

这样既不用处理复杂的转义,也不需要硬编码XPath路径,代码更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:06:38