2009-12-17 2 views
3

Я пытаюсь проиндексировать результаты, возвращаемые xpath. Например:Индексирование результатов, возвращаемых selenium

xpath = '//a[@id="someID"]' 

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

numOfResults = sel.get_xpath_count(xpath) 
l = [] 
for i in range(1,numOfResults+1): 
    l.append(sel.get_text('(%s)[%d]'%(xpath, i))) 

будет работать, потому что делать что-то подобное с Xpath проверки Firefox работает:

(//a[@id='someID'])[2] 

возвращает 2-й результат.

Идеи почему поведение будет отличаться и как сделать такую ​​вещь с селеном Благодаря

ответ

1

Ответ в том, что вы должны сказать, что селен, который вы используете XPath:

numOfResults = sel.get_xpath_count(xpath) 
l = [] 
for i in range(1,numOfResults+1): 
    l.append(sel.get_text(xpath='(%s)[%d]'%(xpath, i))) 
0

В Selenium вы обычно делаете это без дополнительных кронштейнов, чтобы ваш цикл будет выглядеть следующим образом

numOfResults = sel.get_xpath_count(xpath) 
l = [] 
for i in range(1,numOfResults+1): 
    l.append(sel.get_text('%s[%d]'%(xpath, i))) 

И это даст правильный XPath в Selenium как //a[@id='someID'][2]

+1

Это не работает - потому что он перебирает на ребенка а-с. Это означает, что если у вас есть два a-s, соответствующие этому xpath, и оба имеют родительский div. И оба являются первым потомком этого div, тогда 'xpath [1]' вернет обе ссылки, а 'xpath [2]' не вернет ни одного. – Guy

+0

'// a [@ id = 'someID'] [1]' должен возвращать первый элемент на странице, являющийся ссылкой с идентификатором = someID, а затем '// a [@ id = 'someID] [2] ] 'вернет 2-й элемент. С помощью этого xpath вы используете его, не заботятся о том, что такое родитель. 'xpath [1]' не будет возвращать массив, потому что он ищет первый элемент в массиве – AutomatedTester

+1

попробуйте это: goto http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns = 1 & q = google (или выполните поиск google в google) и найдите xpath '// li // a [1]'. Я получаю все ссылки, а не только первый. – Guy

2

вы можете попробовать /html/descendant::a[@id="someID"] XPath вы можете заменить /html с чем-то еще тха t является предком ваших ссылок, например id('content'). Затем вы должны быть в состоянии найти отдельные ссылки с помощью [1], [2] и т.д.

Из XPath TR в http://www.w3.org/TR/xpath#path-abbrev:

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

Смежные вопросы