存在断言文本,其中包含使用Selenium的首字母缩略词

时间:2013-04-03 13:30:15

标签: python xpath selenium acronym

我已经设置了我的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>

1 个答案:

答案 0 :(得分:3)

我认为你将text()的行为与将元素节点转换为字符串值的行为混淆了。如果<p>包含带有文字的子元素,例如<acronym>,则会显示差异。

text()做的是选择单个文本节点。如果没有明确的命名空间轴,则选择作为上下文节点的子节点的文本节点。在p[...]内,上下文节点是<p>元素。因此,该谓词中的text()仅选择上下文节点的子节点(而不是孙子节点)。在您的示例中,<p>元素有三个子节点:

  • 文字节点"My "
  • 名为acronym
  • 的元素节点
  • 文字节点" message"

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

当评估为字符串时,如contains(text(), ...)中所示,节点集的处理方式如下:返回第一个节点的字符串值,其余部分将被忽略。因此,在您的示例中,text()返回的节点集评估为"My ",即第一个子文本节点的内容。对于您要匹配的p[contains("My ", "My error message")],您的XPath表达式相当于p。那当然失败了。谓词为false,因此不返回p元素。

您希望连接所有后代文本节点的字符串内容,但这不是text()所做的。为此,请将<p>元素本身评估为字符串。 E.g。

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

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