Xpath / Selenium - Как мне получить все опции в <select>, кроме значения по умолчанию, при условии простого dom? - PullRequest
0 голосов
/ 08 марта 2019

Работая над тестом автоматизации с использованием codeceptjs / selenium, мне нужно прочитать текст узлов выпадающего списка, не зная, что они будут делать раньше времени, и исключив параметр по умолчанию, выделенный серым (поскольку приложение не будет работать пока не сделан выбор).

<select id="itemname1">
 <option class="greydefault">How Many?</option>
 <option>6</option>
 <option>8</option>
 <option>10</option>
 <option>12</option>
</select>
<select id="itemname2">
 <option class="greydefault">What Type?</option>
 <option>a</option>
 <option>b</option>
 <option>c</option>
 <option>d</option>
</select>

Учитывая приведенную выше простую dom, вопрос заключается в том, как написать xpath, который захватит все 4 узла опции, которые содержат 6 8 10 и 12. И еще один xpath, который возвращает все 4 узла опции a b c и d.

Вот мои попытки, которые не работают для меня:

.//option/preceding::option[text()="What Type?"]/following::option[text()="How Many?"]

.//option/following::option[text()="How Many?"]/preceding::option[text()="What Type?"]


.//option/preceding::option[text()="What Type?"] and following::option[text()="How Many?"]


.//option/[preceding::option[text()="What Type?"] and following::option[text()="How Many?"]]

Первые 2 попытки возвращают мне только узел «Сколько», а следующие попытки недействительны.

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

То, что xpath вставлен в функцию, которая читает тексты узлов, выглядит следующим образом:

  getElementsText(locator) {
    let driver = this.helpers.Protractor.browser;
    return driver.element.all(locator).getAttribute("textContent").then((result) => {
      return result.toString().split(',');
    });
  }

Ответы [ 3 ]

1 голос
/ 09 марта 2019

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

Первый список:

select#itemname1 option:not(:first-child)

Второй список:

select#itemname2 option:not(:first-child)
1 голос
/ 09 марта 2019

Получить все option элементы на основе текста по умолчанию (отображаемое значение) в этом select:

//select[option[text()="How Many?"]]/option[not(@class="greydefault")]

Получить все на основе родительского идентификатора select:

//select[@id="itemname2"]/option[not(@class="greydefault")]

В обоих случаях вы сначала находите элемент select - в первом - тот, у которого есть дочерний элемент option с этим текстом;во втором - тот, у которого есть этот идентификатор, а затем получить всех его потомков (прямых потомков), которые не имеют этого class значения.

0 голосов
/ 09 марта 2019

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

.//option[following::option[text()="How Many?"] and preceding::option[text()="What Type?"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...