Soy nuevo en Cypress, necesito en la misma prueba, visitar dos URL diferentes y almacenar un valor de la primera, para usar en la segunda.
Necesito visitar este sitio web: https://consulta.guru/gerador-cnpj-gratis haga clic en "Gerar" y copie el valor generado para usarlo en el segundo sitio web.
No pude guardar este valor generado en una variable, y cuando intenté usar la función cy.origin para acceder a otra URL, recibí este error: "El uso de cy.intercept() no es compatible con la devolución de llamada de cy.origin() Considere usarlo fuera de la devolución de llamada en su lugar".
Pero el uso de cy.intercept es esencial dentro de esta devolución de llamada. Pondré el código que hice hasta ahora (oculta información confidencial).
describe('test', () => {
beforeEach(() => {
cy.visit('https://consulta.guru/gerador-cnpj-gratis');
cy.contains('button', 'Gerar').click({force: true});
cy.intercept('1').as('cnpj');
cy.wait('@cnpj')
.its('response.body')
.should('have.property', 'taxNumbers')
.then(cnpj => {
})
})
it('login', () => {
cy.origin('secondurl', () => {
cy.visit('/admin');
cy.get('input[name="email"]').type('email');
cy.intercept('login').as('login');
cy.contains('button', 'Avançar').click();
cy.wait('@login')
.its('response.body')
.should('have.property', 'generatedCode')
.then(sixDigitCode => {
cy.get('.css-k008qs > :nth-child(1)').type(sixDigitCode);
})
cy.contains('button', 'Avançar').click();
//teste
cy.contains('p', 'Grupos').click();
cy.get('input[name="search"]').type(cnpj);
})
})
})
Simplemente puede declarar una variable antes de que se ejecuten las pruebas, dentro de la descripción, luego almacenarla en la variable y usarla en la segunda prueba.
describe('test', () => {
let myvar = "";
beforeEach(() => {
cy.visit('https://consulta.guru/gerador-cnpj-gratis');
cy.contains('button', 'Gerar').click({force: true});
cy.intercept('1').as('cnpj');
cy.wait('@cnpj')
.its('response.body')
.should('have.property', 'taxNumbers')
.then(cnpj => {
myvar = cnpj;
})
})
it('login', () => {
cy.origin('secondurl', () => {
cy.visit('/admin');
cy.get('input[name="email"]').type('email');
cy.intercept('login').as('login');
cy.contains('button', 'Avançar').click();
cy.wait('@login')
.its('response.body')
.should('have.property', 'generatedCode')
.then(sixDigitCode => {
cy.get('.css-k008qs > :nth-child(1)').type(sixDigitCode);
})
cy.contains('button', 'Avançar').click();
//teste
cy.contains('p', 'Grupos').click();
cy.get('input[name="search"]').type(cnpj);
})
})
})
El cy.origin() tiene algunas limitaciones.
Tienes dos opciones que puedo ver
Cypress se complace en visitar dos dominios en pruebas separadas, por lo que puede cambiar beforeEach() a it() .
Sin embargo, el navegador/ejecutor se reinicia por completo entre dominios , por lo que no puede usar un alias, una variable o una propiedad en el objeto Cypress para pasar el valor de taxNumbers a la siguiente prueba.
Tendría que guardar los números de impuestos en un accesorio (o puede guardarlos en una tarea)
it('gets taxNumber', () => {
cy.visit("https://consulta.guru/gerador-cnpj-gratis");
cy.contains("button", "Gerar").click({ force: true });
cy.intercept("1").as("cnpj");
cy.wait("@cnpj")
.its("response.body")
.should("have.property", "taxNumbers")
.then((cnpj) => {
// save to fixture
cy.writeFile('./cypress/fixtures/tax-numbers.json', cnpj)
});
});
it("login", () => {
cy.visit('http://example.com') // 2nd domain (for example)
cy.fixture('tax-numbers.json').then(taxNumbers => {
expect(taxNumbers).to.not.eq(undefined) // ✅ passes
})
});
Esto es mucho más eficiente: no implica cargar la página.
Eche un vuezo a la pestaña de red de devtools, tome la URL completa del archivo con valores y consúltelo usando cy.request() .
let taxNumbers;
beforeEach(() => {
cy.request('https://api.nfse.io/Generate/LegalEntities/taxNumber/1')
.then(response => {
taxNumbers = response.body.taxNumbers
})
})
it("login", () => {
cy.visit('http://example.com') // 2nd domain (for example)
expect(taxNumbers).to.not.eq(undefined) // ✅ passes
});
Probé con la segunda opción, pero no sé dónde poner esta parte: "expect (taxnumbers) .to.not.eq (undefined)"
Intentar usar los "números de impuestos" para llenar un campo tampoco funcionó de esta manera: cy.get('input[name="searchGroup"]').type(taxNumbers);
El error fue: "cy.type() solo puede aceptar una cadena o un número. Pasaste: [objeto Objeto]Más información "
let taxNumbers;
beforeEach(() => {
cy.request('https://api.nfse.io/Generate/LegalEntities/taxNumber/1')
.then(response => {
taxNumbers = response.body.taxNumbers
})
})
it('login', () => {
cy.visit('second domain');
cy.get('input[name="email"]').type('myemail');
cy.intercept('login').as('login');
cy.contains('button', 'Avançar').click();
cy.wait('@login')
.its('response.body')
.should('have.property', 'generatedCode')
.then(sixDigitCode => {
cy.get('.css-k008qs > :nth-child(1)').type(sixDigitCode);
})
cy.contains('button', 'Avançar').click();
//teste
cy.contains('p', 'Grupos').click();
cy.get('input[name="searchGroup"]').type(taxNumbers);
})