我正在使用包含以下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("132:","_focus",event);"
onchange="juic.fire("132:","_despatchChange",event);"
onblur="juic.fire("132:","_blur",event);" size="60"
onkeydown="juic.fire("132:","_onkeydown",event);"
onkeyup="juic.fire("132:","_onkeyup",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')
有什么想法吗?
答案 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.等。