Cypress: те же тесты, которые проходят в браузере, завершаются неудачей в безголовом режиме из-за таймаута

#javascript #cypress #vue-cli

#javascript #cypress #vue-cli

Вопрос:

Когда я запускаю Cypress с vue-cli-service test:e2e --headless , некоторые тесты внутри обратного вызова запроса register завершаются ошибкой:

введите описание изображения здесь

тогда как обычно при запуске в браузере ( vue-cli-service test:e2e ) они проходят:

введите описание изображения здесь

  it('Submit WITHOUT promo code', () => {
        cy.server();
        cy.route({method: 'POST', url: 'api/register'}).as('register');

        cy.get('.thz-items-loading').should('not.be.visible');
        cy.get('#btn-submit').should('not.be.disabled');

        cy.get('iframe[name^="__privateStripeFrame"]').then(($iframe) => {
            const $body = $iframe.contents().find('body');

            cy.wrap($body).find('input:eq(1)').click({force: true}).clear();
            cy.wrap($body).find('input:eq(1)').type('4000000000009979'); // stolen card
            cy.get('#btn-submit').click(); // SUBMIT FORM

            cy.wait('@register').then(xhr => {
                cy.contains('#card-errors', 'Your card was declined.');
                // cy.get('.thz-items-loading').should('not.be.visible'); // FAILS
                // cy.get('.thz-items-loading').to.have.style('display', 'none'); // FAILS
                cy.get('#btn-submit').should('not.be.disabled'); // FAILS
                (...)
            });

            return null;
        });
(...)
  

Трассировка стека:

1) Пробная форма регистрации отправляется БЕЗ промо-кода: CypressError: Время ожидания повторной попытки истекло: ожидается, что <button#btn-submit.thz-button.thz-radius-50.thz-btn-border-2.thz-align-center.thz-ff-g-hind-vadodara-600> не будет «отключено» в Object.cypressErr (https://localhost:8000/__cypress/runner/cypress_runner.js:82944:11 ) в Object.throwErr (https://localhost:8000/__cypress/runner/cypress_runner.js:82909:18 ) в Object.throwErrByPath (https://localhost:8000/__cypress/runner/cypress_runner.js:82936:17 ) при повторной попытке (https://localhost:8000/__cypress/runner/cypress_runner.js:76454:16 ) в https://localhost:8000/__cypress/runner/cypress_runner.js:68529:18 в tryCatcher (https://localhost:8000/__cypress/runner/cypress_runner.js:131381:23 ) в Promise._settlePromiseFromHandler (https://localhost:8000/__cypress/runner/cypress_runner.js:129399:31 ) в Promise._settleprom (https://localhost:8000/__cypress/runner/cypress_runner.js:129456:18 ) в Promise._settlePromise0 (https://localhost:8000/__cypress/runner/cypress_runner.js:129501:10 ) в Promise._SETTLEPROM (https://localhost:8000/__cypress/runner/cypress_runner.js:129576:18 ) в асинхронном режиме._drainQueue (https://localhost:8000/__cypress/runner/cypress_runner.js:126305:16 ) при Async._drainQueues (https://localhost:8000/__cypress/runner/cypress_runner.js:126315:10 ) при Async.drainQueues (https://localhost:8000/__cypress/runner/cypress_runner.js:126189:14 ) в

Следующие строки внутри cy.wait('@register') обратного вызова должны проходить в безголовом режиме:

 cy.get('.thz-items-loading').should('not.be.visible');
cy.get('.thz-items-loading').to.have.style('display', 'none');
cy.get('#btn-submit').should('not.be.disabled');
  

Похоже, что таймаут происходит из-за того, что элементы #btn-submit и .thz-items-loading недоступны при @register обратном вызове, хотя в обоих случаях они существуют в DOM, но почему? Они доступны до запроса просто отлично.

Я запускаю Cypress 3.2.0 из проекта, созданного с помощью vue-cli в Windows 10. Тестируемое приложение не является частью проекта, размещено в другом месте и представляет собой статическую HTML-страницу. Безголовый браузер — Electron 59.

Ответ №1:

Оказывается, что браузер Electron молча не выполняет более новый синтаксис, такой как Promises, вот почему код в разрешенном then() обратном вызове Promise, который должен был изменить свойство отображения .thz-items-loading и #btn-submit , никогда не выполнялся, и тесты, ожидающие этого изменения, никогда не проходили.

Добавление полизаполнений babel перед main.js тестируемым приложением устранило эту проблему:

 <script src="../../node_modules/@babel/polyfill/dist/polyfill.min.js"></script> <!-- or copy to root dir in build process -->
<script src="./main.js"></script>
  

Ответ №2:

Это исправило это для меня:

 "experimentalFetchPolyfill": true