2

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

<em id="button-1122-btnWrap">
<button id="button-1122-btnEl" class="x-btn-center" autocomplete="off" role="button" disabled="disabled" hidefocus="true" type="button" style="width: 21px; height: 21px;">
         <span id="button-1122-btnInnerEl" class="x-btn-inner" style="width: 21px; height: 21px; line-height: 21px;"> </span>
         <span id="button-1122-btnIconEl" class="x-btn-icon icon-save-invoice"></span>
</button>

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

4

2 回答 2

3

我已经回答了很多次这样的问题,你可能想看看。

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

我就这个话题做出的其他回答:

注意: sircapsalot 的回答不适用于 ExtJS,因为大多数按钮都有 CSS Selector em[id^='button-'][id$='-btnWrap'],(但不能怪他,因为这是 ExtJS 特有的,有些人可能不熟悉)。

于 2013-10-23T02:41:43.210 回答
0

使用 CSS 选择器很简单。

你的选择器是,

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

或者,如果您想单击其中的按钮-

em[id^='button-'][id$='-btnWrap'] > button
于 2013-10-22T13:44:16.503 回答