开头。我将在下面给出示例。

这是我们编写一些XPath的常用方法。

 By identifier = By.xpath("//span[@trans='WbOrderHeader.OneCancelsAnother']");


在上面的代码之后,我们在撇号内写入WbOrderHeader.OneCancelsAnother。但是,如果我的标识符以撇号开头怎么办?

例如,相同的代码将是这样

By identifier = By.xpath("//span[@trans=''WbOrderHeader.OneCancelsAnother']");


,因此标识符将是WbOrderHeader.OneCancelsAnother

那里开头是一个apostrophe ('),结尾没有。在这种情况下,当我以此处编写的方式编写XPath时,并不能识别。我怎么解决这个问题?

在这种情况下如何编写XPath?

评论

通常,在编程时,我们将其称为“单引号。

#1 楼

字符'是撇号。冒号是:。不幸的是,硒仅支持XPath 1.0,因此这很棘手。您可以通过使用反斜杠对'进行转义来做到这一点,例如:

By.xpath("//span[@trans=\"'WbOrderHeader.OneCancelsAnother\"]")


评论


对混乱感到抱歉,我将问题改成撇号。

–萨拉斯
17 Mar 23 '17 at 15:01

稍作修正-是浏览器支持并限制XPath 1.0,而不是硒(它不执行任何操作,评估由浏览器完成)

– Todor Minakov
17 Mar 25 '17在5:12

#2 楼

若要按字面解释XPath中的撇号,可以使用W3C XPath建议中定义的concat函数。

有关此函数的说明:
1。其格式如下(其中n≥2并且每个参数都是字符串):concat(s1,...,sn)
2。它返回其参数的串联。
3。要将一个或多个撇号序列添加到返回的字符串中,请将此序列括在双引号中(使用Java时,请用\"括起来),并将结果用作函数自变量之一(如以下代码所示)。

对于您的示例,以下方法将起作用:

By.xpath("//span[@trans=concat(\"'\", 'WbOrderHeader.OneCancelsAnother')]");


#3 楼

另一个选择是将字符串拆分为多个部分,然后使用concat将其重新放回原处。杂乱无章,但它可以正常工作并且可以反复使用,而不是每次都使用它。

因此,这将返回输入字符串的xpath表示形式,或者如果没有撇号,则返回其本身:

public static String replaceApostrophes(String input)
{
    input = input.replaceAll("#comma#", ",");

    if (input.contains("'"))
    {
        String prefix = "";
        String[] elements = input.split("'");

        String output = "concat(";

        for (String s : elements)
        {
            output += prefix + "'" + s + "'";
            prefix = ",\"'\",";
        }

        if (output.endsWith(",")) 
            output = output.substring(0, output.length() - 2);

        output += ")";

        return output;
    }
    else 
        return "'" + input + "'";        
}


#4 楼

使用contains表达式应该可以完成工作。诸如此类:

By Identifier = By.XPath("//span[contains(@trans,'WbOrderHeader.OneCancelsAnother')]")


contains可以采用您指定的属性(@attribute),并用逗号分隔,然后可以指定该属性的值。进行匹配可以是部分或全部价值。这样,您就无需转义撇号。

#5 楼

对于所有看到此线程并失望地离开的人,这是答案:

而不是'“ + varWithApostrophe +”'
执行此操作:
\“” + varWithApostrophe +“ \“

示例:
// span [包含(。,\”“ + varWithApostrophe +” \“)]

评论


如果您解释了原因,这将成为更强有力的答案

– Ray Oei
19年3月11日在21:18

#6 楼

基于K-8的答案,这是C#函数:

public static string ReplaceApostrophes(string input)
{
    if (input.Contains("'"))
    {
        string prefix = "";
        var elements = input.Split('\'');

        string output = "concat(";

        foreach (var s in elements)
        {
            output += $"{prefix}'{s}'";
            prefix = ",\"'\",";
        }

        if (output.EndsWith(","))
        {
            output = output.Substring(0, output.Length - 2);
        }

        output += ")";

        return output;
    }
    else
    {
        return $"'{input}'";
    }
}


#7 楼

您可以通过使用双quote(")来解决此问题。

//span[@trans="'WbOrderHeader.OneCancelsAnother"]


我有以下带有值的文字看不到您的产品?

我正在处理使用以下Xpath:

//*[contains(text(),"Don't see your product?")]


让我们知道它是否有效。

#8 楼

在这种情况下,您可以在XPath中使用“包含”。您的解决方案将是:

By identifier = By.xpath("//span[contains(@trans, 'WbOrderHeader.OneCancelsAnother')]  


您可以完全不必处理起始撇号。

#9 楼

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

元素:

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


我能够grep在xPath下面使用的元素,我在其中使用了反斜杠来转义字符["

Xpath:

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


希望有帮助。

本文标签: automated-testing selenium selenium-webdriver java xpath
如何报告n维测试矩阵的覆盖率?
有系统的编写测试方案的方法的指南吗?
标签列表
最近发表
随机文章