Selenium webdriver 选择新的 window c#

Selenium webdriver selecting new window c#

尝试在 C# 中使用 selenium webdriver 编写一些测试用例,但遇到一个我不确定如何解决的场景

用户场景正在搜索 table 患者,select 患者然后打开新的 window,然后断言 window[=11 上的各种项目=]

我的问题是我无法 select 新的 window 断言任何东西,它不是弹出窗口 window,它是一个全新的浏览器 window 但它没有 window title/name 来识别它,我怎样才能将驱动程序焦点切换到这个 window?

提前致谢

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

Selenium 已经有了您的浏览器会话,因此新的 window 对 selenium 来说不是问题,它只是新内容。

在 Selenium WebDriver 中真的很容易。通过使用 SwitchTo 方法

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

也请参阅此博客 post

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

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

}      

"" - 表示您的 window 头衔

我有一些您可能会喜欢的代码。最快的解决方案是使用 Popup Finder,但我也有自己的方法。我永远不会依赖 Window 句柄到 select 适当 window 的顺序。 弹出 Window 查找器:

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

我的自定义方法。基本上,您将要单击的元素、您的网络驱动程序以及单击该元素后搜索之前等待的时间(可选)传递给它。

它会获取您当前所有的句柄并制作一个列表。它使用该列表来消除先前存在的 windows 以防止意外切换到。然后它单击启动新 window 的元素。点击后应该总是有某种延迟,因为没有立即发生。然后它创建一个新列表并将其与旧列表进行比较,直到找到新的 window 或循环到期。如果它找不到新的 window 它 returns null,所以如果你有一个不总是有效的不稳定的网络元素,你可以进行 null 检查以查看开关是否有效。

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;
        }

这段代码对我有用。在我的例子中,新的 window/tab 是一个有一定重量的 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".

        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 并处理浏览器,获取您的 window 的标题并比较并关注您想要的浏览器 window。