2015-04-17 1 views
1

Я пишу некоторые тесты браузера с осколком и иметь страницу с четко определенные строки, содержащие их собственные названия, кнопки и т.д. Что-то вроде:XPath для получения кнопки в строке

enter image description here

В моем конкретном случай, можно получить одну строку следующим образом:

row = lambda title: browser.find_by_xpath("//div[@class='my-row'][contains(., '{0}')]".format(title)) 

row1 = row('Row 1') 
row2 = row('Row 2') 

Затем с этим Lamba:

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text)) 

я мог оттачиваю на правильной регулярной кнопке или что-то вроде:

assert button(row1, 'Special button') 
assert not button(row2, 'Special button') 

Но когда я называю кнопку лямбду, он возвращает кнопку из других строк.

С моей точки зрения, поиск по xpath через эту lamba говорит: «Начиная с elmt, ищите кнопки , вложенные в elmt, которые содержат данный текст». Так как я получаю материал из других строк, не вложенных в текущий, хотя, что мне здесь не хватает?

Что не так с моим xpath?

ответ

1

Выражения XPath, начинающиеся с //, начинаются с узла root и выбирают узлы независимо от их положения в документе. Текущий контекстный узел такого выражения, например

//div 

не влияет на возвращаемый результат. Для поиска // (потомок-или-сам: :) ось, начиная с узла контекста, вам нужно использовать

.//div 

В вашем случае, это означает, что изменение

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text)) 

в

button = lambda elmt, text: elmt.find_by_xpath(".//a[@class='btn'][contains(.,'{0}')]".format(text)) 

(Предостережение: все, что касается выражений XPath в вашем коде, я не могу комментировать остальные.)

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