切换到Selenium Webdriver java中的其他浏览器窗口后无法单击链接

时间:2014-01-20 14:50:37

标签: java selenium selenium-webdriver

点击主窗口上的链接后,我尝试点击新打开的浏览器窗口上的链接但是webdriver无法在新打开的窗口中找到该元素。

下面是我用来打开另一个窗口然后对其执行操作的代码。

public void test() throws Exception{
    driver.findElement(By.xpath("//img[@alt='Calender']")).click();
    String Parent_Window =driver.getWindowHandle();

    for (String Child_Window : driver.getWindowHandles()) {
      driver.switchTo().window(Child_Window);
      driver.findElement(By.xpath("//div[@class='pbBody']//table[@class='list']//tr[@class='dataRow even first']//a")).click();
      // Webdriver is not able to click on the above link and it fails at this step
    }
    driver.switchTo().window(Parent_Window);
}

请帮我解释为什么wedrivber在切换后无法在新的浏览器窗口中找到该元素。谢谢!

4 个答案:

答案 0 :(得分:2)

试试这个,我对窗口手柄有严重的问题,但这个似乎更好。

String parentWindowHandler = driver.getWindowHandle(); 
        String subWindowHandler = null;

        Set<String> handles = driver.getWindowHandles();
        Iterator<String> iterator = handles.iterator();
        while (iterator.hasNext()){
            subWindowHandler = iterator.next();
        }
        driver.switchTo().window(subWindowHandler); 

        driver.findElement(By.xpath("")); //do something


        driver.switchTo().window(parentWindowHandler); 

答案 1 :(得分:1)

您的测试在for循环中driver.findElement失败,因为在第一次迭代中,它正在选择第一个窗口并尝试查找该链接。如果您的父窗口(而不是弹出窗口)中不存在该链接,那么您的测试将在此步骤失败。

如果只打开2个窗口,那么你应该这样做:

public void test() throws Exception{
    driver.findElement(By.xpath("//img[@alt='Calender']")).click();
    String Parent_Window =driver.getWindowHandle();
    String Child_Window = driver.getWindowHandles().iterator().next();

    driver.switchTo().window(Child_Window);

    driver.findElement(By.xpath("//div[@class='pbBody']//table[@class='list']//tr[@class='dataRow even first']//a")).click();

    driver.switchTo().window(Parent_Window);
}

或者,如果您使用getting started with selenium framework,您的测试将如下所示:

@Config(url="http://testsite.com")
public void Test extends AutomationTest {
    @Test
    public void test() {
        click(By.cssSelector("img[alt='Calender']"))
        .switchToWindow("Title of New Window")
        .click(By.cssSelector("div.pbBody table.list tr.dataRow.even.first a"))
        .switchToDefaultContent();
    }
}

答案 2 :(得分:1)

在for循环中找不到元素。 查找下面的元素for循环。 (执行循环后)

String parentWindow = webDriver.getWindowHandle();
Set<String> handles = webDriver.getWindowHandles();
    for (String windowHandle : handles) {
        if (!windowHandle.equals(parentWindow)) {
            webDriver.switchTo().window(windowHandle);
        }
    }

答案 3 :(得分:0)

是的,我可以运行框架工作的其他脚本,但即使我不知道问题是什么,因为我能够打印该窗口的标题,但webdriver无法在该窗口找到任何元素。