【问题标题】:Selenium WebDriver: Determining if new window or tab has opened and if it has focusSelenium WebDriver:确定新窗口或选项卡是否已打开以及是否具有焦点
【发布时间】:2016-05-11 15:26:07
【问题描述】:

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

我正在尝试开发自动化,尝试确定单击网页链接时是否打开了新窗口或选项卡,如果打开了,新窗口或选项卡是否处于焦点。

能够确定它是打开的窗口还是选项卡很重要。我熟悉在单击之前和之后使用 driver.getWindowHandles 来确定是否打开了某些东西,但在确定它是打开的窗口还是选项卡时找不到任何东西。

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

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

【问题讨论】:

  • 手动点击链接打开新窗口/标签是否有不同的标题?
  • 是的,手动点击链接时会有不同的标题。

标签: selenium selenium-webdriver


【解决方案1】:

首先,

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

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

这是实现这两件事的方法:

  1. 使用driver.CurrentWindowHandle保存当前窗口句柄
  2. 点击链接打开新窗口
  3. 现在,将所有窗口句柄保存在一个列表中
  4. 如果窗口句柄数大于 1,则可以说新窗口已打开。
  5. 使用SwitchTo()切换到新窗口。
  6. 验证新窗口的标题以检查新窗口是否处于焦点。

试试这个简单的 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);
     }

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

【讨论】:

  • 感谢您的回答!我会试试这个。另外,您对如何确定打开的是窗口还是选项卡有任何想法吗?
  • @Mike 抱歉,我无法回复您。确定打开的窗口或选项卡有什么运气吗?
【解决方案2】:

如何判断打开的是窗口还是标签页?

似乎这些窗口上没有不同的“类型”,只是不同的选项。我发现检查它是选项卡还是窗口的一种方法是检查 window.menubar.visible。对于选项卡,这是一个完整且正常的窗口,它是 true,对于窗口,菜单是隐藏的,因此是 false。同样适用于 window.toolbar.visible。

至少适用于 FF 和 Chrome。不幸的是,不在 IE 中。 (在IE8下测试,也就是我安装的版本。当然是为了测试..)

例子:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      确定窗口是否不是选项卡的一种方法是使用驱动程序执行 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);
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多