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

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

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

<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”, но только для одного родителя. Т.е. для каждого по отдельности.
Как это сделать?

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

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

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

1 Симпатия

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

var array= [];

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

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

.//span[contains(@class,'child_text')]
1 Симпатия

Пишется на 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. Не могу понять, где ошибка в коде?

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

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

1 Симпатия

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

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

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

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

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

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

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

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

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

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

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