Я пытаюсь записать выражения XPath так, чтобы мои тесты не были повреждены маленькими конструктивными изменениями. Таким образом вместо выражений, которые генерирует Селен IDE, я пишу свое собственное.
Вот проблема:
//input[@name='question'][7]
Это выражение не работает вообще. Названный 'вопрос' узлов входа распространен через страницу. Они не одноуровневые элементы.
Я попытался использовать промежуточное выражение, но оно также перестало работать.
(//input[@name='question'])[2]
error = Error: Element (//input[@name='question'])[2] not found
Вот почему я предполагаю, что Seleniun имеет неправильную реализацию XPath.
Согласно документам XPath, предикат положения должен отфильтровать положением в наборе узлов, таким образом, это должно найти седьмое input
с именем 'question'
. В Селене это не работает. Селекторы CSS (:nth-of-kind
) ни один.
Я должен был записать выражение, которое фильтрует их общих родителей:
//*[contains(@class, 'question_section')][7]//input[@name='question']
Действительно ли это - конкретный вопрос Селена, или я читаю спецификации неправильный путь? Что я могу сделать для создания более короткого выражения?
Вот проблема:
//input[@name='question'][7]
Это выражение вообще не работает.
Это FAQ.
[]
имеет более высокий приоритет, чем //
.
Приведенное выше выражение выбирает каждый input
элемент с @name = 'question'
, который является 7-м ребенком своего родителя -- и, видимо, родители input
элементов в документе, который не показан, не имеют так много input
детей.
Использовать (обратите внимание на скобки):
(//input[@name='question'])[7]
Это выбирает 7-й элемент input
в документе, который удовлетворяет условиям предиката.
Edit:
Люди, знающие Selenium (Dave Hunt), подсказывают, что приведенное выше выражение записывается в Selenium как:
xpath=(//input[@name='question'])[7]
Если вам нужен 7-й вход
с атрибутом name
со значением question
в источнике, попробуйте следующее:
/descendant::input[@name='question'][7]