【问题标题】:Selenium RC Having problems with XPath for a tableSelenium RC 表的 XPath 出现问题
【发布时间】:2010-11-30 16:18:18
【问题描述】:

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

/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')])..

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    假设你的初始 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() 明确选择 child 文本节点 - 所以上面的 xpath 不会选择文本不是 td 的直接子节点的元素(例如 &lt;td&gt;&lt;b&gt;my required text for verifying&lt;/b&gt;&lt;/td&gt;)不匹配。也许您的意思是查找所有后代的连接文本值:

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

    最后,XPath中可以隐式进行类型转换,所以上面的string(.)可以换成.,导致版本:

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

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

    【讨论】:

    • 他没有使用那个 XPath,只是为了说明使用的 HTML。
    • 那为什么要用“xpath”来标记呢??
    • 感谢您的回复,但我没有空间标准化问题。
    • 它被标记为 xpath 因为这是 Selenium 中使用的定位器策略。问题顶部的 XPath 是 HTML 的说明,因此其脆弱性的 cmets 是多余的。问题中剩余的 XPath 是尝试定位元素的示例。
    • 不管实现 xpath 的框架如何,编写健壮的 xpath 可能都是一个好主意。在我看来,他确实在使用 XPath,但显然不是。
    【解决方案2】:

    尝试通过 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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多