#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