如何查找具有动态ID的ExtJS元素的XPath

时间:2013-10-28 10:12:13

标签: extjs selenium selenium-webdriver selenium-ide

我正在测试的应用中的所有元素都有 dynanic ID 。当我重播而不刷新页面时,测试总是通过但是只要我刷新页面,测试失败因为所有元素的Id随机变化,而selenium 无法匹配所记录的ID与新ID。

我尝试使用Xpath-position,它适用于某些对象但是在下拉列表和按钮的情况下,它起作用了!

任何人都可以告诉我如何在对象中找到Xpath (Meathods在 JAVA 或S * elence *中)或如何为下拉列表和按钮

创建新定位器查找器

我可以显示取消我的下拉列表的属性(受Firebug检查)。

下拉属性

<div id="ext-gen1345" class="x-trigger-index-0 x-form-trigger x-form-arrow-trigger x-form-trigger-last x-unselectable" role="button" style="-moz-user-select: none;"></div>

Dropdown *的属性 选择 *:

<ul>
    <li class="x-boundlist-item" role="option">Rescue</li>
</ul>

2 个答案:

答案 0 :(得分:2)

请在发帖前搜索,我一直在回答这个问题。

ExtJS页面很难测试,特别是在查找元素时。

以下是我认为有用的一些提示:

  • 不要使用动态生成的ID。像(:id, 'ext-gen1345')
  • 不要使用绝对/无意义的XPath,例如//*[@class='someclass']/li/ul/li[2]/ul/li[2]/table/tbody/tr/td[2]/div

  • 利用有意义的自动生成的部分ID和类名称。 (因此,您需要在示例中显示更多HTML,因为我可以提出建议。)

    例如,this ExtJS网格示例:(:css, '.x-grid-view .x-grid-table')会很方便。如果有多个网格,请尝试索引它们或找到可识别的祖先,例如(:css, '#something-meaningful .x-grid-view .x-grid-table')。在您的情况下,(:css, '#something-meaningful .x-form-arrow-trigger')

  • 利用按钮的文字。

    例如,this ExtJS示例:您可以使用XPath .//li[contains(@class, 'x-boundlist-item') and text()='Rescue']。但是,此方法不适用于CSS Selector或多语言应用程序。

  • 测试的最佳方法是在源代码中创建有意义的类名。如果您无法访问源代码,请与您的经理联系,使用Selenium对抗ExtJS应用程序应该是开发人员的工作。 ExtJS为自定义类名提供clstdCls,因此您可以在源代码中添加cls:'testing-btn-foo',而Selenium可以通过(:css, '.x-panel .testing-btn-foo')获取它。

我就这个主题做出的其他答案:

答案 1 :(得分:1)

我建议您从DIV的任何父级构建一个xpath。如果没有直接的父节点有这样的节点,你可能会搞乱。

例如,

//*[@id='parentof div']/div
//*[@class='grand parent of div']/div/div

我甚至做过类似的事情,

//*[@class='someclass']/li/ul/li[2]/ul/li[2]/table/tbody/tr/td[2]/div

但是,不鼓励它这样做。