2013-02-18 7 views
6

Ich habe einen Umstand, in dem das Klicken auf eine Link-Webseite ein Popup-Fenster öffnet. Und nachdem das Popup-Fenster geöffnet wurde, befindet sich der Fokus im Popup-Fenster und das Master-Fenster ist deaktiviert. Und ich kann das Steuerelement nicht in das Popup-Fenster übertragen. Bitte sehen Sie sich den folgenden Code an.Umgang mit einem Popup-Fenster mit Selen

driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens. 

System.out.println("After Clicking me"); // After the popup window opens this line of code is never executed. 

Ich kann das Steuerelement aus dem übergeordneten Fenster nicht in Popup-Fenster übertragen. Ich kenne den folgenden Befehl.

driver.switchTo().window("popup window"); 

Aber es hilft nicht viel. Bitte hilf mir.

Antwort

7

Dies ist ein Code, den ich benutze, wenn ich mit einem folgenden Popup-Fenster arbeiten muss, schließe es und gehe zurück zu meinem Hauptfenster. Natürlich wurde es für diese Antwort vereinfacht. Es behält ein Handle des ursprünglichen Fensters (Haupt) bei, damit es einen Unterschied zwischen den anderen machen kann.

Es erfordert eine explizite WebDriverWait weil ich während der Entwicklung hat Probleme, dass Code ausgeführt wurde, bevor das Fenster tatsächlich offen stand, so könnte dies nicht ein idealer Zustand,

function manipulatePopUp(final WebDriver driver, final WebDriverWait wait) { 
    final String mainWindowHandle = driver.getWindowHandle(); 
    driver.findElement(By.id("linkThatOpensPopUp")).click(); 

    wait.until(new ExpectedConditions<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver d) { 
      return (d.getWindowHandles().size() != 1); 
     } 
    }); 

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

    driver.close(); 
    driver.switchTo().window(mainWindowHandle); 
} 
+0

Können Sie mir bitte mehr über die wait.until Methode Syntax und die Logik darin erklären? –

+1

Übrigens, driver.getWindowHandles() gibt ein Set keine Liste zurück. –

+0

Das Warten wird im Grunde so lange fortgesetzt, bis der Treiber mehr als einen Handle hat. Das gibt mir den richtigen Zeitpunkt, um sicherzugehen, dass das Popup jetzt bereit ist, mit ihm zu interagieren. – aimbire

9

driver.findElement (By .linkText ("Klick mich")). click(); // Wenn diese Codezeile erreicht ist, öffnet sich ein Popup-Fenster.

System.out.println ("Nach dem Klicken auf mich"); // Nachdem das Popup-Fenster geöffnet wurde, wird diese Codezeile nie ausgeführt.

Die Codezeile wird nie ausgeführt, da der Prozess darauf wartet, dass das Popup verarbeitet wird.

getWindowHandles() funktioniert in dieser Situation ordnungsgemäß.

Beispiel:

//handle of the master window before clicking the link 
String master = driver.getWindowHandle(); 

driver.findElement(By.linkText("Click me")).click(); 

//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop. 
int timeCount = 1; 

do 
{ 
    driver.getWindowHandles(); 
    Thread.sleep(200); 
    timeCount++; 
    if (timeCount > 50) 
    { 
     break; 
    } 
} 
while (driver.getWindowHandles().size == 1); 

//Assigning the handles to a set 
Set<String> handles = driver.getWindowHandles(); 
//Switching to the popup window. 
for (String handle : handles) 
{ 
    if(!handle.equals(master)) 
    { 
     driver.switchTo().window(handle); 
    } 
} 

Jetzt Treiber wird auf dem Popup-Fenster eingeschaltet. Wenn das Popup-Fenster einen Rahmen hat, müssen Sie zu dem Rahmen wechseln, bevor Sie Elemente darin identifizieren.

0
public class socialSignOn extends masterBaseClassNewSiteStage { 

    @Test 
    public void testSocialSignOn() throws Throwable { 
     openParticularUrl("/my-lfc/join/user-details?user_type=free"); 

     driver.findElement(By.cssSelector("#socialSignOn > div.left.socialLogin.googleButton")).click(); 

     String MainWindow = driver.getWindowHandle(); 

     for (String activeHandle : driver.getWindowHandles()) { 
      if (!activeHandle.equals(MainWindow)) { 
       driver.switchTo().window(activeHandle); 
      } 
     } 
     driver.findElement(By.cssSelector("#Email")).sendKeys(""); 
     driver.findElement(By.cssSelector("#next")).click(); 
     pauseFiveSeconds(); 
     driver.findElement(By.cssSelector("#Passwd")).sendKeys(""); 
     driver.findElement(By.cssSelector("#signIn")).click(); 
     pauseOneSecond(); 
     driver.switchTo().window(MainWindow); 
     pauseTenSeconds(); 
     closeDriver(); 
    } 
} 
-1
// delay : max number of seconds 
new WebDriverWait(driver, delay * 1000).until(ExpectedConditions.alertIsPresent()); 
drive`enter code here`r.switchTo().alert().accept();