Жемчужина объекта страницы: идентификация объекта с одинаковыми свойствами на основе их видимости

У меня есть текстовое поле со следующим html. id является динамическим, и я не могу его использовать. Я заполняю текст в текстовом поле. <input type="text" id="117841" class="NEdit" title="MyText" maxlength="20" style="position: absolute; overflow: hidden; font-style: normal; font-weight: normal; font-family: arial; font-size: 12px; text-transform: uppercase; width: 184px; left: 28px; top: 0px; height: 14px;">

Есть кнопка «Добавить», и когда я нажимаю, создается новая вкладка. На новой вкладке у меня будет текстовое поле с теми же свойствами, что и выше, за исключением того, что создается новый id.

<input type="text" id="118355" class="NEdit" title="MyText" maxlength="20" style="position: absolute; overflow: hidden; font-style: normal; font-weight: normal; font-family: arial; font-size: 12px; text-transform: uppercase; width: 184px; left: 28px; top: 0px; height: 14px;">

Оба текстовых поля находятся на одной странице, но на разных вкладках, одно из которых visible, а другое невидимо. Вкладки отображаются как div. Между вкладками и полями внутри них нет никакой связи. Вкладки отображаются, как показано ниже:

<div id="117285" class="NTabTabs" style="position: absolute; overflow: visible; left: 0px; top: 0px; width: 1211px; height: 20px;"><div class="NTabTab" id="117285t0" style="cursor: pointer; position: absolute; overflow: hidden; white-space: pre; text-align: center; left: 2px; top: 2px; width: 101px; height: 16px; padding-top: 1px; border-top-width: 1px; border-top-style: solid; border-left-width: 1px; border-left-style: solid; border-right-width: 1px; border-right-style: solid;">Tab#1</div><div class="NTabActiveTab" id="117285t1" style="cursor: pointer; position: absolute; overflow: visible; white-space: pre; text-align: center; left: 104px; top: 0px; width: 65px; height: 19px; padding-top: 1px; border-top-width: 1px; border-top-style: solid; border-left-width: 1px; border-left-style: solid; border-right-width: 1px; border-right-style: solid;">Tab#2</div></div>

Как идентифицировать эти текстовые поля на основе их видимости?

Спасибо!


person mkum    schedule 11.11.2014    source источник
comment
Можете ли вы привести один пример HTML, который показывает оба поля? Учитывая, что есть вкладки, я думаю, вы будете различать их по элементу вкладки, а не по видимости.   -  person Justin Ko    schedule 11.11.2014
comment
Вкладки просто отображаются как div. Я обновил html для вкладки.   -  person mkum    schedule 12.11.2014


Ответы (1)


Я считаю, что лучший подход состоит в том, чтобы найти какое-то отличительное свойство между двумя элементами. Например, в HTML должно быть хотя бы что-то, что делает видимым одно, а другое нет.

Однако, если это не вариант, я думаю, что единственный оставшийся вариант — перебрать все возможные текстовые поля и выбрать то, которое видно.

Например, на следующей странице есть два текстовых поля, первое из которых не видно:

<html>
  <body>
    <div style="display:none;">
      <input type="text" id="1">
    </div>
    <div>
      <input type="text" id="2">
    </div>    
  </body>
</html>

Вы можете использовать метод доступа к текстовому полю, который проходит через элементы текстового поля и выбирает первый видимый.

class MyPage
  include PageObject

  text_field(:field){ text_field_elements.find(&:visible?) }
end

Когда используется объект страницы, вы увидите, что field_element будет вторым текстовым полем, так как оно видимое:

page = MyPage.new(browser)
p page.field_element.attribute('id')
#=> "2"

Обратите внимание, что для простоты примера блок доступа выполняет итерацию по всем текстовым полям. Однако вы можете передать дополнительные параметры в text_field_elements, чтобы уточнить, какие текстовые поля проверять. Например, следующий метод доступа найдет первое видимое текстовое поле с определенным заголовком:

text_field(:text2){ text_field_elements(:title => 'MyText').find(&:visible) }
person Justin Ko    schedule 11.11.2014
comment
Я пробовал как text_field(:text2){ text_field_elements.find(:title => 'MyText', &:visible) } и получаю ошибку Watir::Exception::ObjectReadOnlyException: object is read only {:element=>#<Selenium::WebDriver::Element:0x..fce41b688 id="0.9848784769419581-70">, :type=>"(any text type)", :tag_name=>"input or textarea"} - person mkum; 12.11.2014
comment
Я неправильно передаю дополнительные параметры? - person mkum; 12.11.2014
comment
Локатор :title необходимо добавить к методу text_field_elements, а не к методу find. Я добавил пример к ответу. - person Justin Ko; 12.11.2014
comment
Большое спасибо, Джастин. text_field(:text2){ text_field_elements(:title => 'MyText').find(&:visible) } сработало для меня. - person mkum; 12.11.2014