首页>Program>source

所以我正在使用c#winform中的Selenium firefox webdrivers,下面有这段代码来获取弹出窗口的句柄,该窗口在您单击" webtraffic_popup_start_button"时显示,并且它应该获取弹出窗口的句柄,但弹出窗口 句柄与当前句柄相同。

string current = driver.CurrentWindowHandle;
driver.FindElement(By.XPath("//*[@id='webtraffic_popup_start_button']")).Click();
Thread.Sleep(Sleep_Seconds);
popup = driver.CurrentWindowHandle;
Thread.Sleep(3000);
driver.SwitchTo().Window(current);
Thread.Sleep(1000);

对此的任何帮助将非常感谢

这是弹出窗口的样子。

最新回答
  • 2021-1-12
    1 #

    webDriver绝对不会跟踪任何内容 检测哪个窗口实际上位于操作系统的前台,并且在打开新的浏览器窗口时不会自动切换.这意味着获取新打开的弹出窗口的句柄的正确方法是一个多步骤过程.为此,您将:

    将当前焦点所在的窗口句柄保存到变量中,以便您 可以稍后再切换回去。

    获取当前打开的窗口句柄的列表。

    执行将导致新窗口出现的操作。

    等待窗口句柄的数量增加1。

    获取新的窗口句柄列表。

    在手柄列表中找到新手柄。

    切换到新窗口。

    在使用.NET语言绑定的代码中,看起来像这样:

    string currentHandle = driver.CurrentWindowHandle;
    ReadOnlyCollection<string> originalHandles = driver.WindowHandles;
    // Cause the popup to appear
    driver.FindElement(By.XPath("//*[@id='webtraffic_popup_start_button']")).Click();
    // WebDriverWait.Until<T> waits until the delegate returns
    // a non-null value for object types. We can leverage this
    // behavior to return the popup window handle.
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
    string popupWindowHandle = wait.Until<string>((d) =>
    {
        string foundHandle = null;
        // Subtract out the list of known handles. In the case of a single
        // popup, the newHandles list will only have one value.
        List<string> newHandles = driver.WindowHandles.Except(originalHandles).ToList();
        if (newHandles.Count > 0)
        {
            foundHandle = newHandles[0];
        }
        return foundHandle;
    });
    driver.SwitchTo().Window(popupWindowHandle);
    // Do whatever you need to on the popup browser, then...
    driver.Close();
    driver.SwitchToWindow(currentHandle);
    

    或者,如果您使用的是.NET绑定,则有一个 PopupWindowFinder webDriver.Support程序集中的类专门为您执行这些操作.使用该类要简单得多。

    // Get the current window handle so you can switch back later.
    string currentHandle = driver.CurrentWindowHandle;
    // Find the element that triggers the popup when clicked on.
    IWebElement element = driver.FindElement(By.XPath("//*[@id='webtraffic_popup_start_button']"));
    // The Click method of the PopupWindowFinder class will click
    // the desired element, wait for the popup to appear, and return
    // the window handle to the popped-up browser window. Note that
    // you still need to switch to the window to manipulate the page
    // displayed by the popup window.
    PopupWindowFinder finder = new PopupWindowFinder(driver);
    string popupWindowHandle = finder.Click(element);
    driver.SwitchTo().Window(popupWindowHandle);
    // Do whatever you need to on the popup browser, then...
    driver.Close();
    driver.SwitchToWindow(currentHandle);
    

  • 2021-1-12
    2 #

    如果最后打开的窗口是您的目标,则只需在单击后执行以下操作

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

    EDIT

    //You may need to go back to parent window to perform additional actions;
    // to the new window
    driver.SwitchTo().Window(driver.WindowHandles.ToList().Last());
     // to the new window
    driver.SwitchTo().Window(driver.WindowHandles.ToList().First());
    //or
    driver.SwitchTo().DefaultContent();
    

  • 2021-1-12
    3 #

    我有一些您可能想要的代码.最快的解决方案是使用Popup Finder,但我也制定了自己的方法.我永远不会依赖于"窗口句柄"所在的顺序来选择适当的窗口.弹出窗口查找器:

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

    我的自定义方法.基本上,您将要单击的元素,webdriver和可选的时间传递给它,然后单击该元素。

    它将使用您当前的所有句柄并列出一个列表.它使用该列表来消除先前已存在的窗口不被意外切换到的情况.然后,单击启动新窗口的元素.单击后总应该有某种程度的延迟,因为什么都不会立即发生.然后,它会创建一个新列表,并将其与旧列表进行比较,直到找到新窗口或循环终止为止.如果找不到新窗口,它将返回null,因此,如果您有一个不稳定的webelement并不总是有效,则可以进行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;
        }
    

  • JavaFX MySQL连接示例请
  • jsf 2:在资源束中本地化枚举值