Как найти, используя 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(&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 ответа

Решение

Когда элемент не имеет уникальных идентифицируемых атрибутов, вы должны посмотреть на элементы вокруг него. В этом случае есть видимый пользователю текст, который помогает пользователю определить назначение поля. Этот же текст можно использовать для идентификации элемента в 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:/)
Другие вопросы по тегам