【问题标题】:Search for text with symbols via XPath通过 XPath 搜索带符号的文本
【发布时间】:2013-01-16 17:43:27
【问题描述】:

我已经在构建之外运行了一段时间的自动化测试,但围绕电子邮件验证的一系列测试一直失败。我发现的问题是由于引发的 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 错误抛出。我仍然认为@符号是这里的问题,并且看不到通过包含它的文本进行搜索的明显方法。

【问题讨论】:

    标签: c# xpath selenium


    【解决方案1】:

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

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

    如您所见,@ 之前的 ' 是字符串文字的结尾,之后的下一个字符是 @,这就是错误抱怨 @ 不应该出现的原因是。如果errorMessage 包含'hello',则错误消息可能会抱怨h

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

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

    或者在比较时去掉单引号:

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

    你能试试吗?

    【讨论】:

    • 我没有尝试删除@周围的引号,我会在我的另一台机器上尝试这个,谢谢!
    • 您的代码示例对我帮助很大。我喜欢这样一个事实,即您可以让 XPath 在尝试匹配字符串之前对其执行方法。非常感谢!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我删除了我之前的评论,因为虽然你链接我的帖子也解决了我在使用测试字符串时的问题,但由于@符号,我的实际输入字符串在被“”包围时仍然失败。现在将更新我的问题。
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-02-03
    • 2016-03-12
    相关资源
    最近更新 更多