2016-05-26 3 views
3

Я тестирую веб-приложение с использованием Nightwatch.js, которое использует Selenium WebDriver для взаимодействия с браузером. В моем приложении у меня есть динамически созданный список элементов, дифференцированных только по их именам, а имена отображаются как значения <input>. Мне нужно найти элемент по его названию.Найти элемент по значению свойства

Пример HTML-представление структуры документа:

<div class="item"> 
    <input> <!-- current value: "first" --> 
</div> 
<div class="item"> 
    <input> <!-- current value: "second" --> 
</div> 
<div class="item"> 
    <input> <!-- current value: "first" --> 
</div> 

мне нужно найти div.item, содержащий входной сигнал со значением second.

Обратите внимание, что значение в <input> определяется значением его valueсобственности, которая может отличаться от значения его valueатрибута. В моем случае DOM управляется React, поэтому входы могут не иметь атрибута value.

Есть ли способ найти элемент по property значение с Nightwatch (или Selenium WebDriver API)?

Я посмотрел на WebDriver documentation и единственный способ, которым я вижу executing пользовательский JavaScript кода, который имеет некоторые серьезные недостатки (например, требует собственной реализации ожидания для элемента появляться и не взаимодействует с NightWatch объектов страницы). Насколько я могу судить, все другие методы связаны только с HTML (так что атрибуты в лучшем случае, а не свойства).


Просто, чтобы быть совершенно ясно, с помощью селекторов, как input[value=...] (CSS) или //input[@value=...] (XPath) является не решение, так как он выполняет поиск по значению атрибута, а не значения свойства.

+0

FYI, а не 'nightwatch.js' конкретные, но' protractor' конкретным решением может быть использование недавно введенный [ 'by.js' локатор] (http://www.protractortest.org/ #/апи? смотреть = webdriver.By.js). – alecxe

+0

@alecxe Это интересная информация, но она, похоже, имеет то же удобство, что и Nightwatch/WebDriver [выполнить] (https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidexecute). (Обратите внимание на двусторонний перевод WebElements в/из DOMElements в аргументы и возвращаемое значение.) – hon2a

+0

Да, я боюсь, что нет другого пути, кроме как спуститься к выполнению пользовательских JS. – alecxe

ответ

1

Вы можете использовать .elements(), чтобы получить список элементов с class="item", а затем перебрать все элементы, используя .getValue(), чтобы получить значение свойства каждого входа. Если он соответствует имени, которое вы хотите, верните элемент.

function getElementsByValue(xpathSelector, expectedValue, callback) { 
    const foundElements = []; 
    browser.elements('xpath', xpathSelector, ({ value }) => value.forEach(inputEl => { 
    browser.elementIdValue(inputEl.ELEMENT, result => { 
     if (result.value === expectedValue) { 
     foundElements.push(inputEl); 
     } 
    }); 
    }); 
    browser.perform(() => callback(foundElements)); 
} 
+1

Ницца, вы поняли. Мой вопрос слишком общий, чтобы принять его как ответ, хотя он работает только для 'value'. По крайней мере, я почищу его. – hon2a

+0

Спасибо за улучшение :) – Raymond

Смежные вопросы