0

我已经设置了我的 Selenium (v 2.3) 测试的功能,以检查某些错误消息的存在,这些错误消息一直运行良好,直到我正在检查的元素有首字母缩略词。

我的函数获取页面中的所有错误,然后搜索div预期的消息;

# el is the error div element
error_el = el.find_element_by_xpath('p[contains(text(), "{0}")]'.format(error_text))
...
self.assertIsNotNone(error_el) # make sure it actually found something

我从我的测试中调用self.assertFieldError('My error message')它并且它完美地工作,直到'My error message'包含一个首字母缩写词。如果存在首字母缩略词,则 Selenium 不会将我的字符串与段落匹配。

我目前对此的解决方案是检查页面源中的字符串,但如果它是多次出现的字符串,这并不理想。

是否可以忽略首字母缩写词标签或改进我的 xpath 以允许文本或带有首字母缩写词的文本?我一直认为该text()方法的操作与用户看到的完全一样,并且它会自动忽略首字母缩略词。

编辑

错误消息使用 Javascript 附加到字段,该 Javascript 通过字段名称从 Django 表单获取字段标签。尽管据我所知,这与 Selenium 无关。

HTML:

<div class="field">
    <div class="error">
        <p>My <acronym title="Error">ERR</acronym> message</p>
    </div>
    <label for="id_myField">My <acronym title="Error">ERR</acronym> message</label>
    <input id="id_myField" type="text">
</div>
4

1 回答 1

3

我认为您将 的行为text()与将元素节点转换为字符串值的行为混淆了。差异出现在<p>具有带有文本的子元素的情况下,例如<acronym>.

什么text()是选择单个文本节点。在没有显式命名空间轴的情况下,它选择作为上下文节点子节点的文本节点。在内部p[...],上下文节点是一个<p>元素。所以text()在那个谓词里面只选择上下文节点的子节点(不是孙子节点)。在您的示例中,该<p>元素具有三个子节点:

  • 文本节点"My "
  • 元素节点命名acronym
  • 文本节点" message"

因此,text()(在p元素的上下文中)将返回两个文本节点的节点集,其值为Mymessage

当评估为字符串时,如 中contains(text(), ...),节点集被如下处理:返回第一个节点的字符串值,其余的被忽略。因此,在您的示例中,返回的节点集text()计算结果为"My ",即第一个子文本节点的内容。然后,您的 XPath 表达式等同于p[contains("My ", "My error message")]p尝试匹配的。那当然失败了。谓词为假,因此不p返回任何元素。

您希望连接所有后代文本节点的字符串内容,但事实并非text()如此。为此,请将<p>元素本身评估为字符串。例如

p[contains(., "...")]

.表示上下文节点,里面p[...]p元素。当您将p元素评估为字符串时,结果是所有后代文本节点的串联。

于 2013-04-03T14:19:50.577 回答