Selenium RC表的XPath存在问题

时间:2009-09-23 08:04:23

标签: selenium xpath css-selectors html-table selenium-rc

我正在尝试选择一个给定的元素:

/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')]")
    这有时会起作用,但偶尔会出现随机故障。

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

  4. 如何使用selenium在页面上验证此文本?

    问题不在于页面需要花时间加载。我在故障发生之前拍了截图,发现页面已满载,所以不应该是问题。

    有人可以建议任何方式选择此元素或以任何方式在屏幕上验证此文字吗?

2 个答案:

答案 0 :(得分: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 [contains(@class,'someClass2')
  • 的xpath = ID( 'TABLEID')/ TR [7] / TD [2]
  • xpath = id('tableid')/ descendant :: td [contains(@class,'someClass2')] [7]

答案 1 :(得分:1)

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

如果元素具有id,则它是唯一的;使用这么长的XPath只是为了选择一个特定的元素是不必要的;只需选择带有id的 last 元素。此外,我发现您偶尔会选择xyz[@id=''] - 如果您尝试选择没有 id属性的元素,则可以执行`xyz [not(@id)]。< / p>

假设您的初始XPath基本上是正确的,只需执行以下操作即可:

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

然而,使用特定的行和列编号就是在无论如何改变html的细节时都会遇到麻烦。另外,在tbody元素上使用id是非典型的,也许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元素,或者,如果您不关心文本出现的位置,请尝试减少“调用”的数量以使其正常化 - 通过一次归一化整个文档来进行空间化(例如通过/*[contains(normalize-space(.),'my required text for verifying')])。