Selenium: как найти узел, используя точное совпадение текста - PullRequest
17 голосов
/ 14 октября 2011

Я хочу найти элемент на веб-странице, используя текст.
Я знаю, что для этого есть имя метода, например:

tr[contains(.,'hello')]/td

Но проблема в том, что у меня дваимена элементов hello и hello1, тогда эта функция не работает должным образом.

Есть ли какой-либо другой метод, например, содержит для точного соответствия строк для определения местоположения элементов?

Ответы [ 3 ]

27 голосов
/ 14 октября 2011
tr[.//text()='hello']/td

это выберет все дочерние элементы td всех элементов tr, имеющих дочерний элемент с точно 'hello' в нем. Такой XPath все еще звучит странно для меня.

Я считаю, что это имеет больше смысла:

tr/td[./text()='hello']

потому что он выбирает только тд, содержащий текст.

это помогает?

6 голосов
/ 14 октября 2011

Все зависит от того, что на самом деле содержит ваш HTML, но ваш tr[contains(.,'hello')]/td XPath-селектор означает " первая ячейка первой строки, которая содержит строку 'hello' в любом месте внутри нее " (или, более того,точно, " первый элемент TD в элементе TR, который содержит строку 'hello' в любом месте внутри него ", поскольку Selenium не имеет представления о том, что на самом деле делают задействованные элементы).Вот почему это дает неправильный результат, когда есть строки, содержащие «hello» и «hello1» - обе содержат «hello».

Селектор tr[. ='hello']/td будет более точным, но это немного необычно (потому что HTMLЭлементы TR не должны содержать текст - текст должен быть в элементах TH или TD внутри TR), и, вероятно, он не будет работать (потому что текст в любых других ячейках нарушит сравнение). Вы, вероятно, хотите tr[td[.='hello']]/td, что означает « первый элемент TD, содержащийся в элементе TR, который содержит элемент TD со строкой 'hello' в качестве полного текста ".

1 голос
/ 14 октября 2011

Ну, ваша проблема в том, что вы ищете текст в tr (что в любом случае неверно), и это вызывает проблему для функции contains, которая не может принять список текста.Попробуйте вместо этого использовать этот путь.Он должен получить то, что вы хотите.

//tr/td[contains(./text(),"hello")]

Этот путь к местоположению будет извлекать набор узлов, по которым вы должны выполнить итерацию, чтобы получить текст.Вы можете попытаться добавить

/text()

, но это вызовет (по крайней мере, в моем тесте) результат, представляющий собой строку, которая является объединением всех совпадающих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...