t.me/atinfo_chat Telegram группа по автоматизации тестирования

Какой CSS Selector использовать для контента элемента?

Теги: #<Tag:0x00007f748363a0e8> #<Tag:0x00007f748363a020>

Привет всем.
Есть некий кусок HTML:

<span class="class_foo">
  <span class="class_bar">content_bar</span>
  <br>
  content_foo
</span>

Какой должен быть CSS путь для поиска контента content_foo?
Если попытаться взять контент от родительского span[class="class_foo"], то его контентом будет: 'content_barcontent_foo'

driver.find_element :css, 'span[class="class_foo"] > br > ???'

Вот что вместо ??? надо вставить?

Как по мне, это не просто даже на JavaScript реализовать:

// Run me inside Chrome Dev console
// Prepare
var html = '<span class="class_foo"> \
  <span class="class_bar">content_bar</span> \
  <br> \
  content_foo \
  </span>';


var el = document.createElement("div");
el.innerHTML = html;

// Find node
var node = el.querySelector(".class_foo");

// Get last item 
console.log( node.childNodes[node2.childNodes.length - 1] );


Про CSS молчу… Вот если бы content_foo был в тег <p> обвернут…

Как насчет xpath? //*[@class=“class_foo”]/text(), пардон, в selenium такой хак не работает :frowning:

Вот если бы content_foo был в тег <p> обвернут
Ах если бы…

Почему же, XPath вполне работает в Selenium.
Хотелось, правда, обойтись совсем без XPath.

То есть этот xpath сработал? ) А чем не угодил xpath?

По идее этот xpath вернет весь текст, чего и не хочется.
Скажу как я это делаю. В моей практике такие случаи встречались достаточно редко, я использую метод самописный утилитный метод типа getElementTextWihoutChildren, Где беру весь текст, а потом прохожусь по чилдам(первого порядка разумеется) и просто реплейсом удаляю их текст.

Драйвер должен плюнуть exception на такое, ибо text() не является нодом, по которым собственно и осуществляется поиск via findElement(-s). text() будет работать, если его использовать в качестве функции поиска по тексту, а не возврата значения содержимого ноды.

Как уже написали выше, подобные задачи решаются путем взятия innerHtml у искомого элемента аля element.getAttribute("innerHTML"). Затем конечно же придется распарсить полученное значение, удалив все лишнее.

С помощью xPath:

//span[@class='class_foo']/text()[last()]

C jQuery еще проще:

$(".class_foo").clone().children().remove().end().text()