使用webdriver查找元素时如何在xpath中使用撇号(')?

Posted

技术标签:

【中文标题】使用webdriver查找元素时如何在xpath中使用撇号(\')?【英文标题】:How to use apostrophe (') in xpath while finding element using webdriver?使用webdriver查找元素时如何在xpath中使用撇号(')? 【发布时间】:2016-09-29 07:02:30 【问题描述】:

我需要在我的 xpath 表达式中使用撇号 ('),我需要在使用 webdriver 查找元素时使用它

我需要使用下面的Xpath表达式

//input[@text="WE'd like to hear from you"]

在查找元素函数中使用上述表达式时,我将双引号替换为单引号

driver.findelements(By.xpath("//input[@text='WE'd like to hear from you']"))

【问题讨论】:

【参考方案1】:

使用如下所示的xpath:

driver.findElements(By.xpath("//input[contains(@text,\"WE'd\")]"));

希望这会有所帮助。

【讨论】:

在我的例子中,我得到的文本是动态的,可以带单引号或不带单引号。我们将如何动态处理【参考方案2】:

您必须使用双引号作为 XPath 字符串文字分隔符,因为 XPath 1.0 不提供转义引号的方法。除此之外,您可以在 Java 中转义双引号,以避免它与您的 Java 字符串分隔符冲突,后者也使用双引号:

driver.findelements(By.xpath("//input[@text=\"WE'd like to hear from you\"]"))

【讨论】:

【参考方案3】:

转义字符的使用没有达到目的。我尝试了连接功能,它就像一个魅力。请参阅下面的 xpath。

tag: li Manager of Workflow Initiator's Manager /li

连接函数并将字符串拆分为-

concat('Manager of Workflow Initiator',"'",'s Manager')

单引号保留在双引号中,而其他字符保留在单引号中..

所以 XPath 看起来像 -

//li[.=concat('Manager of Workflow Initiator',"'",'s Manager')]

【讨论】:

如果上述解决方案不起作用,则使用转义序列使用以下解决方案。 xpath: //li[.=\"Manager of Workflow Initiator's Manager\"] 这里我们把整个文本当作一个字符串来处理。【参考方案4】:

如果上述解决方案不起作用,则使用转义序列使用以下解决方案。

xpath: //li[.=\"Manager of Workflow Initiator's Manager\"]

这里我们使用转义字符将整个文本视为字符串

【讨论】:

【参考方案5】:

我遇到过类似的情况,需要为如下所示的元素编写 xpath:

元素:

<img src="webwb/pzspacer.gif!!.gif" class="inactvIcon" data-ctl="["DatePicker"]" style="cursor:pointer;">

我能够使用下面的 Xpath 对元素进行 grep,其中我使用反斜杠来转义字符 [ 和 "。

Xpath//img[@data-ctl='\[\"DatePicker\"\]']

希望这会有所帮助。

【讨论】:

【参考方案6】:

上述方法都没有涵盖同时存在 Quote 和 Apostrophe cos 的情况。我为此创建了一个函数,

driver.findElements(By.xpath(String.format("//input[contains(@text,%s))]"),escapeQuotes(textVal));

转义引用的实现。

private String escapeQuotes(String text) 

    // If we don't have any Quote then enquote string in Quote
    if (!text.contains("\"")) 
        return String.format("\"%s\"", text);
    

    // If we have some Quote but no Apostrophe then enquote in Apostrophe
    if (!text.contains("'")) 
        return String.format("'%s'", text);
    

    // If input is like Administr"ati'on then we have both " and ' in the string so must use Concat
    // we will be building the xPath like below and let the browser xPath evaluation to handle the concatenation
    // output : concat('Administr\"',\"ati'on\")
    StringBuilder sb = new StringBuilder("concat(");

    // Looking for " as they are LESS likely than '
    int lastPos = 0;
    int nextPos = text.indexOf("\"");
    while (nextPos != -1) 
        // If this is not the first time through the loop then seperate arguments with ,
        if (lastPos != 0) 
            sb.append(",");
        

        sb.append(String.format("\"%s\",'\"'", text.substring(lastPos, nextPos - lastPos)));
        lastPos = ++nextPos;

        // Find next occurrence
        nextPos = text.indexOf("\"", lastPos);
    

    sb.append(String.format(",\"%s\")", text.substring(lastPos)));
    return sb.toString();

【讨论】:

以上是关于使用webdriver查找元素时如何在xpath中使用撇号(')?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中使用 selenium webdriver 查找特定的表元素?

按文本查找元素并获取xpath - selenium webdriver junit

XPath在Selenium WebDriver中的应用

如何使用Selenium C#WebDriver查找所有父元素?

如何在 Selenium WebDriver 中使用 xPath 来抓取 SVG 元素?

webdriver实例14-Xpath定位的几种方法