如何使用Webdriver处理动态更改具有相似起始名称的id

时间:2013-08-01 05:18:22

标签: regex xpath selenium webdriver selenium-webdriver

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

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

首先查询: ID中的数字是动态的,它会保持变化 我厌倦了使用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>

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

你确实有一些有助于识别的课程,例如: oe_form_field_emailoe_form_field_char。使用它们有点复杂,因为它们本身不在输入字段上,而第二个不是唯一的;但这很有可能:

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

这是一个xpath,它将电子邮件字段标识为input,它是spanoe_form_field_email后代。你也可以在这样的css选择器中使用相同的逻辑,更有效:

span.oe_form_field_email input

对于其他两个字段,没有唯一的类可以区分它们,所以你将不得不依赖订单(我假设用户名来自电话号码),这意味着你必须使用XPath的:

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

这些xpath分别选出第一个和第二个字段,这些字段是spanoe_form_field_char的后代的输入。

P.S。我在firefox中使用了Firepath来验证xpath和css定位器。

答案 2 :(得分:0)

这里的问题是,你的XPath做了正确的选择,但如果你的查询返回了多个结果,Selenium将总是选择第一个。

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

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

如果还有其他输入字段,您可以通过在其id属性中仅选择inputoe-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]

答案 3 :(得分: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

答案 4 :(得分: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中使用它们。