【问题标题】:How to find XPath of an ExtJS element with dynamic ID如何找到具有动态 ID 的 ExtJS 元素的 XPath
【发布时间】:2013-10-28 10:12:12
【问题描述】:

我正在测试的应用程序中的所有 元素 都有 dynanic ID's 。当我重放它不刷新页面时,测试总是通过,但是一旦我刷新页面,测试失败 strong> 因为所有元素的id随机变化,硒无法匹配记录的id和新的id。

我尝试使用 Xpath-position,它适用于某些对象,但对于 下拉列表和按钮它不起作用!

谁能告诉我如何找到对象的 XpathJAVA 或 S*elence* 中的方法)或如何为下拉列表和按钮

创建一个新的定位器查找器

我可以显示正在取笑我的下拉菜单的属性(Inspected by 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>

下拉菜单的属性*选择*:

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

【问题讨论】:

  • 您需要放眼大局。你是说ID一直在变化,嗯,看看它周围是什么?是否有一个div 始终位于您想要的元素上方?您想要的元素是否始终是特定 span 元素的子元素?总是第9个div吗? textRescue 总是 li 吗? li 总是第一个吗?它的ul 是否有不断变化的 ID?这些元素是否只有不断变化的 ID?其他属性呢?
  • @Arran :是的,阿伦,li 总是有文字作为救援!我如何使用 li 引用下拉选项?
  • 是否有任何不同的方法可以从下拉列表中选择一个选项。1.如果下拉列表中只有一个条目,那该怎么办?请使用示例进行解释。 .thanq

标签: selenium selenium-webdriver xpath extjs selenium-ide


【解决方案1】:

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

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') 获取。

我对这个话题的其他回答:

【讨论】:

  • 我正在附上你要求的 html,请给我一个现成的 webdriver java 代码,用于从 “部门” 中选择项目 “IT” Drop下来!
  • @Yi Zeng 我要引用的按钮在一个 div 下,其 html 如下:
【解决方案2】:

我建议您从 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

但仍然不鼓励这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-09-06
    相关资源
    最近更新 更多