当前位置: 首页 > 知识库问答 >
问题:

selenium webdrivers中的弹出窗口

仲孙才捷
2023-03-14

所以我正在c#winform中使用硒火狐web驱动程序,我在下面有这段代码来获取弹出窗口的句柄,当您单击“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);

任何帮助将不胜感激

这就是弹出式菜单的样子。

共有3个答案

梁鸣
2023-03-14

我有一些你可能会喜欢的代码。最快的解决方法是使用弹出查找器,但我也有自己的方法。我不会依赖窗口句柄的顺序来选择合适的窗口。弹出窗口查找器:

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

我的定制方法。基本上,你传递给它你想要点击的元素,你的web驱动,以及可选的在你点击元素后等待搜索的时间。

它采用您当前的所有句柄并列出一个列表。它使用该列表来消除以前存在的窗口意外切换到。然后,它单击启动新窗口的元素。点击后应该总是有某种延迟,因为没有立即发生任何事情。然后它创建一个新列表,并将其与旧列表进行比较,直到找到新窗口或循环过期。如果它找不到新窗口,它将返回null,所以如果你有一个并不总是工作的令人讨厌的webelment,你可以做一个空值检查,看看开关是否工作。

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;
    }
蒋烨然
2023-03-14

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

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

编辑

//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();
芮祺
2023-03-14

WebDriver绝对不会进行任何跟踪来检测哪个窗口实际上在操作系统的前景中,并且在打开新的浏览器窗口时不会自动切换。这意味着获取新打开的弹出窗口的句柄的正确方法是多步骤过程。为此,您需要:

    < li >将当前获得焦点的窗口句柄保存到变量中,以便以后可以切换回它。 < li >获取当前打开的窗口句柄列表。 < li >执行将导致新窗口出现的操作。 < li >等待窗口句柄的数量增加1。 < li >获取新的窗口句柄列表。 < li >在句柄列表中查找新的句柄。 < li >切换到新窗口。

在代码中使用。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.SwitchTo().Window(currentHandle);

或者,如果您正在使用。在WebDriver中有一个< code>PopupWindowFinder类。专门为您执行这些操作而设计的支持组件。使用那个类要简单得多。

// 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();

// Switch back to parent window
driver.SwitchTo().Window(currentHandle);
 类似资料:
  • 问题内容: 有人可以建议我如何在Java Swing中实现弹出窗口。我希望弹出窗口是模式窗口(打开弹出窗口时用户无法返回主窗口)。 我尝试使用JDialog进行操作,但是它只允许一个小部件供用户输入,而我需要多个小部件。我在这里可能是错的,但这就是我能够做到的。 感谢你的帮助。 问题答案: 使用一个JDialog。可以添加的内容没有限制,可以将所需的内容添加到JDialog中(与使用JFrame时

  • 继承自 NativeObject 所有弹出式UI元素(pop-ups)的基类。弹出式UI元素比所有其他UI的层级都高,但不属于控件。某些弹出式UI只能弹出一次。 通过 “const {Popup} = require('tabris');” 引入该类 方法 close() 返回值: this 隐藏弹出窗。 open() 返回值: this 显示弹出窗。

  • 问题内容: 我想使用Firefox浏览器,使用RSelenium从网站下载文件。我正确地完成了所有操作(导航,选择正确的元素并写下我想要的内容);现在,我单击“下载”按钮,然后打开一个Firefox弹出窗口,并询问我是否要下载文件或“用…打开”。 不幸的是,由于隐私限制,我无法编写示例。 我的问题是:如何在需要时切换到弹出窗口/警报并单击“确定”? 我尝试了以下方法,但均未成功: 我也试过了 但是

  • Popup 是一种可以包含任何Html内容的弹出窗口,从App的主内容区域上弹出。 Popup 和其他所有的遮罩图层一样,是所谓的“临时视图”的一部分。 Popup 布局 Popup 布局相当简单. 你所需要做的就是将放到 body 里正确的位置上: <div class="modal modal-no-buttons"> ... <div class="popup"> An

  • 问题内容: 因此,我一直在用Qt为我的Python应用程序创建GUI。我现在遇到的情况是,按下按钮后,将执行适当的推迟操作,我们执行一些任务,然后需要打开一个单独的窗口,其中包含一两个东西。但是我似乎无法弄清楚如何创建这个新的单独窗口。谁能给我一个如何创建一个例子吗? 问题答案: 一个使您抓狂的常见错误是忘记将创建的弹出窗口的句柄存储在将保持活动状态的python变量中(例如,存储在主窗口的数据成

  • 问题内容: 我正在尝试在自举弹出窗口中显示HTML,但不知为何它不起作用。我在这里找到了一些答案,但这对我不起作用。如果我做错了事,请告诉我。 问题答案: 您不能使用,因为它属于它,所以它不起作用,请更改它,这一切都很好。 这是正在工作的 JSFiddle ,它向您展示了如何创建引导弹出窗口。 代码的相关部分如下: HTML: JavaScript: 顺便说一句,您始终至少需要启用弹出窗口。但是您