Greifen Sie auf ein neues Fenster zu – cypress.io

Lesezeit: 5 Minuten

Benutzer-Avatar
Kaushik NP

So einfach ist die Frage. Wie kann ich in Cypress auf ein neues Fenster zugreifen, das beim Ausführen des Tests geöffnet wird?

Schritte zum Nachbauen:

  1. Führen Sie den Test aus. Nach einer Aktion öffnet sich ein neues Fenster (die URL ist dynamischer Natur).
  2. Füllen Sie die Felder im neuen Fenster aus und klicken Sie auf einige Schaltflächen.
  3. Nachdem die erforderlichen Aktionen im neuen Fenster abgeschlossen sind, schließen Sie das neue Fenster und wechseln Sie zurück zum Hauptfenster.
  4. Ausführung mit dem Hauptfenster fortsetzen.

Point of Interest: Der Fokus sollte sein

main window -> new window -> main window

Ich habe einige Dinge gelesen, die sich auf die Verwendung von beziehen iframe und confirmation box, aber hier ist es keiner von denen. Bezieht sich auf den Zugriff auf ein ganz neues Fenster. Etwas wie Window Handlers im Selen. Konnte leider nichts passendes dazu finden.

Benutzer-Avatar
Siddiqui

So können Sie Registerkarten im selben Fenster behandeln.

Verwenden Sie dieses Code-Snippet

cy.xpath("//a[@href="http://www.selenium.dev"]").invoke('removeAttr','target').click();

  • cy.window().its(‘open’).should(‘be.not.be. called’) kann ich das tun

    – Ankita

    22. Februar um 13:18 Uhr

Ich bin kein Cypress-Experte, habe erst vor ein paar Tagen damit begonnen, aber ich habe diese nette Lösung für eine zustandsbehaftete Anwendung mit dynamischem Link herausgefunden:

// Get window object
cy.window().then((win) => {
  // Replace window.open(url, target)-function with our own arrow function
  cy.stub(win, 'open', url => 
  {
    // change window location to be same as the popup url
    win.location.href = Cypress.config().baseUrl + url;
  }).as("popup") // alias it with popup, so we can wait refer it with @popup
})

// Click button which triggers javascript's window.open() call
cy.get("#buttonWhichOpensPopupWithDynamicUrl").click()

// Make sure that it triggered window.open function call
cy.get("@popup").should("be.called")

// Now we can continue integration testing for the new "popup tab" inside the same tab

Gibt es einen besseren Weg, dies zu tun?

  • Wow, Arbeit wie Charme! Dies sollte in der amtlichen Dokumentation dokumentiert werden.

    – xwlee

    29. Juli 2020 um 9:53 Uhr

  • Sobald wir Zugriff auf das geöffnete Fenster haben, wie führen wir Operationen daran durch und wechseln dann zurück zum alten Fenster? Ich konnte überprüfen, bis sich das Fenster öffnete. Aber ich kann keine Schaltflächen in diesem geöffneten Fenster finden. funktioniert- cy.window().then((win) => { cy.spy(win, ‘open’).as(‘windowOpen’); }); cy.get(‘button’).contains(‘Melden Sie sich bei Ihrem Konto an’).click() cy.get(‘@windowOpen’).should(‘have.been.calledWith’, Cypress.sinon.match(‘ about:blank’)) Dies funktioniert nicht – cy.get(‘@windowOpen’).get(‘#buttonid1’).click() Auch nicht sicher, wie Sie zum alten Fenster zurückkehren?

    – Namrata

    22. April 2021 um 23:28 Uhr

  • Das ist toll. Es funktioniert wie vorgesehen.

    – Alighathor

    13. Oktober 2021 um 18:13 Uhr

Benutzer-Avatar
Gal Margalit

// 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 – Registerkarte zur Handhabung von Ankerlinks

  • Wow, Arbeit wie Charme! Dies sollte in der amtlichen Dokumentation dokumentiert werden.

    – xwlee

    29. Juli 2020 um 9:53 Uhr

  • Sobald wir Zugriff auf das geöffnete Fenster haben, wie führen wir Operationen daran durch und wechseln dann zurück zum alten Fenster? Ich konnte überprüfen, bis sich das Fenster öffnete. Aber ich kann keine Schaltflächen in diesem geöffneten Fenster finden. funktioniert- cy.window().then((win) => { cy.spy(win, ‘open’).as(‘windowOpen’); }); cy.get(‘button’).contains(‘Melden Sie sich bei Ihrem Konto an’).click() cy.get(‘@windowOpen’).should(‘have.been.calledWith’, Cypress.sinon.match(‘ about:blank’)) Dies funktioniert nicht – cy.get(‘@windowOpen’).get(‘#buttonid1’).click() Auch nicht sicher, wie Sie zum alten Fenster zurückkehren?

    – Namrata

    22. April 2021 um 23:28 Uhr

  • Das ist toll. Es funktioniert wie vorgesehen.

    – Alighathor

    13. Oktober 2021 um 18:13 Uhr

Benutzer-Avatar
lilabnersgal

Ich war kürzlich auch mit diesem Problem konfrontiert – die URL für den neuen Tab ist dynamisch, daher weiß ich nicht, was es ist. Nach langem Suchen, einigem Ausprobieren und Input von Kollegen wurde folgende Lösung gefunden:

// 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');

  • Sobald wir Zugriff auf das geöffnete Fenster haben, wie führen wir Operationen daran durch und wechseln dann zurück zum alten Fenster? Ich konnte überprüfen, bis sich das Fenster öffnete. Aber ich kann keine Schaltflächen in diesem geöffneten Fenster finden. funktioniert- cy.window().then((win) => { cy.spy(win, ‘open’).as(‘windowOpen’); }); cy.get(‘button’).contains(‘Melden Sie sich bei Ihrem Konto an’).click() cy.get(‘@windowOpen’).should(‘have.been.calledWith’, Cypress.sinon.match(‘ about:blank’)) Dies funktioniert nicht – cy.get(‘@windowOpen’).get(‘#buttonid1’).click() Auch nicht sicher, wie Sie zum alten Fenster zurückkehren?

    – Namrata

    22. April 2021 um 23:13 Uhr

  • @namrata Cypress unterstützt nicht mehrere Registerkarten. Aus diesem Grund überprüft mein Code nur, dass window.open aufgerufen wurde. In ihrem Beispiele Sie bieten mehrere Möglichkeiten, um mit der neuen Registerkartensituation umzugehen.

    – lilabnersgal

    24. April 2021 um 2:07 Uhr

  • @namrata du musst die chromewebsecurity in cypress.json ausschalten. Standardmäßig ist der Wert wahr, Sie können die Einstellungen im Cypress-Dashboard überprüfen. Sehen Sie sich zum Beispiel dieses Video an youtu.be/C2DjGl5a_-Y Ab der 27. Minute

    – pk786

    2. Mai 2021 um 0:14 Uhr


  • cy.window().its(‘open’).should(‘be.not.be. called’) kann ich das machen – Ankita

    – Ankita

    22. Februar um 13:18 Uhr

  • @Ankita Wenn Sie überprüfen möchten, ob es nicht geöffnet wurde, möchten Sie should(‘not.be.called’) – entfernen Sie das zusätzliche ‘be’ am Anfang.

    – lilabnersgal

    23. Februar um 19:29 Uhr

1009300cookie-checkGreifen Sie auf ein neues Fenster zu – cypress.io

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy