Как найти, используя Xpath, поле ввода без использования его идентификатора
Я работаю с веб-страницей со следующим HTML, где я хочу определить первый <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')
Какие-нибудь мысли?
3 ответа
Когда элемент не имеет уникальных идентифицируемых атрибутов, вы должны посмотреть на элементы вокруг него. В этом случае есть видимый пользователю текст, который помогает пользователю определить назначение поля. Этот же текст можно использовать для идентификации элемента в 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 }
В этом конкретном случае вы можете проверить первое поле ввода после текста "Пожалуйста, введите ваше имя:", используя ниже xpath:
//div[text()='Please enter your name:']//following::input[1]
В общем, если вы сталкиваетесь с полями, которые не имеют уникального идентификатора, вы можете полагаться на статический текст или поля, а затем использовать функции xpath, такие как follow, previous и т. Д.
Во-первых, Watir разработан так, чтобы вам не приходилось использовать XPATH.
Это зависит от количества различных элементов / идентификаторов на странице, но я обнаружил, что использование регулярных выражений часто хорошо работает с динамически генерируемыми идентификаторами. Так что либо возьмите идентификатор и используйте его в другом месте:
id = browser.text_field(id: /\d\d\d/).tr(':', '')
или просто используйте его напрямую:
text_field(:target_user_name, id: /\d\d\d:/)