Say I want to retrieve the values of two Cypress aliases and use it in my test case. How do I do so without nesting them in the following manner?
cy.get('@alias1')
.then((alias1) => {
cy.get('@alias2').then((alias2) => {
someFunctionThatUsesBothAliases(alias1, alias2);
})
})
Note: all aliases are reset before each test. See the aliases guide for details. Alias names cannot match some reserved words. Some strings are not allowed as alias names since they are reserved words in Cypress. These words include: test, runnable, timeout, slow, skip, and inspect.
Aliased variables are accessed via cy.get ('@user') syntax. Some commands are inherently asynchronous, so using a wrapper to access the variable ensures it is resolved before being used. See documentation Variables and Aliases and get.
as is asynchronous Remember that Cypress commands are async, including.as (). Because of this you cannot synchronously access anything you have aliased. You must use other asynchronous commands such as.then () to access what you've aliased.
The patterns that are going to be discussed in this tutorial is going to be useful for you, even when you are not working with Cypress. It should be noted that you can’t assign or work with the return values of any Cypress command, rather when you are working with Cypress commands, the commands will be enequeued and they run asynchronously.
You can do this:
it('test', () => {
cy.wrap('foo').as('foo');
cy.wrap('bar').as('bar');
cy.wrap('baz').as('baz');
const values = [];
cy.get('@foo').then( val => {
values.push(val);
return cy.get('@bar');
}).then( val => {
values.push(val);
return cy.get('@baz');
}).then( val => {
values.push(val);
someFunc(...values);
});
});
Or you can use this helper I cobbled together (put it in your support/index.js
):
const chainStart = Symbol();
cy.all = function ( ...commands ) {
const _ = Cypress._;
const chain = cy.wrap(null, { log: false });
const stopCommand = _.find( cy.queue.commands, {
attributes: { chainerId: chain.chainerId }
});
const startCommand = _.find( cy.queue.commands, {
attributes: { chainerId: commands[0].chainerId }
});
const p = chain.then(() => {
return _( commands )
.map( cmd => {
return cmd[chainStart]
? cmd[chainStart].attributes
: _.find( cy.queue.commands, {
attributes: { chainerId: cmd.chainerId }
}).attributes;
})
.concat(stopCommand.attributes)
.slice(1)
.flatMap( cmd => {
return cmd.prev.get('subject');
})
.value();
});
p[chainStart] = startCommand;
return p;
}
and use it like so:
it('test', () => {
cy.wrap('one').as('one');
cy.wrap('two').as('two');
cy.wrap('three').as('three');
cy.all(
cy.get(`@one`),
cy.get(`@two`),
cy.get(`@three`)
).then( values => {
someFunc(...values);
});
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With