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'
错误原因分析
- 不转义大括号的情况:Python的
str.format()会把字符串中{}包裹的内容视为占位符,代码里function定义内的{return document...}会被误判为需要替换的占位符,但没有对应的键,因此抛出KeyError。 - 转义大括号的情况:虽然
{{}}会被转义为单个{},但{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
相关产品推荐
相关产品推荐

