watir, получить элемент по значению

использование watir/cucumber/ruby для тестирования веб-страницы. Проблема в том, что некоторые поля не могут быть расположены без javascript.

Это часть страницы, которую я хочу сопоставить:

<!-- ngIf: (!entry.valueIcon) --><div ng-if="(!entry.valueIcon)" class="ng-scope">
  <!-- valueAlt when value is not present or is on a separate object key such as valueFrom: { something: 'else' } -->
  <!-- ngIf: entry.valueAlt -->

  <!-- default value display -->
  <!-- ngIf: (!entry.valueAlt) --><input ng-if="(!entry.valueAlt)" type="text" class="form-control ng-valid ng-scope ng-valid-pattern ng-valid-minlength ng-valid-maxlength ng-dirty ng-valid-parse ng-touched" ng-class="{ 'key-value-editor-set-focus-value-1006' : $last  }" id="key-value-editor-value-1006-0" name="key-value-editor-value-1006-0" ng-attr-placeholder="{{ (!isReadonlyAny) &amp;&amp; valuePlaceholder || ''}}" maxlength="" ng-model="entry.value" ng-readonly="isReadonlyAny || isReadonlySome(entry.name) || entry.isReadonly" placeholder=""><!-- end ngIf: (!entry.valueAlt) -->
</div><!-- end ngIf: (!entry.valueIcon) -->

На самом деле в веб-браузере у меня введено значение XYZ. Но использование xpath как browser.element(xpath: %Q%*[@value="XYZ"]%) не находит элемент. С другой стороны, если я делаю browser.element(id: "key-value-editor-value-1006-0").value, возвращается правильное значение XYZ.

Теперь вы спросите, почему бы не выбрать элемент по идентификатору. Это потому, что это таблица полей ввода пар ключ/значение. И я хочу отредактировать значение, используя значение key в качестве параметра. Я не хочу хранить отдельный код для каждой необходимой комбинации.

Вопрос: есть ли способ выбрать элемент, только указав значение ключа XYZ с помощью селекторов watir. т.е. что поставить вместо ??? внизу?

browser.element(???)

Обновление: вот подход с использованием javascript, но мне интересно, можно ли то же самое сделать с помощью простых селекторов watir:

browser.browser.execute_script(%Q%var p = new RegExp("^BARBATRON$"); var el = document.getElementsByTagName("input"); for (var i=0; i<el.length; i++) { if (p.test(el[i].value)) return el[i]; }%).click

person akostadinov    schedule 05.09.2016    source источник
comment
Я не верю, что XPath %Q%*[@value="XYZ"]% верен. Я считаю, что это должно быть %Q%//*[@value="XYZ"]%. Хотя я не верю, что это корень вашей проблемы.   -  person Justin Ko    schedule 06.09.2016


Ответы (2)


Похоже, это ограничение (или ошибка?) в Selenium-Webdriver. Похоже, вы можете найти элемент только на основе значения при загрузке страницы. Вы не можете найти элемент, используя измененное значение.

# Element can be located using its original value
browser.text_field(value: 'initial value').exists?
#=> true
browser.text_field(xpath: '//*[@value="initial value"]').exists?
#=> true

# The value is changed
browser.text_field.set('new value')

# Element cannot be found using the new value
browser.text_field(value: 'new value').exists?
#=> false
browser.text_field(xpath: '//*[@value="new value"]').exists?
#=> false

# Element can still be found using the original value
browser.text_field(value: 'initial value').exists?
#=> true
browser.text_field(xpath: '//*[@value="initial value"]').exists?
#=> true

Единственное решение, по-видимому, заключается в повторении элементов, как вы это сделали. Хотя я лично предпочел бы сделать это на Ruby:

field = browser.text_fields.find { |t| t.value == 'XYZ' }
person Justin Ko    schedule 05.09.2016
comment
Круто, вы знаете, есть ли существующая ошибка, зарегистрированная для этого? Ваши примеры не показывают, что это очень важно, но угловое веб-приложение, похоже, создает эту таблицу на лету, поэтому все значения кажутся измененными значениями. Таким образом, watir не может найти их, независимо от того, изменил их пользователь или нет. - person akostadinov; 06.09.2016
comment
Для Watir определенно не зарегистрировано никаких ошибок, поскольку проблема может быть воспроизведена с помощью Selenium-WebDriver. Я не смог найти ошибку Selenium. - person Justin Ko; 06.09.2016
comment
Это не ошибка как таковая. Это разница между атрибутом value и свойством value. XPath может запрашивать только значения атрибутов, и когда значение поля обновляется, обновляется свойство, а не атрибут. - person Thomas Walpole; 07.09.2016
comment
Это прискорбно. Спасибо за разъяснение @TomWalpole. - person Justin Ko; 07.09.2016

Я не уверен, что понимаю, я не вижу атрибута value в вашем html. Возможно что-то вроде этого:

browser.element(id: /key-value-editor-value-\d{4}-0/).value

или это:

key = "1006"
browser.element(id: "key-value-editor-value-#{key}-0").value
person titusfortner    schedule 05.09.2016
comment
Эта таблица динамически генерируется angularjs. Я не знаю ключевые номера заранее, чтобы использовать их для выбора. Я просто хочу выбрать поле ввода, которое имеет значение. Я знаю, что HTML не содержит значения. См. вопрос. element.value действительно возвращает значение правильно. Но я не могу найти селектор, который бы выбирал элемент на основе этого значения. - person akostadinov; 05.09.2016