所以我正在使用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-121 #
- 2021-1-122 #
如果最后打开的窗口是您的目标,则只需在单击后执行以下操作
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-123 #
我有一些您可能想要的代码.最快的解决方案是使用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; }
webDriver绝对不会跟踪任何内容 检测哪个窗口实际上位于操作系统的前台,并且在打开新的浏览器窗口时不会自动切换.这意味着获取新打开的弹出窗口的句柄的正确方法是一个多步骤过程.为此,您将:
将当前焦点所在的窗口句柄保存到变量中,以便您 可以稍后再切换回去。
获取当前打开的窗口句柄的列表。
执行将导致新窗口出现的操作。
等待窗口句柄的数量增加1。
获取新的窗口句柄列表。
在手柄列表中找到新手柄。
切换到新窗口。
在使用.NET语言绑定的代码中,看起来像这样:
或者,如果您使用的是.NET绑定,则有一个
PopupWindowFinder
webDriver.Support程序集中的类专门为您执行这些操作.使用该类要简单得多。