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

Как взять контент нескольких одинаковых элементов, находящихся на одном уровне?


(Валентина) #1

Вопрос, чувствую, простой, но сама никак не могу решить.
Есть несколько элементов, из которых нужно взять текст.
Структура такая:

<span class="parent">
  <span class="child_text_bold">text</span>
  <span class="child_text_bold">text</span>
  <span class="child_text">text</span>
  <span class="child_text">text</span>
</span>

<span class="parent">
  <span class="child_text_bold">text</span>
  <span class="child_text_bold">text</span>
  <span class="child_text">text</span>
  <span class="child_text">text</span>
</span>

Нужно взять текст из элементов с классом class=“child_text_bold”, но только для одного родителя. Т.е. для каждого по отдельности.
Как это сделать?

Заранее спасибо.


(Bolatbek) #2

В цикле если?
Выбрать элементы с классом “parent”
А внутри перебрать элементы с классом “child_text_bold”

А что значит “взять текст”, в результате для каждого “parent” должно получиться “texttext”?


(Bolatbek) #3

Если используется jQuery, то можно попробовать запустить скрипт, который вернет готовый массив:

var array= [];

$('.parent').each(function(index) {
   array.push({
        'parent': index,
        'child': $(this).children('.child_text_bold').text()
    });
  });
return array;

(Kosmos) #4

Еще бы указать ЯП на котором делаете.
Можно получить массив через xPath

.//span[contains(@class,'child_text')]

(Валентина) #5

Пишется на JS, использую как раз xpath. Есть вариант из предложенных выше:

var arrayNumbers = [];        
bySelector = By.xpath('//*[@class="parent"]');
return driver.findElements(bySelector).then((array) => {
    return array.forEach(function(val, i){						
        return array[i].findElements(By.xpath('//*[@class="child_text_bold"]')).then((subArray) => {
	    var bold= subArray.length;
	    arrayNumbers.push(rub);
       });
    });
});

Возвращает массив, в котором количество элементов равно количеству parent, НО значение каждого элемента равно сумме ВСЕХ ИМЕЮЩИХСЯ на странице элементов child_text_bold, а не только для этого parent. Не могу понять, где ошибка в коде?


(Валентина) #6

Подставила в код выше вместо //[@class=“child_text_bold”], все заработало правильно.
Причина ошибки была в использовании мной //
?


(Bolatbek) #7

Да.
//* - означает: поиск от корневого узла рекурсивно вниз
.// - искать от текущего контекста


(Kosmos) #8

Если для конкретного parent - да. Можно еще указывать xPath с классом Parent и конкретным индексом.

.//span[@class='parent'][1]/span[@class='child_text_bold']

вместо 1 можно подставить нужный индекс.


(Рома Иовлев) #9
xpath = "(//*[@class='parent'])[1]//*[@class='child_text_bold']" - для первой пары
xpath = "(//*[@class='parent'])[2]//*[@class='child_text_bold']" - для второй пары

(Рома Иовлев) #10

Без скобочек вокруг .//span[@class=‘parent’] это не будет работать )


(Валентина) #11

У меня с использованием этой конструкции почему-то ничего не находилось в строке поиска в хроме…


(Валентина) #12

вот этого ещё не знаю, а что дают скобочки?


(Kosmos) #13

хм, что-то не увидел, где пропустил скобки и разницу м-ду моим и вашим примером


(Kosmos) #14

это синтаксис. Смотря какие, круглые, квадратные…

Вот достаточно подробный мануал по xPath - https://docs.google.com/a/jazzteam.org/document/d/1PdfKMDfoqFIlF4tN1jKrOf1iZ1rqESy2xVMIj3uuV3g/pub


(Рома Иовлев) #15

На этой странице нажмите F12
и поищите
//article[1]/a - отдает 11 результатов
и (//article)[1]/a - отдает 1 результат