Mi prueba de funcionalidad de inicio de sesión hace esto:
Mi POM para la página de inicio de sesión:
class loginPage { fillUsername(value) { cy.get('[id=username]').clear().invoke('val', value); return this; } fillPassword(value) { cy.get('[id=password]').clear().invoke('val', value); return this; } clickLogin() { //cy.intercept('/portal/api/login').as('login') cy.contains("Login / S'identifier").click(); } checkForAgreementPage(){ const path ='/license-agreement' cy.wait(500) // <- All the problem is here in this line // If I comment this line cy.url() yields current page's url cy.url().then(($url) => { cy.log($url) if ($url.includes(path)) { //cy.log('Clicked') cy.get('[type=button]').contains('Accept').click(); } }); } } export default loginPage;Mi función personalizada command.js:
Cypress.Commands.add('login', (username, password) => { lp.fillUsername(username); lp.fillPassword(password); lp.clickLogin(); lp.checkForAgreementPage(); });Mi archivo de especificaciones:
it('TC01 - Login with valid data as wholesaler', () => { cy.login(id.username, id.password); // for valid data cy.visit('/users'); cy.logout(); }); it('TC05 - Login with username but no password ', () => { cy.login(id.username, id.password); // For invalid data cy.expected('span', 'Invalid username or password'); });¿Cómo puedo eliminar la función de espera de la página de inicio de sesión de POM? y esperar hasta que se cambie la URL?
Además, intenté interceptar 'api/login' y esperé a que se cargara, pero esto fallará en las otras pruebas en las que estoy probando escenarios de inicio de sesión fallidos.
Es posible que desee tener dos métodos separados para manejar usuarios nuevos y usuarios existentes para manejar su escenario.
Por lo que parece, parece que solo está validando el nombre de pathname de la URL en su función checkForAgreementPage() . Aunque lo siguiente no tiene en cuenta otros escenarios que pueda tener en su suite, ya que hay una declaración if que puede implicar diferentes escenarios, puede eliminar la parte cy.url() y hacer lo siguiente en su lugar:
checkForAgreementPage(){ const path ='/license-agreement' // The should will trigger retrying the previous command so cypress will // continuously check for the pathname to include the path until the // command timeout, so you don't have to have an explicit wait cy.location('pathname') .should('include', path) .then(cy.log) // can comment out if you don't want to log the pathname // now you can click on the accept button cy.get('[type=button]').contains('Accept').click(); });Intenté interceptar 'api/login' y esperé a que se cargara, pero esto fallará en las otras pruebas en las que estoy probando escenarios de inicio de sesión fallidos.
Interceptar es la mejor opción en mi opinión, pero puedo ver que con su estructura POM a veces necesita esperar el alias y otras veces no.
La forma más fácil de avanzar es hacer que la espera en la intercepción sea opcional,
Cypress.Commands.add('login', (username, password, waitForUrl = false) => { lp.fillUsername(username); lp.fillPassword(password); cy.intercept('/portal/api/login').as('login') // ignored if not waited on lp.clickLogin(); if (waitForUrl) { cy.wait('@login') } lp.checkForAgreementPage(); }); it('TC01 - Login with valid data as wholesaler', () => { cy.login(id.username, id.password, true); // for valid data cy.visit('/users'); cy.logout(); }); it('TC05 - Login with username but no password ', () => { cy.login(id.username, id.password); // For invalid data cy.expected('span', 'Invalid username or password'); });Muestra uno de los problemas cuando intentas encapsular demasiado las cosas, la lógica se arregla un poco en el "camino feliz".