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

我正在使用Selenium,需要获取控件的ID,但ID是动态的,我无法得到它。

  

数字1122是动态的,还有其他按钮具有相同的开始button-###+btnWrap

我一直在回答你的问题很多次,你可能想看一看。

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

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

  • 不要使用动态生成的ID。 喜欢(:id, 'button-1122-btnEl')
  • 不要使用绝对/无意义的XPath,比如//div[4]/div[3]/div[4]/div/div/div/em/button

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

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

  • 利用按钮的文字。

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

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

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

  • 如何使用ExtJS在页面上找到元素的唯一选择器以与Selenium一起使用?
  • 如何使用Selenium点击ExtJS中的元素?
  • 在Watir中使用类名
  • 如何在弹出窗口中单击没有名称,标签的复选框

注意: sircapsalot的答案对ExtJS不起作用,因为大多数按钮都有CSS Selector em[id^='button-'][id$='-btnWrap'] ,(但不能怪他,因为这是相当的ExtJS具体,有些人可能不熟悉)。

CSS选择器很简单。

你的选择器是,

 em[id^='button-'][id$='-btnWrap'] 

或者如果你想点击那里的按钮 –

 em[id^='button-'][id$='-btnWrap'] > button