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

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

enter image description here

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

enter image description here

 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) at 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._settlePromise (https://localhost:8000/__cypress/runner/cypress_runner.js:129456:18) на Promise._settlePromise0 (https://localhost:8000/__cypress/runner/cypress_runner.js:129501:10) на Promise._settlePromises (https://localhost:8000/__cypress/runner/cypress_runner.js:129576:18) в Async._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 Ответ

0 голосов
/ 21 марта 2019

Оказывается, что браузер Electron молча не может выполнить новый синтаксис, такой как Promises, поэтому код в обработанном обратном вызове then() Promise, который должен был изменить свойство display .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>
...