return elements = wait.until(condition.getType().apply(locator));
}
Я столкнулся с проблемой, что при переходе на новую страницу нужный мне массив не успевает подгрузиться весь: после перехода в этом массиве лишь один элемент, когда проходит пару секунд, то все находится корректно. Я преобразовал этот метод добавив проверку на размер массива и счетчик (который странный как по мне, но рабочий). Метод срабатывает корректно, но я знаю , что можно сделать явно легче/лучше. Привязывать счетчит жестко к времени sleep не хотелось бы. Идеально как я считаю, была бы реализация как в дефолтном ожидании (условие, общее время ожидания) .Мой метод сейчас выглядит так:
А что вы пытаетесь вытащить в массив? Учитывая, что вы переходите на новую страницу, это явно не вебелементы, скорее всего какие то данные? Если так, то это лучше делать с помощью джаваскрипта. Надежнее и быстрее.
Хм, у меня указан дженерик тип в методе, это <WebElement>. Давайте я немного проясню флоу.
Я делаю поиск по CSS. Поиск находит n-ое количество элементов, за это и отвечает метод waitForElements. В дальнейшем я фильтрую этот массив элементво и нахожу тот, который мне нужен.
так это ж упражнение ( недотянул до 3000 - будет исправлено! )- если можно сформулируйте на псевдокоде что надо получить и напишем нужный ExpectedCondition
Метод until принимает Function / Predicate на вход. Т.е. технически вы можете подсунуть туда абсолютно любую кастомную ожидалку. Пример можно подсмотреть в самом ExpectedConditions.
Применительно к вашему коду, вот так можно ждать, пока в списке не появится хотя бы 1 элемент.
Мне нужно ожидать, чтобы в списке Больше чем один элемент
Это ожидание должно оборачивать предыдущее ожидание по поиску элементов по состоянию (я делаю ожидание по presenceOfAllElementsLocatedBy ).
То есть мне хочется сделать это таким образом:
у меня есть поиск List<WebElements> по состоянию:
elements = wait.until(condition.getType().apply(locator));
в моем случае это будет presenceOfAllElementsLocatedBy (это я реализовал по вашему примеру с конференции).
А потом я хочу чтобы было ожидание
wait.until(elements == 1)
То есть:
Сначала ищем массив по состоянию, потом проверяем что он больше 1. Если у массива только один элемент, то повторяем процедуру.
Заранее прошу прощение за запутаный ответ
Пробовал и так и этак. Пока не озарила мысль глянуть повнимательней на родной метод ExpectedCondition<List<WebElement>> presenceOfAllElementsLocatedBy. По факту нужно было заменить одну цифру с 0 на 1. Создал отдельный класс и:
public class CustomExpectedCondition {
public static ExpectedCondition<List<WebElement>> moreThanOne(
final By locator) {
return driver -> {
List<WebElement> elements = getDriver().findElements(locator);
return elements.size() > 1 ? elements : null;
};
}
}
Дальше обернул это в функцию и подставил в wait.until(). Все работает. Спасибо всем за помощь.
Реализовать вейтер в вейтере я почти понял как, но мне показалось что в вейтере обертке инициализировать WebDriverWait wait это не очень хорошо, поправьте если я не прав.
Еще раз спасибо всем за обсуждение.
Буду признателен если напишете более развернуто.
Я же правильно понимаю, что мы делаем Предикату, которая принимает locator и возвращает булевое значение?
Спасибо, подставил, работает. Не смог только сделать отдельным методом ваш пример, чтобы так же передвать по :: . Как я понимаю наши способы делают то же самое, но вы это смогли реализовать через stream.