Возможно ли, чтобы Selenium оценил все элементы, которые могут соответствовать определенному XPath
?
Например, я бы хотел проверить, отмечены ли все флажки с помощью //input[type='checkbox']
- проблема в том, что я получаю только один элемент.
Возможно ли, чтобы Selenium оценил все элементы, которые могут соответствовать определенному XPath
?
Например, я бы хотел проверить, отмечены ли все флажки с помощью //input[type='checkbox']
- проблема в том, что я получаю только один элемент.
Вы можете использовать команду 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 + "]"));
}
Я пробовал описанный выше подход, и селен выбрасывал исключения, чтобы элемент не был найден. Префикс добавления xpath = разрешил проблему.
Пример
xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2]
С
/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.
Нет никакого способа, чтобы селен мог оценить список предметов, возвращаемых локатором. Он просто захватывает первый и делает это с ним.
Ответ Дэйва - лучшая альтернатива тому, что вы ищете.
Я пытаюсь сделать то же самое в 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]
первое выражение захватит первый вход, а второе выражение возьмет второй вход. Очень важно, чтобы вы использовали один "/" и НЕ двойной "//".