Может ли Selenium оценить все элементы XPath?

Возможно ли, чтобы Selenium оценил все элементы, которые могут соответствовать определенному XPath?

Например, я бы хотел проверить, отмечены ли все флажки с помощью //input[type='checkbox'] - проблема в том, что я получаю только один элемент.

Ответ 1

Вы можете использовать команду getXpathCount для определения количества совпадающих элементов. Затем вы можете прокручивать их, используя приращение для каждого элемента отдельно. Следующий пример Java (TestNG/JUnit) будет проверять, что отмечены все флажки на странице:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}

Ответ 2

Я пробовал описанный выше подход, и селен выбрасывал исключения, чтобы элемент не был найден. Префикс добавления xpath = разрешил проблему.

Пример

xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2] 

Ответ 3

С

/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]

вы можете искать только все элементы ввода в дереве. Это не сработает, если вы просто хотите проанализировать поддерево.

Лучший способ:

(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]

который вернет результат # 1, # 2 и т.д. выражения XPath в скобках.

Конечно, вы также можете сделать

(//input[@type='text'])[1]

Это очень удобно, поскольку Selenium просто использует первое совпадение и не может иметь дело с набором результатов, что обычно возвращает XPath.

Ответ 4

Нет никакого способа, чтобы селен мог оценить список предметов, возвращаемых локатором. Он просто захватывает первый и делает это с ним.

Ответ Дэйва - лучшая альтернатива тому, что вы ищете.

Ответ 5

Я пытаюсь сделать то же самое в Selenium и попытался использовать пример @dave-hunt, но это неправильный метод для поиска отдельного элемента в коллекции.

Рассмотрим следующий пример:

<form>
 <div>
  <input type="text" name="field1" />
 </div>
 <div>
  <input type="text" name="field2" />
 </div>
</form>

Если вы используете выражение типа:

//input[@type='text'][1]

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

Однако, если вы используете выражение типа:

/descendant::input[@type='text'][1]

или

/descendant::input[@type='text'][2]

первое выражение захватит первый вход, а второе выражение возьмет второй вход. Очень важно, чтобы вы использовали один "/" и НЕ двойной "//".