Получите N-й элемент с XPath - когда элемент [N] завершается неудачно - PullRequest
4 голосов
/ 06 октября 2011

Уже было некоторое обсуждение N-го элемента в XPath:

XPath-запрос для получения n-го экземпляра элемента

Получить N-й дочерний элементузел, использующий xpath

XPath и PHP: парсинг n-го экземпляра элемента

Я использую Selenium и PHPUnit для функционального тестирования.Моя проблема в том, что на странице с большой формой N-й селектор не работает.У меня есть 80 полей ввода (используя вызов Selenium getXpathCount ('// input'), чтобы получить точное число) - и я хотел бы перебрать эти 80 полей и набрать какой-нибудь текст.То, что я уже пробовал и не работает (N - это индексная переменная):

//input[N]
//input[position()=N]
input[N]
(//input)[N]
(.//input)[N]
css=input:nth-of-type(N)

И все смеси, перечисленные выше.Обычно запускается исключение, говорящее: элемент не найден при N = 2. Я пробовал несколько инструментов XPath для браузеров, так что в качестве собственных расширений, таких как XPathEvaluator в Chrome - почти все дали мне правильные результаты.Так что, похоже, парсер Seleniums XPath работает немного по-другому.

Что вы думаете?Я что-то пропустил?

Обновление: вот мое решение: getAllFields (): http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/DefaultSelenium.html#getAllFields(), а затем я перебираю.

Это на самом деле не решаетПервоначальная проблема, поэтому я все еще заинтересован в ответе.

Спасибо!

Ответы [ 4 ]

10 голосов
/ 06 октября 2011

(//input)[15] возвращает 15-й элемент ввода в документе

//input[15] возвращает каждый элемент ввода, являющийся 15-м дочерним элементом входного элемента его родительского элемента.

Так что, по крайней мере, некоторые из ваших выражений неверны. Но они не все неверны, поэтому я не знаю, почему это не работает для вас.

3 голосов
/ 08 октября 2011

Не видя вашего конкретного кода и HTML, мы в основном догадываемся здесь.Но xpath=(//input)[2] найдет второе поле ввода на странице, независимо от того, где оно находится.Обязательно укажите xpath=, потому что Selenium RC не предполагает его, если локатор не начинается с //.Также обратите внимание, что в XPath n начинается с 1, а не с 0, как в языках, производных от C.

1 голос
/ 30 июня 2014

Этот работал для меня:

/descendant::input[@id="search_query"][2]

См. Также этот ответ

0 голосов
/ 06 октября 2011

Я не использую PHPUnit, но мне нравится XPath.

В поле поиска инспектора Safari:

//input[N]

или в области видимости:

//div/input[N]    means second input in a div
(//div/input)[N]  means second div that has an input (select the first input)
...