Селен: как найти узел, используя точное соответствие текста
Я хочу найти элемент на веб-странице, используя текст.
Я знаю, что для этого есть имя метода, например:
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()
но это приведет (по крайней мере, к моему тесту) результат, который является строкой, которая является конкатенацией всех совпадающих строк.