新窗口处理在IE中消失,无法切换到新窗口

问题描述 投票:1回答:2

我正在Internet Explorer 10中使用带有C#的最新版本的Selenium(2.37.0)(使用最新的32位InternetExplorerDriver,2.37.0)登录到网页,单击打开新窗口的按钮,然后将焦点更改到新窗口。

最初我在Firefox中使用此代码,并且每次都可以使用:

// Get handle for original window
string parentHandle = driver.CurrentWindowHandle;

// Click on button for new window
driver.FindElement(By.Id("buttonForNewWindow")).Click();

// Get list of all window handles
ReadOnlyCollection<string> allWindowHandles = driver.WindowHandles;

// Loop over all handles and switch to new child window
foreach (string handle in allWindowHandles)
{
    if (handle != parentHandle)
    {
        driver.SwitchTo().Window(handle);
    }
}

但是这在Internet Explorer中不起作用。

我已经指出了问题所在。在打开新窗口之前,我使用driver.WindowHandles.Count获取窗口句柄的数量,并且(如预期的那样)它告诉我只有一个窗口句柄。然后,当我单击新窗口的按钮时,它再次告诉我,有两个窗口句柄。但是在代码到达driver.SwitchTo().Window(handle);的行之前,窗口句柄的数量已降为1,即使两个窗口仍然可见

所以以某种方式丢失了一个窗口句柄。我已经确认(使用一堆Console.WriteLine语句)被删除的窗口句柄是新的。我还使用了Stopwatch类来计时新窗口句柄的删除需要多长时间:

Stopwatch sw = new Stopwatch();

// Wait until the number of windows has changed from 1 to 2
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until((_driver) => { return _driver.WindowHandles.Count != windowsBefore; });

// Start stopwatch
sw.Start();

int numberOfWindows = driver.WindowHandles.Count;

while (numberOfWindows == 2)
{
    numberOfWindows = driver.WindowHandles.Count;
}

sw.Stop();

Console.Write("\nTime elapsed: " + sw.ElapsedMilliseconds + " ms");

运行几次后,我发现窗口句柄的数量通常回落到一个不到50毫秒。但是,有一次,窗把手持续了更长的时间。这是原始号码:

Time elapsed: 47 ms
Time elapsed: 31 ms
Time elapsed: 47 ms
Time elapsed: 2861 ms
Time elapsed: 30 ms

我也已经确认此问题在Firefox中不会发生。当我在Firefox中运行相同的代码时,我发现窗口句柄的数量从1变为2,并保持这种方式,应该如此。

似乎其他人也有这个问题This person发现,当他们打开新窗口并等待1000毫秒时,getWindowHandles()返回的值为1而不是2。并且Selenium Google Group上的this person似乎也遇到了同样的问题。

我的问题:鉴于新打开的窗口的句柄保持打开状态(通常)少于50毫秒,使用Selenium在Internet Explorer 10中切换到新窗口的最有效方法是什么?还是我应该采取其他措施来防止新的窗口句柄丢失?

c# internet-explorer selenium
2个回答
0
投票

只是想进行更新,以防其他人遇到同样的问题并找到此页面。我没有找到解决问题的方法,但是我想出了一种解决方法。

最初,我单击的链接打开了一个新窗口,我无法将Selenium导航到新窗口。相反,我要做的是浏览页面的源代码,找到我单击的按钮,然后找出该按钮指向的位置。如果它是一个简单的超链接(www.whatever.com / ...),那将是最容易的,但是它是一个Javascript函数。该Javascript函数使用一些固定字符和一些变量来构建超链接;例如:

link(username, date) = "http://www.google.com/user=" + username + "?date=" + date;

因此,与本示例一起,我只是弄清楚了要输入的变量(用户名,日期等),自己构建了URL,并直接导航到它。因此,我什至根本不必打开并导航到新窗口。


0
投票

这是由于Internet Explorer中的安全设置不正确。您需要清除“ Internet选项”对话框“安全性”选项卡中四个区域中的每个区域的“启用保护模式”复选框。四个区域必须匹配。

  1. 打开Internet Explorer。
  2. 单击工具图标或按Alt-X。
  3. 单击Internet选项菜单项或Alt-o。
  4. 单击安全性选项卡。
  5. 单击Internet图标。
  6. 清除启用保护模式复选框。
  7. 单击本地Intranet图标。
  8. 清除启用保护模式复选框。
  9. 对受信任的站点和受限制的站点重复。
  10. 单击应用按钮。
  11. 确认安全风险弹出,接受该风险。
  12. 关闭Internet Explorer。

现在,InternetExplorerDriver应该显示正确数量的窗口句柄,并且能够在窗口之间切换。

© www.soinside.com 2019 - 2024. All rights reserved.