2016-10-03 5 views
0

Ich habe Probleme, wenn ich zwischen zwei Fenstern umschalte. Das Szenario sieht so aus: Ich öffne die Zielseite der Anwendung, dann klicke ich auf Login-Link, ein Popup-Fenster öffnet sich, ich gebe die Zugangsdaten ein und klicke auf Login-Button (hier wird das Pop-Up automatisch geschlossen). Danach muss ich zum ursprünglichen Fenster zurückkehren und mit anderen Aktionen fortfahren, da ich mich in der Anwendung eingeloggt habe. Das Problem ist, dass es sehr oft passiert, dass ich nicht zurück zum Elternfenster wechseln kann, nachdem Pop-up automatisch geschlossen wird, und der Webdriver es gerade hängt, ohne etwas zu tun, wird kein Fehler geworfen.Es ist nicht möglich, vom untergeordneten Fenster, das automatisch geschlossen wird, zurück zum Elternfenster zu wechseln.

Ich habe versucht alle Arten von Lösungen auf Google gefunden, aber nichts hat wirklich die ganze Zeit funktioniert. Letztes Stück Code, das ich versuchte, ist derjenige unter:

getLandingPageObject().performClickOnEmailLink(); 
getDriver().manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); 
Iterator<String> it = handles.iterator(); 
      // iterate through your windows 
      while (it.hasNext()) { 
       String parent = it.next(); 
       String newwin = it.next(); 
       getDriver().switchTo().window(newwin); 
       typeLoginCredentials(username, password); 
       performClickOnLoginButton(); 
       Thread.sleep(5000); 
       getDriver().switchTo().window(parent); 
      } 
     } 
loginShouldBeSuccessful(); 

benutze ich Firefox 47.0.1 und Selen 2.53.1

Jede Idee, wie könnte ich dieses Problem beheben? Vielen Dank!

+0

Überprüfen Sie, ob Sie nicht automatisch umgeschaltet werden oder ob die Fenstermethode ohne Parameter aufgerufen werden kann. – lauda

+0

Ich wechsle nicht automatisch, und ich brauche Parameter für die Fenstermethode, um verschiedene Anmeldeinformationen einzugeben, um mich in die Anwendung einzuloggen. Das Stück Code, das ich oben gepostet habe, funktioniert nicht immer (manchmal hängt das Hauptfenster ohne zu tun) alles, nachdem Pop-up geschlossen ist), kann ich nicht verstehen, warum. – Larisa

+0

@Larisa, versuche driver.SwitchTo(). DefaultContent() nachdem die Aktion, die Popup verursacht, automatisch geschlossen wird. –

Antwort

0
  1. auf Login-Link Vor dem Klicken das übergeordnete Fenster

    String parentWindowHandle = driver.getWindowHandle(); 
    
  2. Wechseln Sie zu Ihrem neuen Fenster erhalten, nachdem die Login-Link klicken

    for (String handle : driver.getWindowHandles()) { 
        driver.switchTo().window(handle); 
    } 
    
  3. (dies ist nur einer der Ansätze ist)

    Nach Abschluss der Anmeldung gehen Sie zurück zu Ihrem übergeordneten Fenster

    driver.switchTo().window(secondWinHandle); 
    
+0

Ich habe das auch versucht, aber nicht funktioniert. Könnte ein Problem des Wartens sein? – Larisa

0

Es scheint ein Problem mit der im Code verwendeten Logik zu geben. Wenn Sie Folgendes verwenden: Iterator it = handles.iterator();

die Anzahl der Fenster geöffnet ist 2, so wird die bedingte Schleife zweimal unabhängig von der die in (Ie Login und Fenstern automatisch schließ ausgeführte Aktion ausgeführt werden.

In der zweiten Iteration wird der übergeordneten Fenstergriff überschreibt

Um dies zu vermeiden, müssen Sie das Eltern-Fenster-Handle entweder außerhalb der Schleife oder nur einmal innerhalb des Codes abholen und speichern Code-Snippet mit Änderung für die erste Lösung wird eingefügt:

String parent = it.next(); 

Außerhalb der Schleife erfasst das übergeordnete Fensterhandle und behält den Wert bei.

Iterator<String> it = handles.iterator(); 
String parent = it.next(); 
// iterate through your windows 
while (it.hasNext()) { 
    String newwin = it.next(); 
    getDriver().switchTo().window(newwin); 
    typeLoginCredentials 
      (username,password); 
    performClickOnLoginButton(); 
    Thread.sleep(5000); 
} 
getDriver().switchTo().window(newwin); 
loginShouldBeSuccessful(); 
+0

Ich habe das auch versucht, aber immer noch, von Zeit zu Zeit, nach dem Umschalten zum Elternfenster, hängt das Treiberfenster, ohne etwas zu tun. Ich habe versucht, mehr als 5 Sekunden zu warten, aber nichts. Nachdem das Anmelde-Popup automatisch geschlossen wurde, wird im übergeordneten Fenster eine neue URL geladen. Ist es möglich, dass der Name, den ich ursprünglich gespeichert habe, geändert wird, nachdem die neue URL geladen wurde? (Ich meine dies * String parent = it.next(); *) – Larisa

+0

Gibt es Ausnahmen? Wenn es sich um eine Synchronisierung handelt, möchten Sie möglicherweise Thread.sleep nicht verwenden. Sie könnten auch versuchen, alle Fenstergriffe nach der Schleife zu holen und zum ersten zu wechseln. Sie können vorher und nachher eine Systemüberwachung von Fensterhandgriffen durchführen, um zu sehen, ob Änderungen vorgenommen wurden. Wenn nicht, dann muss das Skript korrekt synchronisiert werden. – Sai

+0

Es gibt keine Ausnahme. Ich habe auch versucht, alle Fenster nach der Schleife zu holen, aber manchmal gibt driver.getWindowHandles() kein Ergebnis. Aber wenn es funktioniert, gibt es keine Änderungen. Gibt es einen anderen Weg, um die Synchronisierung zu beheben, außer das Thread.sleep zu entfernen? – Larisa

Verwandte Themen