Может ли Selenium оценить все элементы XPath?
Вопрос
Возможно ли, чтобы 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]
первое выражение захватит первый входной сигнал, а второе выражение захватит второй входной сигнал.Очень важно, чтобы вы использовали одинарное "/", а НЕ двойное "//".