Ошибка при переключении с родительского на дочернее окно и наоборот в selenium Webdriver

String Parentwindow = driver.getWindowHandle();
driver.findElement(By.xpath("//*[@id='ImageButton5']")).click();
Thread.sleep(3000);

for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
    Thread.sleep(3000);
}
System.out.println("Title of the page after - switchingTo: " + driver.getTitle());

driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219");
//Thread.sleep(3000);
driver.findElement(By.id("btnSearch")).click();
Thread.sleep(3000);
driver.findElement(By.id("chklstAllprocedure_0")).click();
Thread.sleep(3000);
driver.findElement(By.id("btnOk")).click();
Thread.sleep(5000);

/*ALL MODIFIERS 1*/

driver.switchTo().window(Parentwindow);
System.out.println(driver.getTitle());
//Thread.sleep(4000);
driver.switchTo().frame("ctl00_ContentPlaceHolder1_iframeID1");
Thread.sleep(3000);
driver.findElement(By.xpath("//*[@id='ImageButton17']")).click();
Thread.sleep(3000);
for(String winHandle1 : driver.getWindowHandles()){
    driver.switchTo().window(winHandle1);
    Thread.sleep(3000);
}
System.out.println("Title of the page after - switchingTo: " + driver.getTitle());
driver.findElement(By.id("txtEnterModifier")).sendKeys("RT");
Thread.sleep(3000);
driver.findElement(By.id("btnSearch")).click();
Thread.sleep(3000);
driver.findElement(By.id("chklstAllModifiers_0")).click();
Thread.sleep(3000);
driver.findElement(By.id("btnOk")).click();
Thread.sleep(3000);

Это мой код. Иногда, когда я пытаюсь переключиться между родительским и дочерним окнами, мой код работает без ошибок, а иногда показывает это сообщение об ошибке:

"Exception in thread "main" org.openqa.selenium.NoSuchWindowException: Unable to get browser (WARNING: The server did not provide any stacktrace information).
Command duration or timeout: 14 milliseconds".  

Пожалуйста, помогите мне в этом. Заранее спасибо.


person Arun Kumar    schedule 08.10.2013    source источник
comment
Кажется, в петле есть фундаментальный недостаток. Распечатайте значения Parentwindow и значения в цикле. Первое значение цикла и значение Parentwindow будут одинаковыми, что означает, что вы не переключаете дочернее окно. Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.   -  person Vinay    schedule 08.10.2013


Ответы (1)


Ваш метод не гарантирует, в какое окно будет переключен ваш драйвер. У меня есть служебный метод для переключения в нужное окно, как показано ниже.

public class Utility 
{
    public static WebDriver getHandleToWindow(String title){

        //parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle.
        WebDriver popup = null;
        Set<String> windowIterator = WebDriverInitialize.getDriver().getWindowHandles();
        System.err.println("No of windows :  " + windowIterator.size());
        for (String s : windowIterator) {
          String windowHandle = s; 
          popup = WebDriverInitialize.getDriver().switchTo().window(windowHandle);
          System.out.println("Window Title : " + popup.getTitle());
          System.out.println("Window Url : " + popup.getCurrentUrl());
          if (popup.getTitle().equals(title) ){
              System.out.println("Selected Window Title : " + popup.getTitle());
              return popup;
          }

        }
                System.out.println("Window Title :" + popup.getTitle());
                System.out.println();
            return popup;
        }
}

Вы попадете в нужное окно, как только заголовок окна будет передан в качестве параметра. В вашем случае можно.

Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow");

а затем снова переключитесь в родительское окно, используя тот же метод

Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");

Этот метод эффективно работает при работе с несколькими окнами.

person Abhishek Singh    schedule 08.10.2013