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

Selenium脚本在切换窗口句柄时停止

蒋昊天
2023-03-14

我面临的问题与这里描述的完全相同

但它是一个封闭的线程。在win7 IE 11上使用selenium webDrive2.48.2。情况是这样的,我有一个测试,点击一个按钮,应该打开一个新实验,这个新实验在chrome上的新选项卡和火狐上的同一个选项卡中打开,但是在运行IE11时在新窗口中打开通过硒。但是奇怪的是,当浏览器手动打开而不是通过selenium脚本打开时,它不会在新窗口中打开。代码所做的是,它检查新句柄是否被打开,找到新句柄,然后将窗口句柄切换到新句柄。这里是c#代码片段。

 private static TResult TriggerAndWaitForNewWindow<TResult>(PageObject pageObject, Action action, int timeout = 30)
  where TResult : PageObject, new()
{
  IParent parent = pageObject.Driver;
  List<String> existingHandles = pageObject.Driver.WindowHandles.ToList();
  action();

  string popupHandle = Wait.Until(() =>
  {
    string foundHandle = null;
    List<string> currentHandles = pageObject.Driver.WindowHandles.ToList();
    var differentHandles = GetDifference(existingHandles, currentHandles);

    if (differentHandles.Count > 0)
    {
      Boolean hasSomeLength = differentHandles[differentHandles.Count-1].Length > 1;

      if (hasSomeLength)
        foundHandle = differentHandles[differentHandles.Count - 1];      
    }
    return foundHandle;
  }, "Waiting for new Window Handle to appear", timeout, 2000);

  // Init the new page object but override the window handle
  TResult page = PageObject.Init<TResult>(parent);
  page.WindowHandle = popupHandle;

  page.SwitchToMyWindow();
  return page;
}
private static List<String> GetDifference(List<string> existingHandles, List<string> currentHandles)
{
        System.Threading.Thread.Sleep(15000);
        return currentHandles.Except(existingHandles).ToList();
}

在IE11上此函数内停止

public Boolean SwitchToMyWindow()
{    
  try
  {
    String windowHandle = this.WindowHandle; // must be the old handle
    try
    {
      if (this.Driver.CurrentWindowHandle == windowHandle)
      {
        Log.Info("No need to cswitch window");
        return true;
      }
    }
    catch(Exception e)
    {
      Log.Warn("We have no current driver window, must have been closed");
    }

    Log.Info("Switching to Window Handle {0}", this.Driver.CurrentWindowHandle);
    this.Driver.SwitchTo().Window(windowHandle); <---- Halts here on IE11
    //Pause.milliSeconds(500);
            Boolean switched = Wait.Until(() =>
              this.Driver.CurrentWindowHandle == windowHandle, "Waiting for my window handle to be the active one", 5, 1000);
        }
  catch (OpenQA.Selenium.WebDriverTimeoutException tEx)
  {

  }
  return true;
}

还有其他人面临过这个问题吗?如何解决呢?

共有1个答案

须衡虑
2023-03-14

您能否验证Selenium是否支持您的目标操作系统?您的目标操作系统可能不完全支持Selenium。

请查看以下链接了解更多详情。http://grokbase.com/t/gg/webdriver/1267fdkgaa/openqa-selenium-nosuchwindowexception-with-ie9-and-windows-2008

 类似资料:
  • 我正在测试一个包含多个webview/页面的webview应用程序。为了获得webviews,我做了以下工作: 它返回一个窗口索引数组,这些索引数组类似于

  • 我已经编写了一个Ruby脚本来自动化使用IE的一些用户操作。我正在为IE使用Selenium Web驱动程序。下面是我的代码。 在点击一个按钮后,会打开一个新页面。现在,当我尝试切换到新窗口时,我得到以下错误。 我试着通过修改防火墙和为端口5555添加规则来解决这个错误。即便如此,问题仍然存在。我发现了一些关于这方面的问题,但大多数都与Java或.NET有关。如何解决此错误?有人能给我指个正确的方

  • 问题内容: 我正在尝试在JPanel中嵌入HWND(窗口句柄)。 实际上,我可以将HWND嵌入到JFrame中,但是嵌入式窗口始终位于其他组件的顶部,因此无法移动它。如果尝试删除我的JFrame的所有子组件,则HWND将保留在那里。HWND似乎是在JFrame顶部绘制的,而不是其中之一。 要将HWND嵌入到JPanel中,我通过jna使用User32: 我用它来获取我的JFrame的HWND: 有

  • 目前,我已经开始使用Selenium2.0/Web-Driver为我工作的公司进行自动化测试。 目前我已经开发了大约20个测试,但是当我运行这些测试时,它们会为每个测试打开一个新的浏览器窗口。 我在注册测试用例中运行它,然后 在第二个测试用例中运行,我认为应该将焦点放回第一个窗口。 我还使用关闭正在创建的其他窗口,但我希望它们一开始就不打开。