2013-02-18 27 views
6

In circostanze in cui facendo clic su una pagina Web di collegamento si apre una finestra popup. E dopo che la finestra popup si apre, il focus è nella finestra popup e la finestra master è disabilitata. E non riesco a trasferire il controllo nella finestra popup. Si prega di dare un'occhiata al seguente codice.Gestione di una finestra popup utilizzando selenio

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. 

Non riesco a trasferire il controllo dalla finestra padre alla finestra popup. Sono a conoscenza del seguente comando.

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

Ma non aiuta molto. mi aiuti per favore.

risposta

7

Questo è un codice che uso quando ho bisogno di lavorare con una finestra pop-up seguente, chiuderlo e tornare alla mia finestra principale. Ovviamente è stato semplificato allo scopo di questa risposta. Mantiene una maniglia della finestra originale (principale) in modo che possa fare la differenza tra gli altri.

Richiede una WebDriverWait esplicita perché ho avuto problemi durante lo sviluppo che il codice ottenuto eseguito prima che la finestra in realtà ha aperto, quindi questo potrebbe non essere una condizione ideale,

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

Può spiegare di più sul metodo della sintassi wait.until e la logica in esso? –

+1

A proposito, driver.getWindowHandles() restituisce un insieme non un elenco. –

+0

L'attesa continua in modo continuo fino a quando l'autista ha più di un handle, in questo modo mi dà il tempo giusto per essere sicuro che il pop-up sia pronto per essere interagito con. – aimbire

9

driver.findElement (By .linkText ("Click me")). click(); // quando viene raggiunta questa linea di codice, si apre una finestra popup.

System.out.println ("Dopo aver fatto clic su di me"); // Dopo che la finestra a comparsa apre questa riga di codice non viene mai eseguita.

La riga di codice non viene mai eseguita perché il processo è in attesa del popup da gestire.

getWindowHandles() funziona correttamente in questa situazione.

Esempio:

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

Ora conducente viene commutato la finestra pop-up. Se la finestra popup ha una cornice, è necessario passare alla cornice prima di identificare gli elementi in essa contenuti.

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(); 
Problemi correlati