перебрать список веб элементов и выбрать нужное

selenium
java
webdriver
Теги: #<Tag:0x00007fedb8b13520> #<Tag:0x00007fedb8b130e8> #<Tag:0x00007fedb8b12f58>

(Ezzr Qvap) #1

Допустим мы получили список элементов, по запросу
<div class="text-block">

как теперь из этих элементов выбрать другие элементы, например внутри того дива есть
<div class="inner-block">

Как его получить, перебирая элементы верхнего списка ?

другими словами, структура страницы такая

<div class="text-block">
    <div class="inner-block">
    </div>
</div>

Page Object Pattern [пример написания своего фреймворка]
(Дмитрий Кравчук) #2

Доброго дня. Может вам сразу собирать в список вложенные div’ы ?

@FindBy(xpath=".//div[@class='text-block']/div[@class='inner-block']")
List<WebElement> innerBlockList;

(Ezzr Qvap) #3

хм, я и не знал что так можно сразу наполнять списки


(Ezzr Qvap) #4

а как включить эту нотацию? так получится?

@FindBy(css="div.text-block")
List<WebElement> list;

показывает

The annotation @FindBy is disallowed for this location


(Andrey) #5

Эта аннотация вроде для одиночных элементов, если не ошибаюсь, а у вас список…


(Ezzr Qvap) #6

оказывается такая нотация может быть только полем класса, но это как бы все усложняет


(Andrey) #7

List<WebElement> fields are decorated if and only if they have @FindBy or @FindBys annotation. Default search strategy “by id or name” that works for WebElement fields is hardly suitable for lists because it is rare to have several elements with the same id or name on a page.


#8

Вернее, такая аннотация может быть повешена только над полем класса.

почему?

если не хочется юзать FindBy, то можно просто сделать driver.findelementS(By.xpath(“your locator”));


(Дмитрий Кравчук) #9

Да. Эта аннотация является частью реализации шаблона PageObject, если я не ошибаюсь.Класс = страница сайта, поле класса = html элемент на странице.
Вам наверно подойдет такое решение:

List<WebElement> innerBlockList = driver.findElements(By.xpath(".//div[@class='text-block']/div[@class='inner-block']"));

(Oleksandr Khotemskyi) #10

Можно так же ограничить контекст поиска внешним элементом:

List<WebElement> outerBlocksList = driver.findElements(By.сssSelector("div.text-block"));

//Потом например хотим внутренний блок найти внутри третьего элемента списка
WebElement innerElemForThirdBlock = outerBlocksList[2].findElement(By.cssSelector("div.inner-block"))

К сожалению нет джавы под рукой, могу в синтаксисе ошибатся


(Ok Tober) #11

локатор если нужны внутренние елементы:
By.cssSelector(".textblock .inner-block")
или если нужно учитывать, что иннер сразу внутри текст блока:
By.cssSelector(".textblock>.inner-block")

если нужен текст-блок елемент внутри которого есть иннер
By.xPath("//*[contains(@class,'text-block')][.//*[contains(@class,'inner-block')]]")
если уверены что нужен ‘equals’ клас а не ‘contains’ то будет короче (но не советую)
By.xPath("//*[@class='text-block'][.//div[@class='inner=block']]')

из локаторов можете получать как 1 елемент так и лист елементов

есть вариант селенидом если нужны внутренние елеменеты:

$(".text-block").find(".inner-block");
$(".text-block").$(".inner-block");
$(".text-block").findAll(".inner-block");
$(".text-block").$$(".inner-block");

а вообще советую задать полный вопрос - что и зачем вы хотите получить. Вам точно нужно “перебирать” елементы? Очень сомневаюсь) Если нужен просто див внутри которого есть что-то другое - то смотрите By.xPath в моем ответе выше.