package com.codeborne.selenide.impl; import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; import com.codeborne.selenide.ex.ElementNotFound; import org.openqa.selenium.WebElement; import java.lang.reflect.Proxy; import java.util.List; import static com.codeborne.selenide.Condition.visible; public class CollectionElementByCondition extends WebElementSource { public static SelenideElement wrap(WebElementsCollection collection, Condition condition) { return (SelenideElement) Proxy.newProxyInstance( collection.getClass().getClassLoader(), new Class<?>[]{SelenideElement.class}, new SelenideElementProxy(new CollectionElementByCondition(collection, condition))); } private final WebElementsCollection collection; private final Condition condition; CollectionElementByCondition(WebElementsCollection collection, Condition condition) { this.collection = collection; this.condition = condition; } @Override public WebElement getWebElement() { List<WebElement> list = collection.getActualElements(); for (WebElement element : list) { if (condition.apply(element)) { return element; } } throw new ElementNotFound(getSearchCriteria(), condition); } @Override public String getSearchCriteria() { return collection.description() + ".findBy(" + condition + ")"; } @Override public ElementNotFound createElementNotFoundError(Condition condition, Throwable lastError) { if (collection.getActualElements().isEmpty()) { return new ElementNotFound(collection.description(), visible, lastError); } return super.createElementNotFoundError(condition, lastError); } @Override public String toString() { return getSearchCriteria(); } }