2016-09-05 12 views
1

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

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

<!-- 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.

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

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

browser.element(???)

Update: здесь подход с использованием 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 
+0

Я не верю, что XPath '% Q% * [@ value =" XYZ "]%' правильный. Я считаю, что это должно быть '% Q% // * [@ value =" XYZ "]%'. Хотя я не верю, что это корень вашей проблемы. –

ответ

0

Я не уверен, я понимаю, я не» t см. атрибут 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 
+0

Эта таблица динамически генерируется угловыми. Я не знаю ключевых номеров заранее, чтобы использовать их для выбора. Я просто хочу выбрать поле ввода, которое имеет значение «что-то». Я знаю, что HTML не содержит значения. См. Вопрос. 'element.value' возвращает значение правильно. Но я не могу определить селектор, который будет выбирать элемент на основе этого значения. – akostadinov

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' } 
+0

Удивительно, знаете ли вы, что для этого существует ошибка? Ваши примеры не показывают, что это очень важно, но угловое веб-приложение, похоже, генерирует эту таблицу «на лету», поэтому все значения выглядят как измененные значения. Таким образом, watir не может найти на основе их, независимо от того, изменил ли пользователь их или нет. – akostadinov

+0

В Watir определенно нет ошибок, поскольку проблема может быть воспроизведена с помощью Selenium-WebDriver. Я не мог найти ошибку Селена. –

+0

Это не ошибка сама по себе. Это разница между атрибутом value и свойством value. XPath может запрашивать только значения атрибутов, а когда значение поля обновляется, это свойство, которое обновляется, а не атрибут –