Номер элемента XPath возвращает все элементы, а не первый

Я использую следующий код для доступа к ссылке (для phpunit/selenium):

//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete']

используя средство проверки XPath в FireFox, он возвращает 7 элементов (поскольку есть 7 ссылок, соответствующих «заголовку теста 2»), но когда я добавляю [1] в конце:

//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'][1]

он по-прежнему возвращает 7 ссылок. Что я здесь делаю неправильно?


person Chris Mccabe    schedule 30.04.2012    source источник
comment
Кстати, селен по умолчанию будет обращаться только к одной ссылке (первой ссылке из семи вхождений ссылок). Что ты пытаешься сделать?   -  person Aleh Douhi    schedule 01.05.2012
comment
проверьте, работает ли кнопка удаления — та, которая была сгенерирована из предыдущего теста   -  person Chris Mccabe    schedule 02.05.2012


Ответы (2)


Когда вы добавляете [1] в конец вашего выражения, вы выбираете первый a дочерний элемент каждого ...td[3] (т. е. 7 a дочерних узлов). Вы можете изменить свой запрос на:

xpath=(//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'])[1]

или если вы используете webdriver (префикс xpath не нужен):

(//td[normalize-space() ='Test title 2']/following-sibling::td[3]/a[.='delete'])[1]

Это выберет первый a из всего набора a дочерних элементов ...td[3] элементов.

Дополнительные руководства см. в примерах XPath.

person Aleh Douhi    schedule 30.04.2012

Как сказано в спецификации:

Путь к местоположению //para[1] не означает то же самое, что и путь к местоположению /descendant::para[1]. Последний выбирает первый элемент-потомок para; первый выбирает все элементы-потомки para, которые являются первыми para дочерними элементами своих родителей.

Следовательно,

//td[normalize-space() ='Test title 2']/following-sibling::td[3]/descendant::a[.='delete'][1]

будет лучше работать в вашем случае.

person Petr Janeček    schedule 01.05.2012
comment
Обратите внимание, что в спецификации говорится о //para[1], но не /para[1]. - person Aleh Douhi; 01.05.2012
comment
Так что /descendant::td[normalize-space()='Test title 2'][1]/following-sibling::td[3]/a[.='delete'] будет правильнее. - person Aleh Douhi; 02.05.2012