Селен: как найти узел, используя точное соответствие текста

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

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

Но проблема в том, что если у меня есть два элемента name hello и hello1, то эта функция работает неправильно.

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

/text()

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