我现在已经运行了一段时间的自动化测试,并且围绕电子邮件验证的一系列测试仍然失败。我发现的问题是由于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错误抛出。我仍然认为@符号是这里的问题,并且没有明显的方法来搜索包含它的文本。
答案 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("'", '"') + "')]"
你可以尝试一下吗?