1

我正在自动化 Web 应用程序的测试。我有一个创建管理员的场景,我必须为此输入姓名、电子邮件地址和电话号码文本框。但是这个文本框的 id 是动态的。

userName, id='oe-field-input-41'
Email, id='oe-field-input-42'
phone number, id='oe-field-input-43'

第一个查询: ids 中的数字是动态的,它保持变化我厌倦了使用 xpath 来处理动态值。

xpath = //*[starts-with(@id,'oe-field-input-')]

在此它成功地将文本输入到第一个文本框中

第二个查询:我不能为接下来的两个文本框使用相同的 xpath,因为它只在名称字段中输入电子邮件和电话号码

请帮我解决这个动态值处理。

编辑:添加了html代码,

<table class="oe_form_group " cellspacing="0" cellpadding="0" border="0">
 <tbody>
  <tr class="oe_form_group_row">
   <td class="oe_form_group_cell oe_form_group_cell_label" width="1%" colspan="1">
    <td class="oe_form_group_cell" width="99%" colspan="1">
    <span class="oe_form_field oe_form_field_many2one oe_form_field_with_button">
     <a class="oe_m2o_cm_button oe_e" tabindex="-1" href="#" draggable="false" style="display: inline;">/</a>
     <div>
    </span>
   </td>
  </tr>
  <tr class="oe_form_group_row">
   <td class="oe_form_group_cell oe_form_group_cell_label" width="1%" colspan="1">
    <td class="oe_form_group_cell" width="99%" colspan="1">
    <span class="oe_form_field oe_form_field_email">
     <div>
     <input id="oe-field-input-35" type="text" maxlength="240">
     </div>
    </span>
   </td>
  </tr>
  <tr class="oe_form_group_row">
   <td class="oe_form_group_cell oe_form_group_cell_label" width="1%" colspan="1">
    <td class="oe_form_group_cell" width="99%" colspan="1">
    <span class="oe_form_field oe_form_field_char">
     <input id="oe-field-input-36" type="text" maxlength="32">
    </span>
   </td>
  </tr>
  <tr class="oe_form_group_row">
   <td class="oe_form_group_cell oe_form_group_cell_label" width="1%" colspan="1">
    <td class="oe_form_group_cell" width="99%" colspan="1">
    <span class="oe_form_field oe_form_field_char">
     <input id="oe-field-input-37" type="text" maxlength="32">
    </span>
   </td>
  </tr>
  <tr class="oe_form_group_row">
 </tbody>
4

5 回答 5

1

您可以尝试通过标签等来定位唯一元素的替代方法。例如:

  • css=.oe_form_group_row:contains(case_sensitive_text) 输入
  • xpath=//tr[@class = 'oe_form_group_row'][contains(.,'case_sensitive_text')]//输入

如果您使用ISFW,您应该为此类表单字段创建自定义组件。

于 2013-08-01T08:44:34.770 回答
1

您确实有一些有助于识别的类,oe_form_field_email例如oe_form_field_char. 使用它们有点复杂,因为它们本身并不在输入字段上,而且第二个不是唯一的;但这很有可能:

.//span[contains(@class, 'oe_form_field_email')]//input

那是一个 xpath,它将 Email 字段标识为该类的inputa 的后代您还可以在这样的 css 选择器中使用相同的逻辑,更有效:spanoe_form_field_email

span.oe_form_field_email input

对于另外两个字段,没有唯一的类可以区分它们,因此您将不得不依赖顺序(我假设用户名位于电话号码之前),这意味着您必须使用 xpaths:

 (//tr//span[contains(@class, 'oe_form_field_char')])[1]//input
 (//tr//span[contains(@class, 'oe_form_field_char')])[2]//input

这些 xpath 分别挑选出第一个和第二个字段,它们是作为 aspan的后代的输入oe_form_field_char

PS 我在 Firefox 中使用Firepath来验证 xpath 和 css 定位器。

于 2013-08-05T09:48:56.403 回答
0

使用以下 xpath 就像一个魅力。虽然我不推荐这种 xpath。由于我们没有针对文本框的文本没有其他选择。

//div/input[contains(@id, 'oe-field-input')]  - First text box
//tr[@class = 'oe_form_group_row'][2]//input  - Second text box
//tr[@class = 'oe_form_group_row'][3]//input  - Third text box
于 2013-08-01T06:14:02.090 回答
0

这里的问题是,您的 XPath 进行了正确的选择,但如果您的查询返回多个结果,Selenium 将始终选择第一个。

您可以使用以下命令直接选择每个输入字段:

//input[1]
//input[2]
//input[3]

如果还有其他输入字段,您可以通过仅选择具有id 属性的input节点来加强选择,如下所示:oe-field-input

//input[starts-with(@id,'oe-field-input-')][1]
//input[starts-with(@id,'oe-field-input-')][2]
//input[starts-with(@id,'oe-field-input-')][3]
于 2013-08-01T06:10:35.657 回答
0

您可以在 XPATH 下使用。

//tr[@class = 'oe_form_group_row'][2]//input 对于第一个文本框

//tr[@class = 'oe_form_group_row'][3]//input 对于第二个文本框

//tr[@class = 'oe_form_group_row'][4]//input 第三个文本框。

我已经测试了avove xpath。

但是,如果您有开发访问权限,那么更好的方法是要求开发人员进行标准化和推荐标签,例如“名称”、“值”,或附加文本,例如电子邮件:、密码。所以你可以在你的 xpath 中使用它们。

于 2013-08-05T09:52:35.343 回答