2016-02-02 72 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); 
        }); 
    } 
    
    相關問題