3

我正在尝试选择由以下给出的元素:

/html/body[@id='someid']/form[@id='formid']/div[@id='someid2']/div[@id='']/div[@id='']/div[@id='']/table/tbody[@id='tableid']/tr[7]/td[2]

现在我尝试选择的那一行的 html 如下所示:

<tr>
<td class="someClass">some text</td>
<td class="someClass2">my required text for verifying</td>
</tr>

我需要检查页面中是否存在验证所需的文本

  1. 我用过selenium.isTextPresent("my required text for verifying");,但不起作用

  2. 所以现在我尝试了selenium.isElementPresent("//td[contains(text(),'my required text for verifying')]")
    This works 有时但偶尔会出现随机故障。

  3. 也试过selenium.isElementPresent(//*[contains(text(),'my required text for verifying')])了。。

如何使用 selenium 验证页面上的此文本?

问题不在于页面需要时间加载。我在故障发生之前截取了屏幕截图,发现页面已完全加载,所以这不应该是问题。

有人可以建议任何方式来选择这个元素或任何方式来验证屏幕上的这个文本吗?

4

2 回答 2

4

尝试通过 CSS 定位它:

assertText(selenium.getText("css=.someClass2"), "my required text for verifying");

上面应该给出比 isElementPresent 更好的失败消息,但你仍然可以将它与 CSS 定位器一起使用:

assertTrue(selenium.isElementPresent("css=.someClass2"));

如果加载时间有问题,您可以尝试等待元素出现:

selenium.waitForCondition("var value = selenium.isElementPresent('css=.someClass2'); value == true", "60000");

如果您不想使用 CSS 定位器,其他一些可能对您有用的 XPath 定位器:

  • //td[包含(@class, 'someClass2')
  • xpath=id('tableid')/tr[7]/td[2]
  • xpath=id('tableid')/descendant::td[contains(@class, 'someClass2')][7]
于 2009-09-23T08:43:48.600 回答
1

我从未听说过硒。但是您的初始 XPath 是不必要的脆弱和冗长。

如果一个元素有一个 id,它就是唯一的;使用如此长的 XPath 来选择特定元素是不必要的;只需选择具有 id的最后一个元素。此外,我看到您偶尔会选择xyz[@id='']- 如果您尝试选择没有id 属性的元素,您可以使用 `xyz[not(@id)] 代替。

假设您的初始 XPath 基本上是正确的,那么执行以下操作就足够了:

//tbody[@id='tableid']/tr[7]/td[2]

但是,如果无论如何更改 html 的详细信息,使用这样的特定行号和列号是自找麻烦。此外,元素上有 id 是不典型的tbody,也许table元素有 id?

最后,您可能会遇到空间标准化问题。在 xml 中,多个连续的空格通常被认为等同于一个空格,而您没有考虑到这一点。特别是,如果 xhtml 打印得很漂亮,并且在您想要的文本中间包含换行符,那么它将不起作用。

//td[contains(normalize-space(text()),'my required text for verifying')]

最后,text()显式选择 文本节点——因此上面的 xpath 不会选择文本不是 td 的直接子节点的元素(例如<td><b>my required text for verifying</b></td>)将不匹配。也许您的意思是查找所有后代的连接文本值:

//td[contains(normalize-space(string(.)),'my required text for verifying')]

最后,类型转换可以隐含在 XPath 中,因此string(.)可以.在上面替换为,导致版本:

//td[contains(normalize-space(.),'my required text for verifying')]

这在大型文档上可能会很慢,因为它需要规范化空格并为每个td元素执行字符串搜索。如果您遇到性能问题,请尝试更具体地了解td需要检查哪些元素,或者,如果您不关心文本出现的位置,请尝试通过规范化整个空间来减少对规范化空间的“调用”次数一次性文档(例如 via /*[contains(normalize-space(.),'my required text for verifying')])。

于 2009-09-23T08:30:21.677 回答