仅在 Linux 上使用 XPath 的 Selenium InvalidSelectorException

Selenium InvalidSelectorException with XPath only on Linux

我在 Windows 上使用 Selenide 编写了测试,测试 通过了 ,但是当我 运行 在 jenkins 上使用相同的测试时(Linux ) 我得到一个错误:

org.openqa.selenium.InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression \button[@class="ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted"] because of the following error: SyntaxError: Failed to execute 'evaluate' on 'Document': The string '\button[@class="ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted"]' is not a valid XPath expression.

日志表明我们只有一个“/”的问题。相比之下,代码中的选择器看起来像这样:

private final SelenideElement addItemsBtn = $(By.xpath("//button[@class=\"ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted\"]"));

问题是斜线,它在 Linux 上被误解了。解决方法是将 XPath 替换为没有斜杠的 cssSelectors,或者将 xPath 更改为:

private final SelenideElement addItemsBtn = $(By.xpath("\\button[@class=\"ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted\"]"));

但这不是解决问题的方法。

这样试试

"\button[@class='ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted']"

而不是

'\button[@class="ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted"]'

您的 XPath 表达式应该是

'//button[@class="ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted"]'

元素标签名前的//,这里是buttonmeans that this element can be located anywhere below the root node.
"//button[@class=\"ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted\"]" 表达式中的 \ 是那里使用的 escape backslash 因为您使用 " 将 XPath 表达式括起来并且您在该字符串中使用另一个 " .因此,为了不将字符串中的那些 " 指示为字符串的结尾或开头,您在那里使用了转义 / 。 或者你可以写这个 XPath 而不是

"//button[@class=\"ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted\"]"

成为

"//button[@class='ui-button ui-button-text f-mode-link f-section-button section-add-button ng-star-inserted']"

在这种情况下不需要使用转义\,只需使用'而不是"