Acceder a una nueva ventana – cypress.io

3 minutos de lectura

avatar de usuario
Parque Nacional Kaushik

La pregunta es tan simple como eso. En Cypress, ¿cómo puedo acceder a una nueva ventana que se abre al ejecutar la prueba?

Pasos para recrear:

  1. Ejecute la prueba. Después de alguna acción, aparece una nueva ventana (la URL es de naturaleza dinámica).
  2. Complete los campos en la nueva ventana y haga clic en algunos botones.
  3. Después de completar las acciones requeridas en la nueva ventana, cierre la nueva ventana y regrese a la ventana principal.
  4. Continuar la ejecución con la ventana principal.

Punto de interés: el foco debe ser

main window -> new window -> main window

He leído algunas cosas que se relacionan con el uso de iframe y confirmation box, pero aquí no es nada de eso. Se relaciona con el acceso a una ventana completamente nueva. Algo como Window Handlers en Selenio. Desafortunadamente no pude encontrar nada relacionado con eso.

avatar de usuario
Madusha

Pude lograr el mismo requisito a través de lo siguiente:

let newUrl="";
cy.window().then((win) => {
  cy.stub(win, 'open').as('windowOpen').callsFake(url => {
    newUrl = url;
  });
})

cy.get('.open-window-btn').click()
cy.get('@windowOpen').should('be.called');
cy.visit(newUrl)

  • cy.window().its(‘open’).should(‘be.not.be. called’) puedo hacer esto

    – Ankita

    22 de febrero a las 13:18

  • Wow, trabajo como el encanto! Esto debe ser documentado en la documentación oficial.

    – xwlee

    29 de julio de 2020 a las 9:53

  • Una vez que tenemos acceso a la ventana abierta, ¿cómo realizamos operaciones en ella y luego volvemos a la ventana anterior? Pude verificar hasta el hecho de que se abrió la ventana. Pero no puedo encontrar botones en esta ventana abierta. funciona- cy.window().then((win) => { cy.spy(win, ‘open’).as(‘windowOpen’); }); cy.get(‘button’).contains(‘Iniciar sesión en su cuenta’).click() cy.get(‘@windowOpen’).should(‘han.sido.llamadosCon’, Cypress.sinon.match(‘ about:blank’)) Esto no funciona: cy.get(‘@windowOpen’).get(‘#buttonid1’).click() ¿Además, no está seguro de cómo regresar a la ventana anterior?

    – namrata

    22 de abril de 2021 a las 23:28

  • Esto es genial. Funciona según lo previsto.

    – AlighaThor

    13 oct 2021 a las 18:13

// We can remove the offending attribute - target="_blank"
      // that would normally open content in a new tab.
      cy.get('#users').invoke('removeAttr', 'target').click()

      // after clicking the <a> we are now navigated to the
      // new page and we can assert that the url is correct
      cy.url().should('include', 'users.html')

Cypress – pestaña de manejo de enlaces ancla

  • Un truco agradable y simple. Muchas gracias.

    – Faheem Hameed

    18 de noviembre de 2021 a las 2:08

avatar de usuario
lilabnersgal

Recientemente también me enfrenté a este problema: la URL para la nueva pestaña es dinámica, por lo que no sé qué es. Después de mucha búsqueda, algunas pruebas y errores, y aportes de compañeros de trabajo, se resolvió haciendo lo siguiente:

// AFTER cy.visit()
cy.window().then((win) => {
  cy.spy(win, 'open').as('windowOpen'); // 'spy' vs 'stub' lets the new tab still open if you are visually watching it
});
// perform action here [for me it was a button being clicked that eventually ended in a window.open]
// verify the window opened
// verify the first parameter is a string (this is the dynamic url) and the second is _blank (opens a new window)
cy.get('@windowOpen').should('be.calledWith', Cypress.sinon.match.string, '_blank');

  • Un truco agradable y simple. Muchas gracias.

    – Faheem Hameed

    18 de noviembre de 2021 a las 2:08

avatar de usuario
jake bajas

Aquí hay una solución que estoy usando en mi proyecto basado en “Cypress usando ventana infantil”

Cypress Window Helpers (también conocido como Cypress Tab Helpers)
En realidad son ventanas emergentes o ventanas secundarias, pero las llamo pestañas por brevedad de API

cy.openTab(url, opts)
cy.tabVisit(url, window_name)
cy.switchToTab(tab_name)
cy.closeTab(index_or_name) - pass nothing to close active tab
cy.closeAllTabs() - except main root window

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad