如何使用Xpath定位输入字段而不使用其id

时间:2016-12-21 20:23:23

标签: xpath watir watir-webdriver page-object-gem

我正在使用包含以下HTML的网页,我想在页面对象中使用text_field识别<input>中的第一个<span>字段。

<div id="131:">  Please enter your name:
<span class="autocompspan " style="position:static;">
    <input style="position: static;" class="autocompinput yui-ac-input" id="132:" name="132:" 
    onfocus="juic.fire(&quot;132:&quot;,&quot;_focus&quot;,event);" 
    onchange="juic.fire(&quot;132:&quot;,&quot;_despatchChange&quot;,event);" 
    onblur="juic.fire(&quot;132:&quot;,&quot;_blur&quot;,event);" size="60" 
    onkeydown="juic.fire(&quot;132:&quot;,&quot;_onkeydown&quot;,event);" 
    onkeyup="juic.fire(&quot;132:&quot;,&quot;_onkeyup&quot;,event);" aria-disabled="false" value="" 
    role="combobox" aria-autocomplete="list" aria-owns="132:_divList" 
    aria-activedescendant="132:_divAD" findtype="proxy" delimchar="" hideusername="false" 
    fetchusername="false" autocomplete="off" type="text">
    <input value="" id="132:_hidden" name="132:_hidden" type="hidden">
</span>
</div>

如果我使用:id => '132:'来识别字段,那么一切正常。即text_field(:target_user_name, :id => '132:' )有效。

问题是此HTML是由底层应用程序(SAP)生成的,它并不总是为<input>字段id生成相同的值,因此无法使用id一致地识别元素。 因此,鉴于上述HTML,我可以采用其他方式可靠地找到此<input>字段。

我尝试了以下方法,但都没有效果。他们中的大多数人都在等待元素定位。

text_field(:target_user_name, :xpath => "//*[@class='autocompinput yui-ac-input' and @role = 'combobox']" )
text_field(:target_user_name, :xpath => "//*[@class='autocompinput' and @role = 'combobox']" )
text_field(:target_user_name, :xpath => "//span/input[@class='autocompinput yui-ac-input' and @role = 'combobox']" )
text_field(:target_user_name, :xpath => "//input[@class='autocompinput yui-ac-input' and @role = 'combobox']" )
text_field(:target_user_name, :class => 'autocompinput yui-ac-input')

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

首先,Watir旨在使您不必使用XPATH。

这取决于页面上有多少不同的元素/ ID,但我发现使用正则表达式通常可以很好地处理动态生成的ID。所以要么抓住id并在其他地方使用它:

id = browser.text_field(id: /\d\d\d/).tr(':', '')

或直接使用它:

text_field(:target_user_name, id: /\d\d\d:/)

答案 1 :(得分:0)

当元素没有唯一可识别属性时,您应该查看它周围的元素。在这种情况下,存在用户可见文本,其帮助用户识别该字段的目的。可以使用相同的文本来标识Watir中的元素。

由于周围的div仅包含标签文字,您可以按其文字搜索div并获取其中唯一的文字字段:

browser.div(text: 'Please enter your name:').text_field

作为页面对象访问者:

text_field(:target_user_name) { div_element(text: 'Please enter your name:').text_field_element }

答案 2 :(得分:0)

在这种特殊情况下,您可以使用xpath下方的“请输入您的姓名:”文本后检查第一个输入字段:

//div[text()='Please enter your name:']//following::input[1]

通常,如果您遇到没有唯一标识符的字段,您可以依赖静态文本或字段,然后使用xpath函数,例如follow,previous etc.等。