Вопрос

Возможно ли, чтобы 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]

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top