如何使用 webdriver 切换到新窗口?

软件测试 网络驱动程序
2022-01-27 19:42:56

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

@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;   
    }
4个回答

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

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

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

我认为您可能在您的 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;
            }

当您只有一个 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;                                     
                        }
                   }

对于某些浏览器,一旦执行鼠标悬停操作,菜单列表就会在 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();