Не могу получить n-й узел в Selenium - PullRequest
16 голосов
/ 30 июля 2010

Я стараюсь писать выражения xpath, чтобы мои тесты не были нарушены небольшими изменениями дизайна. Поэтому вместо выражений, которые генерирует Selenium IDE, я пишу свои собственные.

Вот проблема:

//input[@name='question'][7]

Это выражение вообще не работает. Входные узлы с именем 'question' распределены по странице. Они не братья и сестры.

Я пытался использовать промежуточное выражение, но оно также не работает.

(//input[@name='question'])[2]
error = Error: Element (//input[@name='question'])[2] not found

Вот почему я полагаю, что у Селенюна неверная реализация XPath.

Согласно документам XPath , предикат позиции должен фильтроваться по позиции в наборе узлов , поэтому он должен найти седьмой input с именем 'question'. В Selenium это не работает. Селекторы CSS (:nth-of-kind) также отсутствуют.

Мне пришлось написать выражение, которое фильтрует их общих родителей:

//*[contains(@class, 'question_section')][7]//input[@name='question']

Это проблема, связанная с Selenium, или я неправильно читаю спецификации? Что я могу сделать, чтобы сделать более короткое выражение?

Ответы [ 2 ]

25 голосов
/ 30 июля 2010

Вот проблема:

//input[@name='question'][7]   

Это выражение вообще не работает.

Это FAQ .

[] имеет более высокий приоритет, чем //.

Вышеупомянутое выражение выбирает каждый элемент input с @name = 'question', который является седьмым дочерним элементом его родителя - и, очевидно, у родителей элементов input в документе, который не показан, не так много input детей.

Используйте (обратите внимание на квадратные скобки):

(//input[@name='question'])[7]

Выбирает седьмой элемент input в документе, который удовлетворяет условиям в предикате.

Редактировать

Люди, которые знают Selenium (Дейв Хант), предполагают, что вышеприведенное выражение записано в Selenium как:

xpath=(//input[@name='question'])[7]
6 голосов
/ 30 июля 2010

Если вам нужен 7-й input с атрибутом name со значением question в источнике, попробуйте следующее:

/descendant::input[@name='question'][7]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...