Valentine
(Валентина)
30.Август.2016 20:49:49
#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”, но только для одного родителя. Т.е. для каждого по отдельности.
Как это сделать?
Заранее спасибо.
Mes
(Bolatbek)
30.Август.2016 21:13:48
#2
В цикле если?
Выбрать элементы с классом “parent”
А внутри перебрать элементы с классом “child_text_bold”
А что значит “взять текст”, в результате для каждого “parent” должно получиться “texttext”?
1 лайк
Mes
(Bolatbek)
30.Август.2016 21:54:51
#3
Если используется jQuery, то можно попробовать запустить скрипт, который вернет готовый массив:
var array= [];
$('.parent').each(function(index) {
array.push({
'parent': index,
'child': $(this).children('.child_text_bold').text()
});
});
return array;
blink2004
(Kosmos)
30.Август.2016 23:47:17
#4
Еще бы указать ЯП на котором делаете.
Можно получить массив через xPath
.//span[contains(@class,'child_text')]
1 лайк
Valentine
(Валентина)
31.Август.2016 02:42:22
#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. Не могу понять, где ошибка в коде?
Valentine
(Валентина)
31.Август.2016 03:01:34
#6
Подставила в код выше вместо //[@class=“child_text_bold”], все заработало правильно.
Причина ошибки была в использовании мной // ?
Mes
(Bolatbek)
31.Август.2016 03:36:00
#7
Да.
//* - означает: поиск от корневого узла рекурсивно вниз
.// - искать от текущего контекста
1 лайк
blink2004
(Kosmos)
31.Август.2016 07:46:26
#8
Если для конкретного 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’] это не будет работать )
Valentine
(Валентина)
31.Август.2016 11:41:42
#11
У меня с использованием этой конструкции почему-то ничего не находилось в строке поиска в хроме…
Valentine
(Валентина)
31.Август.2016 11:43:17
#12
вот этого ещё не знаю, а что дают скобочки?
blink2004
(Kosmos)
01.Сентябрь.2016 12:03:34
#13
хм, что-то не увидел, где пропустил скобки и разницу м-ду моим и вашим примером
blink2004
(Kosmos)
01.Сентябрь.2016 12:08:40
#14
romanyister
(Рома Иовлев)
01.Сентябрь.2016 15:29:34
#15
На этой странице нажмите F12
и поищите
//article[1]/a - отдает 11 результатов
и (//article)[1]/a - отдает 1 результат