Selenium WebDriver:确定是否已打开新窗口或选项卡以及是否具有焦点

时间:2016-02-02 17:28:17

标签: selenium selenium-webdriver

新手在这里使用Selenium WebDriver并在此论坛上搜索了答案或类似问题,但没有运气。

我正在尝试开发自动化,尝试确定何时打开新窗口或标签时单击网页链接,如果是,则新窗口或标签是否为焦点。

能够确定它是一个窗口还是已打开的标签很重要。我熟悉在点击之前和之后使用driver.getWindowHandles来确定是否有东西打开但是在确定它是窗口还是打开的标签时找不到任何东西。

另外,我知道使用driver.getTitle但它只返回父窗口的标题。在确定新打开的窗口或标签是否处于焦点时,我无法发现任何内容。

如果有可能处理这两个问题,是否有人能够至少指出我正确的方向?

4 个答案:

答案 0 :(得分:1)

首先,

  

另外,我知道使用driver.getTitle但它返回的标题   仅限父窗口。

这意味着您没有切换到新窗口。您需要切换到新窗口,然后验证标题。

以下是实现这两个目标的方法:

  1. 使用driver.CurrentWindowHandle
  2. 保存当前窗口句柄
  3. 点击链接打开新窗口
  4. 现在,将所有窗口句柄保存在列表中
  5. 如果窗口句柄的数量大于1,则可以说新窗口已打开。
  6. 使用SwitchTo()切换到新窗口。
  7. 验证新窗口的标题以检查新窗口是否清晰对焦。
  8. 试试这个简单的C#代码,我对Chrome写了同样的代码,但应该适用于所有浏览器。

    [Test]
        public void MultipleWindows_Test()
        {
            IWebDriver driver = new ChromeDriver(@"CHROME DRIVER PATH");
    
            //Navigate to URL for ex. http://www.w3schools.com/js/
            driver.Navigate().GoToUrl(@"http://www.w3schools.com/js/");
            driver.Manage().Window.Maximize();
    
            //Get Parent Window Handle
            string parentWindow = driver.CurrentWindowHandle;
    
            string newWindow = "";
            string expectedNewWindowTitle = "Tryit Editor v2.6";
    
            Thread.Sleep(2000); //Static wait is not recommended
            Console.WriteLine("Parent Window Title: " + driver.Title);
    
            //Click on the link to open new window
            IWebElement TryItYourselfLink = driver.FindElement(By.LinkText("Try it Yourself »"));
            TryItYourselfLink.Click();
    
            Thread.Sleep(2000); //Static wait is not recommended
    
            //Store all window handles in a list
            IList<string> allWindowHandles = driver.WindowHandles;
    
            //If allWindowHandles.Count is greater than 1 then you can say that new window has been opened.
            if (allWindowHandles.Count > 1)
            {
                Console.WriteLine("New window has been opened.");
            }
    
            //Get new window handle
            for (int i = 0; i < allWindowHandles.Count; i++)
            {
                if (allWindowHandles[i] != parentWindow)
                {
                    newWindow = allWindowHandles[i];
                }
            }
    
            //Switch to new window handle.
            driver.SwitchTo().Window(newWindow);
    
            Console.WriteLine("New Window Title: " + driver.Title);
    
            //You can verify the title of new window to verify whether is in focus or not.
            Assert.AreEqual(expectedNewWindowTitle, driver.Title);
         }
    

    我希望它有所帮助。如果没有,请告诉我。

答案 1 :(得分:0)

  

如何确定打开的窗口或标签是什么?

似乎这些窗口上没有不同的“类型”,只是不同的选项。我发现检查它是否是标签或窗口的方法是检查window.menubar.visible。对于选项卡,它是一个完整的普通窗口,它是真的,对于窗口,菜单是隐藏的,因此是假的。这同样适用于window.toolbar.visible。

至少在FF和Chrome中使用。不幸的是不在IE中。 (在IE8中完成测试,这是我安装的版本。当然要进行测试..)

示例:

if(window.menubar.visible) {
    //Tab
} else {
    //"Child" Window
}

答案 2 :(得分:0)

您可以尝试使用该方法 - WebElement activeElement() 它返回带有焦点的WebElement,或者如果没有可以检测到具有焦点的元素,则返回body元素。

答案 3 :(得分:0)

确定窗口是否不是标签的一种方法是使用您的驱动程序执行javascript:

public void assertIsWindow(WebDriver driver) {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until((ExpectedCondition<Boolean>) (WebDriver d) -> {
        return ((JavascriptExecutor) d).executeScript("return window.opener !== null && !window.menubar.visible").equals(true);
    });
}
相关问题