tl;dr — если ваши тесты не работают из-за ошибок на странице, не находящейся под вашим контролем, вы можете использовать функцию clientScripts TestCafe, чтобы заглушить ошибки и позволить вашим тестам вернуться к тому, для чего они предназначены.

В одном из недавних проектов было указано, что когда пользователь посещает наш сайт с неверным URL-адресом, он будет перенаправлен на общую целевую страницу компании. Как добросовестные разработчики, мы написали это как простой тест, используя отличный инструмент сквозного тестирования TestCafe. Тесты все зеленые, развертывание в продакшене, все хорошо.

Два дня спустя тест проваливается, несмотря на отсутствие изменений в коде — худший тип провала теста! После некоторой забавной отладки теста локально в браузере я обнаружил, что обновление библиотеки аналитики, используемой на универсальной целевой странице, вызывало несколько ошибок JS. Сайт по-прежнему работал, пользовательский опыт ничем не отличался, но кто-то где-то не получал свою аналитику, и (что более важно) из-за этого мы были заблокированы от развертывания наших изменений.

Тесты TestCafe терпят неудачу, если возникают ошибки JS, что в любое другое время является разумной функцией. Мы могли бы запускать тесты с флагом --skip-js-errors, но тогда мы бы упустили возможность запуска этих проверок в коде, который мы контролируем. Мы не хотим, чтобы наши тесты терпели неудачу из-за того, что код не находится под нашим контролем, но мы, безусловно, хотим, если мы его написали, поэтому запускать тесты с флагом --skip-js-errors было невозможно. Я мог бы помещать тесты в карантин, чтобы переходить на страницы, находящиеся вне моего контроля, и запускать их отдельно, но это было похоже на взлом.

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

Клиентские скрипты в помощь

test.clientScripts({
  page: externalUrl,
  content: `
        window.addEventListener('error', function (e) {
            e.preventDefault();
            console.warn(e.message); 
        });`
})

ClientScripts инструктируют TestCafe вводить произвольный контент на страницу. В этом случае мы добавляем прослушиватель событий к объекту окна, прослушивая ошибки и регистрируя их как предупреждения в консоли вместо их действия по умолчанию. Чтобы замалчивать ошибки только на внешнем ресурсе, URL-адрес страницы включается в параметр page.

Есть одна проблема с этим решением, о которой стоит упомянуть. Тесты все равно не пройдут, если внешний URL недоступен, т. е. общая целевая страница не работает. Таким образом, наши тесты все еще в некоторой степени зависят от факторов, находящихся вне нашего контроля. Альтернативой было бы имитировать ресурс, но мы посчитали, что это лучшее решение.