2015-03-13 42 views
6

想寫使用硒的webdriver在C#中的一些測試用例,並有我不能確定的情況下如何解決硒的webdriver選擇新窗口C#

用戶場景表格檢索的患者,選擇患者然後一個新的窗口打開,然後斷言窗口上的各種項目

我的問題是我無法選擇新的窗口來聲明任何東西,它不是一個彈出窗口,它是一個全新的瀏覽器窗口,但它沒有窗口標題/名稱來標識它,我將如何能夠將驅動程序焦點切換到此窗口?

在此先感謝

+0

你可以嘗試通過窗口把手切換到它嗎? – 2015-03-13 10:01:42

回答

8

Selenium WebDriver的確很簡單。通過使用SWITCHTO方法

driver.SwitchTo().Window(driver.WindowHandles.Last()); 

看到這個博客帖子以及

http://binaryclips.com/2015/03/13/selenium-webdriver-in-c-switch-to-new-window/

+1

我收到此錯誤消息:'System.Collections.ObjectModel.ReadOnlyCollection '不包含'Last'的定義,沒有擴展方法'Last'接受'System'類型的第一個參數。可以找到Collections.ObjectModel.ReadOnlyCollection '(你是否缺少使用指令或程序集引用?) – dmeehan 2015-04-01 12:20:16

+2

請使用System.Linq將此使用指令添加到代碼頂部 ; 然後你就可以訪問所有的Linq.Enumerables方法,如先(),最後()等。 – joinsaad 2015-04-02 11:18:08

0

如果我正確地收集您的應用程序會產生它自己的窗口,不進一步userintervention。你應該能夠等待頁面加載,然後你可以像平常一樣調用你的斷言。

硒已經有你的瀏覽器會話,所以一個新窗口不是硒的問題,它只是新的內容。

0
foreach (string defwindow in driver.WindowHandles) 
{ 
    driver.SwitchTo().Window(defwindow); 
    if(driver.Title == "") 
    { 
    selenium.WindowFocus(); 
    selenium.SelectWindow(""); 
    } 

}  

「」 - 表示你的窗口標題

0

我有一些代碼,你可能會喜歡。最快的解決方案是使用Popup Finder,但我也製作了自己的方法。我絕不會依賴窗口句柄所在的順序來選擇適當的窗口。 彈出式窗口查找器:

PopupWindowFinder finder = new PopupWindowFinder(driver); 
driver.SwitchTo().Window(newWin); 

我的自定義方法。基本上你可以通過它點擊你想要點擊的元素,你的web驅動程序,以及可選的時間,然後再點擊元素進行搜索。

它把你所有的當前手柄和一個列表。它使用該列表來消除以前存在的意外切換到的窗口。然後它點擊啓動新窗口的元素。點擊之後總會有某種延遲,因爲沒有任何反應會立即發生。然後,它會創建一個新列表,並將其與舊的列表進行比較,直至找到新窗口或循環過期。如果它找不到新窗口,它將返回空值,所以如果你有一個並不總是工作的iffy webelement,你可以做一個空檢查來查看交換機是否工作。

public static string ClickAndSwitchWindow(IWebElement elementToBeClicked, 
IWebDriver driver, int timer = 2000) 
     { 
      System.Collections.Generic.List<string> previousHandles = new 
System.Collections.Generic.List<string>(); 
      System.Collections.Generic.List<string> currentHandles = new 
System.Collections.Generic.List<string>(); 
      previousHandles.AddRange(driver.WindowHandles); 
      elementToBeClicked.Click(); 

      Thread.Sleep(timer); 
      for (int i = 0; i < 20; i++) 
      { 
       currentHandles.Clear(); 
       currentHandles.AddRange(driver.WindowHandles); 
       foreach (string s in previousHandles) 
       { 
        currentHandles.RemoveAll(p => p == s); 
       } 
       if (currentHandles.Count == 1) 
       { 
        driver.SwitchTo().Window(currentHandles[0]); 
        Thread.Sleep(100); 
        return currentHandles[0]; 
       } 
       else 
       { 
        Thread.Sleep(500); 
       } 
      } 
      return null; 
     } 
0

此代碼適用於我。在我的情況下,新窗口/選項卡是一個有一定權重的PDF,所以我在加載時做了一些自定義的等待。

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 
int previousWinCount = driver.WindowHandles.Count; 
// Perform the action to open a new Window 
wait.Until(driver => driver.WindowHandles.Count == (previousWinCount + 1)); 
driver.SwitchTo().Window(driver.WindowHandles.Last()); 
wait.Until(driver => driver.Url.Contains("desired_url_or_a_substring_of_it")); 

注意,當PDF加載的driver.Url「關於:空白」