仅在 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"]'
元素标签名前的//
,这里是button
means 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']"
在这种情况下不需要使用转义\
,只需使用'
而不是"
我在 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"]'
元素标签名前的//
,这里是button
means 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']"
在这种情况下不需要使用转义\
,只需使用'
而不是"