Selenium webdriver选择新窗口c#

时间:2015-03-13 09:11:27

标签: c# selenium selenium-webdriver webdriver popupwindow

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

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

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

提前致谢

6 个答案:

答案 0 :(得分:15)

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

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

请参阅此博客文章

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

}      

“” - 表示您的窗口标题

答案 3 :(得分:0)

我有一些您可能喜欢的代码。最快的解决方案是使用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<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;
        }

答案 4 :(得分: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 “about:blank”

答案 5 :(得分:0)

        IWebDriver _driver = new FirefoxDriver();
        _driver.Navigate().GoToUrl("https://www.google.com");

        ReadOnlyCollection<string> WindowHandles = _driver.WindowHandles;
        foreach (string item in WindowHandles)
        {
            _driver.SwitchTo().Window(item);
            string browserTitle = _driver.Title;
            string browserPageSource = _driver.PageSource;
            string browserURL = _driver.Url;
        }

使用ReadOnlyCollection并处理浏览器,获取窗口的标题,进行比较并集中精力于所需的浏览器窗口。