0

一段时间以来,我一直在运行构建之外的自动化测试,并且围绕电子邮件验证的一系列测试一直失败。我发现的问题是由于引发的 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>

而我当前引发javascript错误的XPath(显然不适用于符号的存在)是(其中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 错误抛出。我仍然认为@符号是这里的问题,并且看不到通过包含它的文本进行搜索的明显方法。

4

2 回答 2

1

您的问题绝对与@无关,而是与“如何在 XPAth 中转义单引号/双引号”有关。

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

修复:在使用字符串连接构建 XPath 时,正确转义所有字符以避免相当于“SQL 注入” - XPATH 查询中的特殊字符中涵盖。在您的情况下,外部双引号就足够了(因为示例字符串不包含单引号和双引号。否则 - 查看链接问题中的示例并使用concat函数构建完整的搜索字符串:

"...contains(text(), \"'foo'@'bar'\")...
于 2013-01-15T21:59:14.880 回答
1

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

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

正如你所看到的,'前面@是结束字符串文字,而后面的下一个字符是@,这就是为什么错误抱怨@它不应该出现在哪里。如果errorMessage改为包含'hello',则错误消息可能会抱怨h.

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

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

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

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

你能试试吗?

于 2013-01-16T09:43:27.103 回答