Ожидание в Selenide без ошибки Condition

Проблема заключается в том, что мне нужно подождать порпеделенный элемент на странице с определенным timeout, но при невыполнении условия НЕ кидать ошибку, а вернуть результат boolean (что элемент не появился или появился)

Т е чисто с точки зрения логики должно быть что-то вроде этого, только более лаконично и без ошибки:

    public boolean checkFunc() {
        item.$(LOCATOR).shouldBe(visible); // opps error 

        return item.$(LOCATOR).is(visible);
    }

Подскажите, есть ли средства в Selenide для реализации такой конструкции (waitUntil видел, но он deprecated) ?

В вашем же коде и содержится решение)
Нужно убрать проверку shouldBe(visible) и просто вернуть is(visible)
shouldBe() всегда будет падать, если условие не выполнится и если исключение не перехватить.

    public boolean checkFunc() {
        return item.find(LOCATOR).is(visible);
    }
2 лайка

А что если мне не хватит стандартного ожидания в 4 секунды ?

Тут уже сложнее.
Я сам с похожим вопросом столкнулся, в моем проекте есть метод, проверяющий наличие элемента в DOMе страницы и практически аналогичный вашему:

public boolean checkFunc() {
        return item.find(LOCATOR).exists();
    }

только у меня обратная ситуация - мне не нужно ждать дефолтные 4 секунды, поскольку содержимое виджета появляется достаточно быстро, и дефолтное ожидание только замедляет тест.
Ответа на этот вопрос у меня пока нет. Пробовал в методе менять значение таймаута перед поиском элемента и затем менять его обратно к дефолтному:

    public boolean checkFunc() {
        Configuration.timeout = 1000;
        if (item.find(LOCATOR).exists()) {
            Configuration.timeout = 4000;
            return true;
        }
        Configuration.timeout = 4000;
        return false;
    }

Однако этот способ не сработал – метод как ждал четыре секунды, так и продолжает ждать. Да и сам по себе он не очень хорош – если таймаут поменяется, то он поменяется для всех тестов, бегущих параллельно, там, где это может быть не нужно. Да и выглядит он как костыль, откровенно говоря.

Может быть, кто-то из более опытных коллег подключится и даст ответ на наш с вами вопрос.

1 лайк

Самое простое, но не факт, что самое корректное :slight_smile: , на мой взгляд - написать свой метод, который будет ждать n секунд и проверять размер массива, полученного с помощью findElements.
И добавить проверку на время, по истечении которого будет обязательно падать.

1 лайк

Привет!

  1. waitUntil - по сути то же самое, что и shouldBe. Потому и deprecated, что проще везде использовать shouldBe.
  2. Возвращать boolean и писать в тесте IF - в принципе плохая идея. Уже обсуждалось здесь: Как надругаться над Селенидом

P.S. Там же и самое простое решение.

1 лайк

Это можно написать чуть проще:

public boolean checkFunc() {
   sleep(2000);
   return item.find(LOCATOR).exists();
}

Но на самом деле этот способ плох тем, что он всегда тратит 2 секунды, даже если элемент уже появился. А вот этот вариант быстрее:

public boolean checkFunc() {
  try {
    item.find(LOCATOR).should(exist);
    return true;
  } catch {
    return false;
  }
}
2 лайка