首页 文章

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

提问于
浏览
0

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

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

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

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

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

4 回答

  • 1

    首先,

    另外,我知道使用driver.getTitle但它只返回父窗口的 Headers .

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

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

    • 使用 driver.CurrentWindowHandle 保存当前窗口句柄

    • 点击链接打开新窗口

    • 现在,保存列表中的所有窗口句柄

    • 如果窗口句柄的数量大于1,则可以说新窗口已打开 .

    • 使用 SwitchTo() 切换到新窗口 .

    • 验证新窗口的 Headers 以检查新窗口是否在焦点上 .

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

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

  • 0

    如何确定打开的是窗口还是标签?

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

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

    例:

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

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

  • 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);
        });
    }
    

相关问题