【问题标题】:Selenium webdriver window handles c# switchTo failedSelenium webdriver窗口处理c#switchTo失败
【发布时间】:2012-06-29 13:02:09
【问题描述】:

在测试过程中会弹出 2 个窗口。

我的代码:

string BaseWindow = driver.CurrentWindowHandle;                 
ReadOnlyCollection<string> handles = driver.WindowHandles;

foreach(string handle in handles)                    
{                         
    Boolean a = driver.SwitchTo().Window(handle).Url.Contains("Main");
    if (a == true)  
    {       
        InitialSetting.driver.SwitchTo().Window(handle);      
        break;
    }  
}                

我想切换到 url 包含“Main”的窗口。但是在测试运行的时候,会不断的在两个窗口之间切换,并没有停止。

我调试发现foreachboolean a 为真时也没有中断。

我该如何解决这个问题?

【问题讨论】:

  • 如果你在第二次没有 switchTo() 的情况下中断会发生什么,因为你在分配布尔值时已经切换了。

标签: c# selenium for-loop webdriver window-handles


【解决方案1】:
//switch to new window 
driver.FindElement(By.Id("link")).Click(); 

//wait for new window to open 
Thread.Sleep(2000); 

//get the current window handles 
string popupHandle = string.Empty; 
ReadOnlyCollection<string> windowHandles = driver.WindowHandles;  

foreach (string handle in windowHandles)  
{  
    if (handle != existingWindowHandle)  
    {  
         popupHandle = handle; break;  
    }  
}  

 //switch to new window 
driver.SwitchTo().Window(popupHandle); 

//check for element on new page 
webElement = driver.FindElement(By.Id("four04msg")); 
if(webElement.Text == "THE CONTENT YOU REQUESTED COULDN’T BE FOUND...")  
{  
    return false;  
}  
else  
{  
    return true;  
}  

 //close the new window to navigate to the previous one
driver.close(); 

//switch back to original window 
driver.SwitchTo().Window(existingWindowHandle);

【讨论】:

  • 如何获得existingWindowHandle
  • existingWindowHandle = driver.CurrentWindowHandle;
  • @Michael Ayers 我怎样才能获得驱动程序未打开的当前窗口(手动打开的现有窗口)的句柄意味着我不能使用 driver.getWindowHandle();
【解决方案2】:
  1. 使用原始邮政编码。

    string existingWindowHandle = driver.CurrentWindowHandle;

    这是第一个窗口。

  2. 重要的是:

    ReadOnlyCollection&lt;string&gt; windowHandles = driver.WindowHandles

    包含字符串名称对象,而不是 Windows 标题名称,用于 示例集合windowHandles 可能包含:

    不是 Windows 标题名称为 {Menu},{PopUp}
    它包含{45e615b3-266f-4ae0-a508-e901f42a36d3},{c6010037-0be6-4842-8d38-7f37c2621e81}

【讨论】:

    【解决方案3】:
            IWebDriver popup = null;
            string mainWindow = driver.CurrentWindowHandle;
            bool foundPopupTitle = false;
            foreach (string handle in driver.WindowHandles)
            {
                popup = driver.SwitchTo().Window(handle);
                if (popup.Title.Contains(title))
                {
                    foundPopupTitle = true;
                    break;
                }
            }
    
            if (foundPopupTitle)
            {
                popup.Close();
            }
            //switch back to original window
            driver.SwitchTo().Window(mainWindow);
    

    【讨论】:

    • 3 年前帖子上的纯代码答案对任何人都没有帮助。至少提供一个解释(确实,它应该比现有的更好)
    • 纯代码答案非常适合我。对于开发人员来说,代码比语言更有说服力。这个答案更好,因为它适用于多个弹出窗口的场景。第一个答案仅适用于 1 个弹出窗口。
    【解决方案4】:
    IJavaScriptExecutor js = driver as IJavaScriptExecutor;
    js.ExecuteScript("window.open()");
    String ventanaPrincipal = driver.CurrentWindowHandle;
    List<string> listWindow = new List<string>(driver.WindowHandles);
    driver.SwitchTo().Window(listWindow[1]);
    driver.Navigate().GoToUrl("http:www.google.com");
    IWebElement search = driver.FindElement(By.Name("q"));
    search.SendKeys("RPA");
    

    【讨论】:

      【解决方案5】:
      string NewWindowHandle = string.Empty;
      ReadOnlyCollection<string> windowHandles = driver.WindowHandles;
      NewWindowHandle = windowHandles[windowHandles.Count - 1];
      driver.SwitchTo().Window(NewWindowHandle);
      

      【讨论】: