通过XPath搜索带符号的文本

时间:2013-01-15 21:29:17

标签: c# xpath selenium

我现在已经运行了一段时间的自动化测试,并且围绕电子邮件验证的一系列测试仍然失败。我发现的问题是由于javascript错误导致Selenium无法在XPath中的文本中搜索“@”。

我遇到了这个SO Question,它很好地向我证实,在Selenium中作为标准,不能通过XPath在文本中搜索字符。

我的问题是,有没有人找到解决方法?

例如,我希望能够找到包含以下文本字段的元素:

<h1>"personA@email.com.au.personB@email.com.au - The separator '@' is either in an invalid position or is missing from the address."</h1>

我当前的XPath(显然无法使用符号的存在)抛出javascript错误(其中errorText只是上面的字符串):

"//*[contains(text(), '" + errorText + "')]"

只是为了好玩,如果javascript错误有帮助:

[14/01/2013 -  14:35:00.1820111]    :    InvalidSelectorError: Unable to locate an element with the xpath expression //*[contains(text(), 'personA@email.com.au.personB@email.com.au - The separator '@' is either in an invalid position or is missing from the address.')] because of the following error:
Error: Bad token: @

[编辑]

我查看了SO Question,建议我需要用双引号括住输入文本,但这样做仍然会导致上面的javascript错误抛出。我仍然认为@符号是这里的问题,并且没有明显的方法来搜索包含它的文本。

2 个答案:

答案 0 :(得分:1)

你的问题绝对与@无关,但是对“如何在XPAth中转义单引号/双引号”进行评价。

您的XPath看起来像...contains(text(),'foo'@'bar')...。人们可以很容易地看到要搜索的字符串是无效的,因为它包含2个部分和@中间的组合,这在XPath中是没有意义的。

修复:在构建带有字符串连接的XPath时,正确转义所有字符以避免等同于“SQL注入” - 涵盖在Special Character in XPATH Query中。在你的情况下,外部双引号应该足够(因为样本字符串不包含单和双重的混合。否则 - 查看链接问题中的示例并使用concat函数构建完整的搜索字符串:

"...contains(text(), \"'foo'@'bar'\")...

答案 1 :(得分:1)

@符号不是问题。这是一个红鲱鱼。问题是您的errorText值包含单引号,因此在连接后生成的XPath是(为了清晰起见):

//*[contains(text(), 'personA@Email ... separator '@' is ... address.')

正如您所看到的,'之前的@正在结束字符串文字,之后的下一个字符是@,这就是为什么错误抱怨{{1}在它不应该的地方。如果@包含errorMessage,则错误消息可能会抱怨'hello'

可能的解决方法是将text()和源值中的所有单引号替换为其他字符,或者在比较期间将其删除。用双引号替换它们可能是一个明智的选择:

h

或者在比较期间删除单引号:

"//*[contains(translate(text(), \"'\", '\"'), '" + errorText.replace("'", '"') + "')]"

你可以尝试一下吗?