【问题标题】:Selenium webdriver getting focus to parent window from child window whichis popSelenium webdriver 从弹出的子窗口获取焦点到父窗口
【发布时间】:2015-03-24 06:53:41
【问题描述】:

我正在尝试从单击生成的弹出窗口切换到父窗口。

我尝试了一些我发现但没有奏效的方法。

public static String validateHierarchy(Properties prop)
{
    String Hierarchy = driver.findElement(By.xpath("html/body/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[2]/td[2]/table/tbody/tr/td[1]/table/tbody/tr[34]/td")).getText();
    Log.info(Hierarchy);

    String mainWindowHandle = driver.getWindowHandle();
    driver.findElements(By.cssSelector("a[class='left-link']")).get(10).click();
    //switching to current window 
    Set<String> s = driver.getWindowHandles();
    System.out.println("Window"+mainWindowHandle);
    System.out.println("Window"+s);
    Iterator<String> ite = s.iterator();
    while(ite.hasNext())
    {
        String popupHandle=ite.next().toString();
        if(!popupHandle.contains(mainWindowHandle))
        {
            driver.switchTo().window(popupHandle);
            //checking for forgot password text in the current page
            String part1 = driver.findElement(By.xpath("html/body/div[3]/form")).getText();
            Log.info(part1);
            String part2 = driver.findElement(By.xpath(".//*[@id='tree']")).getText();
            Log.info(part2);

            driver.close(); //closing child window
        }
    }

     driver.switchTo().window( mainWindowHandle );

    String mainWindowHandle1 = driver.getWindowHandle();
    System.out.println("Window"+mainWindowHandle1);
    driver.findElements(By.cssSelector("a[class='left-link']")).get(11).click();




    //switching to current window 
    Set <String> s1 = driver.getWindowHandles();
    System.out.println("Window"+mainWindowHandle1);
    System.out.println("Window"+s1);
    Iterator<String> ite1 = s1.iterator();
    while(ite1.hasNext())
    {
        String popupHandle1=ite1.next().toString();
        if(!popupHandle1.contains(mainWindowHandle1))
        {
            driver.switchTo().window(popupHandle1);

            //checking for forgot password text in the current page
            String part1 = driver.findElement(By.xpath("html/body/div[3]/form")).getText();
            Log.info(part1);
            String part2 = driver.findElement(By.xpath(".//*[@id='tree']")).getText();
            Log.info(part2);



            driver.close(); //closing child window

         }
      }


    driver.switchTo().window( mainWindowHandle );
    return Hierarchy;
}

第一个弹出窗口得到了正确处理,但是当它出现并转到点击选项“get(11).click()”时。那里出错了

窗口{ed1019d1-0ac5-4cc0-ba18-8efdadc10c4c} 窗口[{ed1019d1-0ac5-4cc0-ba18-8efdadc10c4c},{9e9cbcf5-9c4b-4805-918b-8f3eb7d9f946}] 窗口{ed1019d1-0ac5-4cc0-ba18-8efdadc10c4c} 线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:11,大小:0 在 java.util.ArrayList.rangeCheck(未知来源) 在 java.util.ArrayList.get(未知来源) 在 JaamoonManage.validateHierarchy (JaamoonManage.java:299) 在 JaamoonManage.main(JaamoonManage.java:106)

即使我也尝试找到 String Hierarchy 元素,但我也找不到。它正在切换到父窗口,但它无法对此进行任何操作。

谁能指出我哪里有问题。

谢谢。

【问题讨论】:

标签: java selenium webdriver


【解决方案1】:

获取 IndexOutOfBoundException 的原因是,此定位器没有第 11 个元素By.cssSelector("a[class='left-link']")

List 中的get 方法将返回此列表中指定位置的元素并抛出 IndexOutOfBoundsException - 如果索引超出范围(索引 = size())

再次检查以下步骤中的逻辑。

 driver.findElements(By.cssSelector("a[class='left-link']")).get(11).click();

参考this blog 将控制切换到子窗口。

【讨论】:

  • 如果我评论第一个“ driver.findElements(By.cssSelector("a[class='left-link']")).get(10).click(); 和弹出-up 函数,那么 11 元素工作正常。 12 13 和 14 上有更多“左链接”元素。如果我评论整个方法,那么 12 13 和 14 元素在另一种方法中工作正常。只有当我从弹出窗口返回并在关闭弹出窗口后尝试访问另一个元素时,问题才会出现。
  • 第一次是否正确切换到主窗口?确保在将控件切换到主窗口后(关闭第一个弹出窗口后)打印页面标题/当前 url。并在使用 driver.navigate().refresh(); 刷新窗口后尝试 get(11) 元素;
  • 是的,它正在正确切换到主窗口。您可以在我的问题中看到我使用 System.out.println 来跟踪处理程序。在控制台中我可以看到最后的处理程序是主处理程序。我不明白您所说的打印页面标题/当前网址是什么意思,您能解释一下吗?我会尝试用刷新功能告诉你..
  • 我只是要求您打印 System.out.println(driver.getTitle()),以确保在关闭第一个弹出窗口后控件再次正确更改为主窗口。
  • 是的 SOP 将主窗口作为标题。我确实找到了解决方案。但这不是实际的解决方案,而是您可以说的解决方法。从 get(10).click() 关闭弹出窗口后; .我现在做的是driver.navigate().refresh();整数 TIME1 = Integer.parseInt(prop.getProperty(TIME)); driver.manage().timeouts().implicitlyWait(TIME1, TimeUnit.SECONDS); WebElement frame = driver.findElement(By.id(MAIN)); driver.switchTo().frame(frame); driver.findElement(By.linkText("Manage")).click();然后单击 11 元素。它工作正常,但不是一个很好的解决方案。