2016-03-19 11 views
0

Ich habe Testfall mit folgendem Szenario aus:Umgang mit Popup-Fenster unmittelbar nach dem Login in Selenium

1) zur Website navigieren.
2) Anmeldeinformation eingeben.
3) Klicken Sie auf Login.

Nach dem Login in meiner Anwendung habe ich Tipp-Popup für Endbenutzer. Ich benutze Fensterhandler, um es zu schließen, aber das Problem ist manchmal, dass Selen so schnell läuft, dass es darauf klickt, bevor es sichtbar ist. Jede Hilfe wird geschätzt.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(60, TimeUnit.SECONDS) 
       .pollingEvery(2, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 
    String mainWindowHandle = driver.getWindowHandle(); 
      driver.switchTo().parentFrame(); 
      wait.until(ExpectedConditions.urlContains("client/default")); 
      wait.until(new ExpectedCondition<Boolean>() { 
       @Override 
       public Boolean apply(WebDriver d) { 
        System.out.println(String.format("Window size is %d", d.getWindowHandles().size())); 
        return (d.getWindowHandles().size() == 1); 
       } 
      }); 

      for (String activeHandle : driver.getWindowHandles()) { 
       if (!activeHandle.equals(mainWindowHandle)) { 
        driver.switchTo().window(activeHandle); 
       } 
      } 

      driver.findElement(By.xpath(elementLocator("popup_close_button"))).click(); 
      driver.switchTo().window(mainWindowHandle); // switch back to parent window 
+0

Ohne Code ist es unmöglich zu helfen. –

+0

Siehe [Selenium für x Sekunden pausieren] (http://stackoverflow.com/q/20009211) – JonasCz

+0

Hallo Roman Ich habe meinen Beitrag bearbeitet –

Antwort

0

Siehe diesen Code (aus here und modifiziert):


Wenn Sie es bis bis Pop arbeiten wollen, dann kommt heraus einige Code, um es hinzuzufügen, wie unten:

int flag=0,wait=0; 

while(flag==0 && wait<60){ 
try{ 

String parentWindowHandler = driver.getWindowHandle(); // Store your parent window 
String subWindowHandler = null; 

Set<String> handles = driver.getWindowHandles(); // get all window handles 
Iterator<String> iterator = handles.iterator(); 
while (iterator.hasNext()){ 
subWindowHandler = iterator.next(); 
} 
driver.switchTo().window(subWindowHandler); // switch to popup window 
             // perform operations on popup 
driver.close();///close pop up 

driver.switchTo().window(parentWindowHandler); // switch back to parent window 
//statements executed successfully, now exit by flag set to 1 
flag=1; 

} 
catch(exception e){//wait for one second 
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 
wait++; 
} 

if(wait==60){ 
JOptionPane.showMessageDialog(null,"Failed to detect pop up after 60 seconds."); 
} 


} 
+0

implizitWait ist nicht, was Sie denken, dass es hier ist . Es ist nicht dasselbe wie Thread.sleep (1000) oder WebDriverWait. –

0

Nach den Kommentaren wurde festgestellt, dass die Schließen-Schaltfläche nicht in einem neuen Fenster oder Tab erscheint. Stattdessen ist es die nächste Seite nach dem Login. Antwort aktualisieren, um ein bereits vorhandenes ExpectedConditions-Element zu nutzen, das (hoffentlich) das Problem lösen soll.

/** 
    * Performs application Login. 
    * @param driver WebDriver to act upon. 
    */ 
    public void login(WebDriver driver) { 
    //Perform Login function 

    //1. Identify the lookup we're going to use for the button. 
    By closeButtonLookup = elementLocator("popup_close_button"); 

    //2. Set up the Wait object with a reasonable timout value. 
    WebDriverWait wait = new WebDriverWait(driver, 30); 

    //3. Try to resolve the close button (from the current page/window/tab) after Selenium believes it to be a viable click target. 
    WebElement closeButton = wait.until(ExpectedConditions.elementToBeClickable(closeButtonLookup)); 
    System.out.println("Close button valid! Proceeding to click!"); 

    //4. Click the button 
    closeButton.click(); 
    System.out.println("I clicked the close button!"); 

    //Continue program 
} 
+0

Hallo Jeremiah danke für deine wertvolle Post. Ich habe Ihren Code gesehen, aber das Problem ist, dass ich immer die Größe des Fensterhandlers als "1" erhalte, so dass ich Schwierigkeiten habe. Wenn Sie mir helfen können, mein Problem zu lösen, dann wird es großartig. Vielen Dank. –

+0

Von Ihrem ursprünglichen Beitrag hatte ich den Eindruck, dass das zusätzliche Bestätigungselement nach dem Login in einem neuen Fenster verwaltet wurde. Wenn die Fensteranzahl nie steigt, ist es möglich, dass Sie sich mit einer Warnung beschäftigen. Ich habe meinem Vorschlag eine andere Methode hinzugefügt, um diese Möglichkeit zu berücksichtigen. Können Sie bitte die Konsolenausgabe posten, die Sie bei dem Fehler sehen? – Jeremiah

+0

Hallo Jeremiah. Das ist das Bootstrap-Hinweismodell-Popup in der Anwendung. Ich denke, Problem ist, dass es auf schließen Knopf des Modells popup, sobald es in Dom ist aber zu diesem Zeitpunkt Seite nicht vollständig geladen ist, was das Problem verursacht. Jede Hilfe würde hier geschätzt werden. –

Verwandte Themen