2013-02-18 12 views
6

Mam okoliczność, w której kliknięcie strony z linkiem otwiera okno wyskakujące. Po otwarciu okna podręcznego fokus znajduje się w oknie podręcznym, a okno główne jest wyłączone. I nie jestem w stanie przenieść kontroli do okna podręcznego. Proszę spojrzeć na poniższy kod.Obsługa okna wyskakującego przy użyciu selenu

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. 

Nie mogę przenieść kontroli z okna nadrzędnego do okna wyskakującego. Jestem świadomy następującego polecenia.

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

Ale to niewiele pomaga. proszę pomóż mi.

Odpowiedz

7

Jest to kod, którego używam, gdy potrzebuję pracować z następującym pop-up window, zamknij go i wróć do mojego głównego okna. Oczywiście został uproszczony do celów tej odpowiedzi. Utrzymuje uchwyt oryginalnego okna (głównego), dzięki czemu może odróżnić pozostałe.

To wymaga wyraźnej WebDriverWait ponieważ miałem problemy podczas rozwoju, że kod został biec zanim okno rzeczywiście dostał otwarty, więc to może nie być idealny stan,

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

Czy możesz powiedzieć coś więcej o wait.until metoda składni i logiki w tym? –

+1

Nawiasem mówiąc, driver.getWindowHandles() zwraca Set nie listę. –

+0

Poczekaj w zasadzie pętle, aż kierowca ma więcej niż jeden uchwyt, przez co daje mi odpowiedni czas, aby upewnić się, że okienko wyskakujące jest teraz gotowe do interakcji. – aimbire

9

driver.findElement (By .linkText ("Kliknij mnie")). Kliknij(); // po osiągnięciu tego wiersza kodu otworzy się okno podręczne.

System.out.println ("Po kliknięciu mnie"); // Po wyświetleniu okna wyskakującego ta linia kodu nigdy nie zostanie wykonana.

Linia kodu nigdy nie jest wykonywana, ponieważ proces oczekuje na obsługę wyskakującego okienka.

getWindowHandles() działa poprawnie w tej sytuacji.

Przykład:

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

Teraz kierowca włącza się okienko. Jeśli okno wyskakujące ma ramkę, musisz przejść do ramki przed zidentyfikowaniem elementów w niej.

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