我正在自动化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>
答案 0 :(得分:1)
您可以尝试通过标签左右定位唯一元素的替代方法。例如:
如果您使用ISFW,则应为此类表单字段创建自定义组件。
答案 1 :(得分:1)
你确实有一些有助于识别的课程,例如: oe_form_field_email
,oe_form_field_char
。使用它们有点复杂,因为它们本身不在输入字段上,而第二个不是唯一的;但这很有可能:
.//span[contains(@class, 'oe_form_field_email')]//input
这是一个xpath,它将电子邮件字段标识为input
,它是span
类oe_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分别选出第一个和第二个字段,这些字段是span
类oe_form_field_char
的后代的输入。
P.S。我在firefox中使用了Firepath来验证xpath和css定位器。
答案 2 :(得分: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]
答案 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中使用它们。