apostrophe (')
开头。我将在下面给出示例。这是我们编写一些
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\"\]']
希望有帮助。
评论
通常,在编程时,我们将其称为“单引号。