我单击了幻灯片放映中的图像,它会生成一个新窗口。窗口打开后,我需要将精力集中在新窗口上并做一些事情。我已在下面附加了我的代码,但未成功。

@Test
public void testCreateAccount() throws Exception{

//OPEN manorama online  url
driver.navigate().to("http://www.manoramaonline.com/cgi-bin/MMOnline.dll/portal/ep/home.do?tabId=0&BV_ID=@@@");

// to click a link inside a slide show

while (!driver
        .findElement(
                By.xpath("/html/body/div[2]/div[2]/div[4]/div/div/div/div/center/div/div[2]/span/div/a/img"))
        .isDisplayed()) {
}
driver.findElement(
        By.xpath("/html/body/div[2]/div[2]/div[4]/div/div/div/div/center/div/div[2]/span/div/a/img"))
        .click();



String newwindowTitle = driver.getTitle();

switchWindow(newwindowTitle);

}

protected static boolean switchWindow(String title) throws IOException {

    String currentWindow = driver.getWindowHandle();
    Set<String> availableWindows = driver.getWindowHandles();
    if (!availableWindows.isEmpty()) {
    for (String windowId : availableWindows) {
    if (driver.switchTo().window(windowId).getTitle().equals(title)) {
    return true;
    } else {
        driver.switchTo().window(currentWindow);
    }}}

    return false;   
    }


评论

您假设页面标题不同/唯一。您的应用程式正确吗?

#1 楼

一个可能更简单的解决方案是:

driver.SwitchTo().Window(driver.WindowHandles.Last());


。Last()只会切换到最近打开的窗口,该窗口应该是您打开时刚刚打开的窗口。点击了链接。

#2 楼

我认为您可能在switchWindow方法中使问题复杂化了。

如果我对您的理解正确,那么您要做的就是遍历打开的窗口,比较每个窗口的标题,如果正确,则返回true。

C#示例

protected static Boolean SwitchWindow(string title)
            {
                var currentWindow = driver.CurrentWindowHandle;
                var availableWindows = new List<string>(driver.WindowHandles);

                foreach (string w in availableWindows)
                {
                    if (w != currentWindow)
                    {
                        driver.SwitchTo().Window(w);
                        if (driver.Title == title)
                            return true;
                        else
                        {
                            driver.SwitchTo().Window(currentWindow);
                        }

                    }
                }
                return false;
            }


#3 楼

如果只有URL,这可能是一个有用的解决方案:

                   public void SwitchTo(string prefix)                 
                   {                        
                    var handlers = driver.WindowHandles;

                        foreach (var handler in handlers)
                        {
                            driver.SwitchTo().Window(handler);
                            if (driver.Url.Contains(prefix)) return;                                     
                        }
                   }


#4 楼

对于某些浏览器,碰巧一旦执行了鼠标悬停操作,但是在Selenium确定下一个子菜单项之前,菜单列表会很快消失。在这种情况下,最好在主菜单上使用perform()操作来保存菜单列表,直到Selenium确定子菜单项并单击它为止。

此处

WebElement xWL = driver.findElement(By.xpath("x path text"));

Actions xAct = new Actions(driver);


代替此:

xAct.moveToElement(xWL).build().perform();


下面的代码将解决“元素不可见”的问题

xAct.moveToElement(xWL);
xAct.click();
xAct.perform();


#5 楼

使用Ruby和Watir-webdriver,您只需要使用此代码

browser.windows.last.use


,这会将焦点设置为新打开或最后打开的选项卡或窗口, >在使用完新标签页/窗口后,只需使用它来关闭该标签页/窗口

browser.windows.last.close


或者如果您想切换回上一个标签页/窗口,您将可以通过:title, :url, or :index.

browser.window(:index => 1).use
browser.window(:url => /closeable\.html/).use
browser.window(:title => "closeable window").use

查找窗口