# com.codeborne.selenide.ElementsCollection \[src]

Объект этого класса также является прокси точно также как [SelenideElement](https://github.com/selenide/user-guide/tree/b81bf4a2f4e5354b1ce675b5ba7ddbd8b45ba9cc/selenide-api/selenide-element.md). Его можно получить с помощью вызова метода `$$`, и он представляет список веб-элементов на странице.

Для ElementsCollection определенны методы следующего типа:

* методы выборки внутренних элементов
  * а точнее методы создания прокси-элементов представляющих выбранные элементы из данной коллекции
* методы-проверки состояния коллекции элементов - assertions
* методы получения статусов и значений коллекции элементов

## Assertions

инициируют для прокси-коллекции поиск актуальных версий элементов коллекции на странице, совершают проверку по предикату ("условию" - объекту-кондишену класса CollectionCondition), и возвращают объекты ElementsCollection, позволяя использовать цепочки вызовов.

* `shouldBe`     - e.g. `$$(".errors").shouldBe(empty)`
* `shouldHave`     - e.g. `$$("#mytable tbody tr").shouldHave(size(2))`

Также играют роль явных ожиданий (explicit waits). Они **ждут** до удовлетворения условия (size, empty) пока не истечет таймаут (значение `Configuration.collectionsTimeout`, которое установлено по умолчанию в 6000 миллисекунд).

## Методы получения статусов и значений коллекции элементов

Инициируют для прокси-коллекции поиск актуальных версий элементов коллекции на странице, и возращают соответствуюе значение:

* size()
* isEmpty()
* getTexts()  // возвращает массив видимых текстов, e.g. для элементов `<li>a</li><li hidden>b</li><li>c</li>` вернет массив вида \["a", "", "c"]

Эти методы - **не** имеют встроенных неявных ожиданий.

## Методы выборки внутренних элементов

Дополнительная фильтрация - возвращает обьект прокси-коллекции представляющий отфильтрованные элементы оригинальной коллекции на странице, **не** имеет встроенных ожиданий.

* `filterBy(Condition)`  возвращает коллекцию (как ElementsCollection) из только тех элементов оригинальной коллекции, которые удовлетворяют условию - e.g. `$$("#multirowTable tr").filterBy(text("Norris"))`
* `excludeWith(Condition)`     - e.g. `$$("#multirowTable tr").excludeWith(text("Chuck"))`

Дополнительный поиск элементов - возвращает обьект прокси-элемента представляющий найденный элемент оригинальной коллекции на странице, **не** имеет встроенных ожиданий.

* `get(int) - возвращает n-ый элемент как`SelenideElement\`; при попытке действий над элементом сработает неявное ожидание до существования и видимости n-го элемента в оригинальной коллекции
* `findBy(Condition)` - возвращает элемент коллекции как `SelenideElement` который удовлетворяет условию , при попытке действий над элементом сработает неявное ожидание до появления в оригинальной коллекции соответствующего элемента&#x20;

Дополнительная фильтрация и поиск позволяют почти полностью отказаться от менее читабельных xpath локаторов:

```java
$$("#list li").filterBy(cssClass("enabled")).findBy(exactText("foo")).find(".remove").click();
// вместо
$(By.xpath("//*[@id='list']//li[@class='enabled' and .//text()='foo']//*[@class='remove']")).click();
```
