Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

css-selectors
webdriver
Теги: #<Tag:0x00007f7b61b96570> #<Tag:0x00007f7b61b963e0>

(Сергей Блохин) #1

Привет всем.
Есть некий кусок 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 > ???'

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


(Дмитрий Жарий) #2

Как по мне, это не просто даже на 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> обвернут…


(rmerkushin) #3

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


(Сергей Блохин) #4

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


(Сергей Блохин) #5

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


(rmerkushin) #6

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


(sidelnikovmike) #7

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


(Sergey Korol) #8

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

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


(Serhii Tanchenko) #9

С помощью xPath:

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

C jQuery еще проще:

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