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

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

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

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

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

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

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

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

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

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

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

показывает

The annotation @FindBy is disallowed for this location

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

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

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.

1 лайк

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

почему?

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

1 лайк

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

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

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

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

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

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

1 лайк

локатор если нужны внутренние елементы:
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 в моем ответе выше.

1 лайк