【问题标题】:JavascriptExecutor XPath with apostrophe带撇号的 JavascriptExecutor XPath
【发布时间】:2017-05-12 08:57:33
【问题描述】:

我正在尝试使用 JavascriptExecutor 使用 XPath 查找文本元素。问题是文本有一个撇号,在这种情况下我不知道如何转义它。通常使用\" 就足够了。你能帮帮我吗?

我已经尝试了以下选项:

((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d'arrivée\"]/following-sibling::div/div';
var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;x.style.display='block';");`

((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d\"arrivée\"]/following-sibling::div/div';
var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;x.style.display='block';");`

【问题讨论】:

  • 正如@Andersson 建议的那样,我必须在文本中添加 \\' 来转义撇号:code ((JavascriptExecutor)driver).executeScript("var path = '//*[text ()=\"d \\'arrivée\"]/following-sibling::div/div'; var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).ssingleNodeValue;x.style。显示='块';");`

标签: javascript xpath selenium-webdriver apostrophe


【解决方案1】:

用转义的撇号试试下面的表达式:

'//*[text()="d\'arrivee"]/following-sibling::div/div'

在单引号之间使用字符串时,应使用单个反斜杠转义撇号。这种类型的字符串不需要转义双引号。

【讨论】:

  • 谢谢,但是没有用。我必须先以某种方式转义文本的分隔符:text()=\"exampletext\",然后转义文本中的撇号。 code ((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d\'arrivée\"]/following-sibling::div/div';var x = document.评估(路径,文档,空,XPathResult.FIRST_ORDERED_NODE_TYPE,空).singleNodeValue;x.style.display='block';"); code P.S.我缩短了问题中的搜索文本,并留了一个空格...,我现在编辑了问题。
  • 你可以试试((JavascriptExecutor)driver).executeScript("var path = '//*[text()=\"d\\'arrivee\"]/following-sibling::div/div'; var x = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;x.style.display='block';");
【解决方案2】:

首先构造您需要的 XPath 表达式。在 XPath 1.0 中,编写文字撇号的唯一方法是使用双引号作为字符串分隔符,因此 XPath 表达式为:

//*[text()="d'arrivee"]/following-sibling::div/div

(尽管使用“.”而不是“text()”是更好的做法)。

然后考虑如何在您选择的宿主语言中将其转义为字符串文字,在本例中为 Javascript。在 Javascript 中,您可以使用 '" 作为字符串分隔符,然后您必须使用反斜杠转义任何出现的字符串分隔符。所以它变成了

"//*[text()=\"d'arrivee\"]/following-sibling::div/div"

'//*[text()="d\'arrivee"]/following-sibling::div/div'

【讨论】:

    【解决方案3】:

    作为一种变体,尝试找到另一个不带撇号的 Xpath 定位器。不要使用函数“text()”或通过“contains()”使用部分文本。我觉得是真的。

    【讨论】:

    • 使用“contains()”只搜索部分文本有效,但也有类似的文本,我更喜欢完全匹配。谢谢。
    猜你喜欢
    • 2018-12-16
    • 2010-11-23
    • 2015-08-27
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2012-01-02
    相关资源
    最近更新 更多