×

Cypress и условный оператор

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Привет. Столкнулся с такой проблемой:
Есть веб приложение, в нём пользователи могут редактировать записи. Когда пользователь редактирует запись, она «блокируется» — и если другой пользователь пытается эту же запись отредактировать, появляется диалоговое окно с подтверждением того, что пользователь собирается «поломать» чужое редактирование.
То есть, при редактировании это диалоговое окно может появится, а может и нет. Поэтому, в скрипте нужно как то это отловить.

Пробовал такой костыль:

     //if breaking lock dialog is shown
     const $BreakLock = Cypress.$('.mat-dialog-actions');
     if ($BreakLock) {
       //confirm button click
       cy.get('.mat-dialog-actions button').eq(1).click(); 
     }

Но он почему-то не работает, если окошко не показывается — тест валится.
Из документации по Cypress не понятно толком, как быть в этой ситуации.

UPD. Решение было найдено. Гугл мне выдал эту страничку при поиске решения другой проблемы, поэтому напишу его сюда — возможно, кому-то пригодится.

 
cy.get('body').then((body) => {
     if (body.find('mat-dialog-container').length > 0){
        cy.xpath("//mat-dialog-container//*[text()='Yes']").click(); //нажимает Yes в появившемся окошке.
     }
});
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Решение нашлось, обновил описание.

Это должно быть 2 отдельных теста, что появится попап и что юзер может редактировать запись. Наличие If в тестах — плохая практика.
А по делу, сайпрес пытается обратиться к обьекту которого вероятнее всего нет вот и падает.
В селениуме это обыгрывается обычным findElements(locator).size() > 0; Скорей всего в сайперсе тоже есть какой-то аналог проверки на наличие элемента.

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

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

корей всего в сайперсе тоже есть какой-то аналог проверки на наличие элемента.

Да, вот поэтому и спрашиваю, что есть подобного в кипарисе.

Скорее всего, дело в том, что условие срабатывает все время, так как вне зависимости от того, найден ли элемент на странице Cypress.$ создает объект.

А что именно пишет в логах?

Пишет — объект «.mat-dialog-actions» не найден. Так что да, вы правы насчет того, что условие срабатывает при любом варианте.

То есть, при редактировании это диалоговое окно может появится, а может и нет. Поэтому, в скрипте нужно как то это отловить.

ваш тест стає недермінованим. Напишіть тест, де це вікно ТОЧНО з’являється або не з’являється

Да, так и рекомендует документация. Проблема в том, что кто-то может заблокировать запись, которая создана для теста.
Еще вариант — тест упал, и запись не сохранилась. Т.е. она остаётся заблокированной. И при следующем запуске теста, возникнет диалог подтверждения, хотя изначально, он не ожидается.

от. дані потрібно готувати динамічно для тесту. і видаляти після

Да, видимо придётся...
Спасибо за совет!

Cypress это диагноз само по себе.

Используй нормальные инструменты, основанные на селениуме.

ССЗБ.

Там не совсем от меня зависит... :(
А чем Cypress плох? Очень хорошо под CI заточен вроде. Код ± такой же, иногда короче. Установка — проще.

А чем Cypress плох?

Ну я даже не знаю... например Всем.
Вместо того, чтобы писать что он не может, проще просто написать, что он может.
Мертворожденный продукт.

А чем Cypress плох?

та нармальная тулза в своей нише вроде. Не без своих ограничений, но в целом ОК для функционального тестирования UI, особенно если есть возможность подправлять систему для тестабилити.
Из основных ограничений наверное поддержка браузеров, но это далеко не всегда критично и в крайнем случае можно допокрыть более универсальными тулзами.

Підписатись на коментарі