Не удается получить nth node в Selenium

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

Здесь проблема:

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

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

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

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

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

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

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

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

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

Ответ 1

Здесь проблема:

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

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

Это FAQ.

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

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

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

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

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

Edit

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

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

Ответ 2

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

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