Selenide puzzler

Selenide puzzler

Логическое И или ИЛИ?


Привет!

Вы любите пазлеры? Соскучались по пазлерам? В последний раз мы показывали пазлеры аж в 2017 году, кто не смотрел - смотрим!

И вот наконец мы опубликовали в твиттере новый пазлер:

Одинаково ли работают эти строки? Или есть какая-то разница?

1. $(".btn").shouldBe(visible, enabled);
2. $(".btn").shouldBe(visible).shouldBe(enabled);

Варианты ответов

Люди в твиттере и чатиках накидали разных вариантов:

  • обе строчки работают одинаково (самый популярный ответ)
  • первый случай: логическое or, второй: логический and
  • Второй работает на %ожидание по умолчанию% дольше.
  • Первый должен отработать с одним тайм-аутом, второй должен с двумя тайм-аутами
  • в первом случае упадёт, если отсутствует любое из условий, во втором - если не visible, но enabled.

Правильный ответ

В большинстве случаев оба варианта работают одинаково.

Оба варианта - это логическое AND. В обоих вариантах селенид проверит, что элемент соответствует обоим условиям.

  enabled disabled
видимый ok nok
невидимый nok nok


Но есть нюанс.

Нюанс

Разница проявится в том случае, если элемент соответствует условиям не сразу, а через какое-то время. Причём первому условию меньше, чем за 4 секунды, а второму - больше. (Допустим, visible он становится через 3.5 секунды, а enabled - ещё через 3.5 секунды).

Всё дело в том, что таймаут (по умолчанию 4 секунды) есть у метода shouldHave, а у проверок (visible, enabled, cssClass, text) никакого таймаута нет - они просто умеют проверить, да или нет.

Пример

Откроем для примера Светофор. Светофор становится зелёным через 3.5 секунды, а текст на нём появляется ещё через 3.5 секунды.

Первый вариант проверяет, что светофор удовлетворит обоим условиям в течение 4 секунд:

  $("#light").shouldHave(cssClass("green"), text("GO!")); // таймаут 4 секунды

И эта проверка упадёт, т.к. таймаут на эту проверку - 4 секунды, но элемент не приобретёт и цвет, и текст в течение 4 секунд.

А второй вариант не упадёт:

$("#light")
  .shouldHave(cssClass("green")) // таймаут 4 секунды
  .shouldHave(text("GO!")); // и плюс ещё 4 секунды

Первая проверка дождётся, пока элемент станет зелёным (и он станет в течение 4 секунд). После этого запустится вторая проверка и запустит новый таймаут с целью дождаться, пока у элемента появится текст. И он дождётся.

Видимо, наиболее близкий к правильному был ответ “Первый должен отработать с одним тайм-аутом, второй должен с двумя тайм-аутами”.

Ваши пазлеры

Есть ли у вас свои пазлеры? Присылайте их нам, давайте будем отгадывать вместе!

Андрей Солнцев

ru.selenide.org