Cypress: установка переменной из результата задачи - PullRequest
1 голос
/ 07 января 2020

Мне нужно получить URL-адрес из электронного письма, отправленного в начале сценария кипариса.

Ожидание электронной почты и получение URL-адреса внутри нее - асинхронная задача, поэтому я создал плагин cypress под названием «readMail»: он будет принимать адрес электронной почты в качестве входных данных, ждать, пока API gmail действительно получит адрес электронной почты, получателем которого является этот адрес, затем прочитайте письмо и верните обещание, разрешающее URL-адрес, содержащийся в теле письма. Этот процесс работает нормально, потому что в журналах плагина правильно отображается извлеченный URL.

Моя проблема состоит в том, чтобы сделать этот extractedUrl доступным для последующего использования в качестве параметра, например cy.visit(extractedUrl): вне тела task(...).then(...), переменная все еще не установлена.

Вот код:

it('should generate correct email', () => {
    const recipientEmail: string = 'some@email.com';
    const extractedUrl:string = '';

    // ....scenario generating a email to 'some@email.com'.....

    cy.task('readMail', recipientEmail) // plugin logs "https://some.url.com" after a few seconds
    .then((result:any) => {
        extractedUrl= result;
        console.log(result); // logs "https://some.url.com" in the terminal
        cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
    });
    cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
    console.log(extractedUrl); // logs nothing
    cy.visit(extractedUrl);
});

Я, вероятно, что-то упускаю из-за того, как кипарис обрабатывает asyn c ... Я пробовал несколько разных вещей: cy.wrap и cypress-wait-until плагин, но не мог найти способ заставить эти работы.

На самом деле я нашел один способ объявить extractedUrl вне теста и начать новый тест it('...', () => {...}): тогда extractedUrl на самом деле имеет правильное значение в начале следующего теста, но это не идеален и я хочу понять почему. Спасибо за вашу помощь!

1 Ответ

1 голос
/ 09 января 2020

TL; DR; поместите весь ваш код в then callback

it('should generate correct email', () => {
    const recipientEmail: string = 'some@email.com';
    const extractedUrl:string = '';

    // ....scenario generating a email to 'some@email.com'.....
    // plugin logs "https://some.url.com" after a few seconds
    cy.task('readMail', recipientEmail).then((result:any) => {
        extractedUrl= result;
        console.log(result); // logs "https://some.url.com" in the terminal
        cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
        cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
        console.log(extractedUrl); // logs nothing
        cy.visit(extractedUrl);
    });

});

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

Больше информации здесь: Ожидание Cypress Chains # 1417

Вы также можете попробовать cypress-обещание , то есть плагин для изменения кипариса обещающие объекты превращаются в реальные обещания. Больше информации здесь: Cypress.io - Использование asyn c и ожидание Николаса Болла

ОБНОВЛЕНИЕ № 1:

Вы также можете использовать псевдоним для доступа к значение:

it('should generate correct email', () => {
    const recipientEmail: string = 'some@email.com';
    const extractedUrl:string = '';

    // ....scenario generating a email to 'some@email.com'.....
    // plugin logs "https://some.url.com" after a few seconds
    cy.task('readMail', recipientEmail).then((result:any) => {
        extractedUrl= result;
        cy.wrap(result).as('extractedUrl');
        console.log(result); // logs "https://some.url.com" in the terminal
        cy.log("1:" + extractedUrl); // logs "1:https://some.url.com" in cypress UI
    });

    cy.get('@extractedUrl').then((extractedUrl) => {
        cy.log("2:"+ extractedUrl); // logs "2:" in cypress UI
        console.log(extractedUrl); // logs nothing
        cy.visit(extractedUrl);
    })

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...