Heim > Artikel > Web-Frontend > Umgang mit mehreren Fenstern in Cypress
Der Umgang mit mehreren Fenstern oder Registerkarten ist eines der häufigsten Szenarios bei der Durchführung von End-to-End-Tests für Webanwendungen. Dies kann passieren, wenn durch Klicken auf einen Link ein neuer Tab oder ein Popup-Fenster geöffnet wird. Allerdings führt Cypress Tests standardmäßig in einem einzigen Browser-Tab aus und unterstützt keine direkte Interaktion mit mehreren Browserfenstern oder -tabs.
In diesem Beitrag untersuchen wir, wie Sie mit mehreren Fenstern in Cypress umgehen, indem wir einige Problemumgehungen und Best Practices verwenden, um das Multi-Tab-Verhalten nachzuahmen und einen reibungslosen Ablauf Ihrer Tests zu gewährleisten.
Cypress bietet keine native Unterstützung für Tests in mehreren Fenstern, da es so konzipiert ist, dass es auf einer einzigen Registerkarte ausgeführt werden kann. Der Grund für dieses Design besteht darin, Konsistenz, Zuverlässigkeit und Testisolation aufrechtzuerhalten. Mit einigen cleveren Tricks können Sie jedoch immer noch Interaktionen mit mehreren Fenstern simulieren und das durch neue Tabs oder Fenster ausgelöste Verhalten überprüfen.
Sehen wir uns ein paar gängige Ansätze für den Umgang mit mehreren Fenstern in Cypress an:
1. Abfangen und Bestätigen von Links, ohne neue Tabs zu öffnen
Ein häufiges Szenario ist das Klicken auf einen Link, der einen neuen Tab öffnet. Anstatt den Browser den neuen Tab öffnen zu lassen, können Sie die URL abfangen, die im neuen Tab geöffnet werden soll, den Link bestätigen und die URL im selben Tab besuchen.
Beispiel:
Stellen Sie sich vor, Sie haben eine Webseite mit einem Link wie diesem:
<a href="https://example.com" target="_blank">Visit Example</a>
Wenn Sie auf diesen Link klicken, wird normalerweise ein neuer Tab geöffnet. Um dies in Cypress zu handhaben:
describe('Handle multiple windows by intercepting', () => { it('should intercept the link and open in the same tab', () => { cy.visit('/'); // Find the link and assert that it has the correct href cy.get('a[target="_blank"]').should('have.attr', 'href', 'https://example.com'); // Instead of opening a new tab, you can visit the link in the same window cy.get('a[target="_blank"]').invoke('removeAttr', 'target').click(); // Now verify that you are on the new page cy.url().should('include', 'https://example.com'); }); });
In diesem Beispiel:
Der invoke('removeAttr', 'target') stellt sicher, dass der Link nicht in einem neuen Tab, sondern im aktuellen geöffnet wird.
Cypress kann dann die neue Seite im selben Fenster besuchen, sodass Sie problemlos weiter mit Elementen auf der neuen Seite interagieren können.
2. Stub- oder Mock-window.open-Aufrufe
Einige Anwendungen verwenden JavaScript, um neue Tabs programmgesteuert über window.open() zu öffnen. Sie können diese Aufrufe abfangen und verhindern, dass der Browser ein neues Fenster öffnet, indem Sie die Funktion window.open stoppen.
Beispiel:
describe('Handle window.open', () => { it('should stub the window.open and visit the URL directly', () => { cy.visit('/'); // Stub the window.open function cy.window().then((win) => { cy.stub(win, 'open').as('windowOpen'); }); // Click the button that triggers window.open cy.get('#open-new-tab-button').click(); // Check that the window.open call was made with the expected URL cy.get('@windowOpen').should('be.calledWith', 'https://example.com'); // Instead of opening a new window, we can visit the URL directly in the current tab cy.visit('https://example.com'); // Now verify the URL and page content cy.url().should('include', 'https://example.com'); }); });
In diesem Beispiel:
Wir stoppen die window.open-Methode mit Cypresss cy.stub() und verhindern, dass sie ein neues Fenster öffnet.
Anschließend können Sie bestätigen, dass window.open mit der richtigen URL aufgerufen wurde, und den Test mit cy.visit().
3. Fensterpositionsänderung simulieren
Wenn die Anwendung window.location ändert, um zu einer anderen Seite oder einem anderen Fenster zu navigieren, kann Cypress dies direkt abfangen und verarbeiten. Diese Methode ist besonders nützlich, wenn Fensterumleitungen beteiligt sind.
Beispiel:
describe('Simulate window.location change', () => { it('should simulate window location change', () => { cy.visit('/'); // Trigger an event that changes the window location cy.window().then((win) => { win.location.href = 'https://example.com'; }); // Assert that the URL has changed cy.url().should('include', 'https://example.com'); }); });
Auch wenn Cypress Multi-Window-Tests nicht direkt unterstützt, können Sie dennoch mit mehreren Fenstern und Tabs umgehen, indem Sie die Aufrufe abfangen und blockieren, die normalerweise neue Tabs oder Fenster öffnen würden. Indem Sie das Verhalten so ändern, dass es innerhalb einer einzigen Registerkarte bleibt, können Sie die Grundprinzipien von Cypress in Bezug auf Teststabilität und -zuverlässigkeit beibehalten.
Diese Problemumgehungen, wie das Entfernen des Attributs „target="_blank", das Stubbing von window.open oder das Simulieren von Fensterpositionsänderungen, bieten eine leistungsstarke Möglichkeit, Szenarien mit mehreren Fenstern effektiv zu handhaben. Beginnen Sie noch heute damit, diese Techniken in Ihre Cypress-Tests zu integrieren, um die Multi-Window-Herausforderung mit Leichtigkeit zu meistern!
Das obige ist der detaillierte Inhalt vonUmgang mit mehreren Fenstern in Cypress. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!