Selenium webdriver选择新窗口c#

尝试在c#中使用selenium webdriver编写一些测试用例,并且有一个我不确定如何解决的场景

用户场景正在搜索患者的表格,选择患者然后打开一个新窗口,然后在窗口上断言各种项目

我的问题是我无法选择新窗口来断言任何东西,它不是一个弹出窗口,它是一个全新的浏览器窗口,但它没有窗口标题/名称来识别它,我怎么能够将驱动程序焦点切换到此窗口?

提前致谢

Selenium WebDriver非常简单。 通过使用SwitchTo方法

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

请参阅此博客文章

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

如果我正确地收集你的应用程序将自己生成窗口而无需进一步的用户干预。 您应该能够等待页面加载,然后您可以正常调用您的断言。

Selenium已经拥有了你的浏览器会话,因此新窗口不是selenium的问题,它只是新内容。

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

“” – 表示您的窗口标题

我有一些你可能喜欢的代码。 最快的解决方案是使用Popup Finder,但我也制作了自己的方法。 我永远不会依赖Window Handles所在的顺序来选择合适的窗口。 弹出窗口查找器:

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

我的自定义方法。 基本上你传递了你想要点击的元素,你的webdriver,以及你点击元素后搜索之前等待的时间。

它会占用您当前的所有句柄并生成一个列表。 它使用该列表来消除以前存在的窗口意外切换到。 然后单击启动新窗口的元素。 点击后应始终存在某种延迟,因为没有立即发生。 然后它创建一个新列表并将其与旧列表进行比较,直到找到新窗口或循环到期为止。 如果找不到新窗口,则返回null,因此如果你有一个并不总是有效的iffy webelement,你可以进行空检查,看看交换机是否有效。

 public static string ClickAndSwitchWindow(IWebElement elementToBeClicked, IWebDriver driver, int timer = 2000) { System.Collections.Generic.List previousHandles = new System.Collections.Generic.List(); System.Collections.Generic.List currentHandles = new System.Collections.Generic.List(); 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; } 

这段代码对我有用。 在我的情况下,新的窗口/选项卡是一个有一些重量的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“about:blank”