РЕДАКТИРОВАТЬ: часто кто-то предлагает использовать Promise.all
, что не является правильным решением. Цепные объекты Cypress не являются Promises / A + -совместимыми, они просто кажутся обещаниями, потому что они реализуют интерфейс .then
. Вот почему Promise.all
может использовать массив объектов-цепочек, но это все. Значения разрешения, переданные в Promise.all().then
обратного вызова, не будут такими, как вы ожидаете (см. https://github.com/cypress-io/cypress/issues/915).
. Вы можете использовать предложенный мной помощник в аналогичном ответе :
// put this in cypress/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;
}
использование:
it('test', () => {
const urls = [
'https://en.wikipediaaa.org',
'https://en.wikipedia.org'
];
cy.all(
...urls.map(url => cy.request(url))
).then(responses => {
responses.forEach( resp => {
expect(resp.status).to.eq(200);
});
});
});
При этом вы также можете сделать следующее:
const urls = [
'https://en.wikipediaaa.org',
'https://en.wikipedia.org'
];
let passes = 0;
urls.forEach( url => {
cy.request(url).then( resp => {
if ( resp.status === 200 ) passes++;
});
});
cy.then(() => {
expect(passes).to.eq(urls.length);
});
Помощник cy.all
поверх действительно полезен, если вы хотитеполучить доступ к результатам без необходимости хранить глобальные перемены и обращаться к ним с помощью обратного вызова cy.then()
, но, как я уже показал в последнем примере, все можно обойти, используя только ванильный кипарис.
Илиесли вам вообще не нужны ответы, вы можете просто сделать:
const urls = [
'https://en.wikipediaaa.org',
'https://en.wikipedia.org'
];
urls.forEach( url => {
cy.request(url).its('status').should('eq', 200);
});