Может ли Selenium оценить все элементы XPath? - PullRequest
10 голосов
/ 10 сентября 2009

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

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

Ответы [ 5 ]

11 голосов
/ 10 сентября 2009

Вы можете использовать команду 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 + "]"));
}
5 голосов
/ 26 апреля 2012

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

пример

xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2] 
4 голосов
/ 02 июня 2010

С

/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.

2 голосов
/ 26 марта 2010

Я пытаюсь сделать то же самое в 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]

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

2 голосов
/ 10 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...