此 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} 来自不安全的来源,请务必在评估前进行清理。