此 XPath 表达式中的语法错误在哪里?
Where is the syntax error in this XPath expression?
我的测试中有一个像这样的 XPath 选择器,我直接从 Chrome:
中的开发工具复制了它
//*[@data-testid='menu-item']//strong[text()='Link for Image']
它在浏览器中工作,但是当我尝试在我的测试中使用它时,我收到这个错误消息:
SyntaxError: Document.evaluate: The expression is not a legal expression
我认为是选择器的后半部分有问题,但我不确定是什么语法错误...
//*[@data-testid='menu-item']//strong[text()='Link for Image']
是语法正确的 XPath 表达式。
鉴于您在 XPath 中使用单引号,请务必使用双引号作为分隔符:
"//*[@data-testid='menu-item']//strong[text()='Link for Image']"
因此,例如,如果您在 JavaScript 中调用 document.evaluate()
,它将是
document.evaluate("//*[@data-testid='menu-item']//strong[text()='Link for Image']",
document)
OP评论后更新:
Oh! My mistake, it's not a string in the xpath, it's a string interpolation! That seems to be why...//*[@data-testid='menu-item']//strong[text()=${USER_STRING}]
因此,除了前面提到的 single/double 对整个 XPath 的引号关注外,您还需要注意 ${USER_STRING}
本身是否有引号,以及它们是什么类型。如果它没有引号,那么一定要用它们分隔变量:
//*[@data-testid='menu-item']//strong[text()='${USER_STRING}']
当然,您需要确保 ${USER_STRING}
实际上是 evaluated/substituted 在函数调用之前 well-formed XPath 表达式。
最后,如果 ${USER_STRING}
来自不安全的来源,请务必在评估前进行清理。
我的测试中有一个像这样的 XPath 选择器,我直接从 Chrome:
中的开发工具复制了它//*[@data-testid='menu-item']//strong[text()='Link for Image']
它在浏览器中工作,但是当我尝试在我的测试中使用它时,我收到这个错误消息:
SyntaxError: Document.evaluate: The expression is not a legal expression
我认为是选择器的后半部分有问题,但我不确定是什么语法错误...
//*[@data-testid='menu-item']//strong[text()='Link for Image']
是语法正确的 XPath 表达式。
鉴于您在 XPath 中使用单引号,请务必使用双引号作为分隔符:
"//*[@data-testid='menu-item']//strong[text()='Link for Image']"
因此,例如,如果您在 JavaScript 中调用 document.evaluate()
,它将是
document.evaluate("//*[@data-testid='menu-item']//strong[text()='Link for Image']",
document)
OP评论后更新:
Oh! My mistake, it's not a string in the xpath, it's a string interpolation! That seems to be why...
//*[@data-testid='menu-item']//strong[text()=${USER_STRING}]
因此,除了前面提到的 single/double 对整个 XPath 的引号关注外,您还需要注意 ${USER_STRING}
本身是否有引号,以及它们是什么类型。如果它没有引号,那么一定要用它们分隔变量:
//*[@data-testid='menu-item']//strong[text()='${USER_STRING}']
当然,您需要确保 ${USER_STRING}
实际上是 evaluated/substituted 在函数调用之前 well-formed XPath 表达式。
最后,如果 ${USER_STRING}
来自不安全的来源,请务必在评估前进行清理。