2016-02-02 30 views
0

新手在这里使用Selenium WebDriver并搜索此论坛的答案或类似的问题,但没有运气。硒WebDriver:确定新的窗口或标签已打开,如果它有焦点

我试图开发自动化,试图确定何时点击一个网页链接,如果新窗口或标签打开,如果是,新窗口或标签焦点或不。

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

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

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

+0

是否新窗口/标签有不同的标题,当您通过手动点击链接打开呢? – amitbobade

+0

是的,手动点击th链接时会有不同的标题。 – Mike

回答

1

首先,

另外,我知道如何使用driver.getTitle但它返回的 只有父窗口标题。

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

这里是实现方式两个方面:使用driver.CurrentWindowHandle

  • 点击链接打开新窗口
  • 现在,保存所有的窗口列表中的处理

    1. 保存当前窗口的句柄
    2. 如果窗口句柄的数量大于1,则可以说新窗口已打开。
    3. 使用SwitchTo()切换到新窗口。
    4. 验证新窗口的标题以检查新窗口是否处于焦点状态。

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

    谢谢你的回答!我会试试这个。另外,你有什么想法如何确定是否打开窗口或选项卡? – Mike

    +0

    @Mike抱歉,我无法回复您。在确定打开的窗口或选项卡上有什么好运? – amitbobade

    0

    如何确定打开的是窗口还是选项卡?

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

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

    实施例:

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

    可以尝试使用该方法 - WebElement activeElement() 它具有焦点,或本体元件返回WebElement如果焦点没有元件可被检测。

    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); 
        }); 
    } 
    
    相关问题