获取IE浏览器截图返回黑色图像

21

我正在构建一个控制台应用程序,将连接到网络中的不同计算机并对网页进行浏览器截图。
使用 Selenium 2.47.1 设置服务器和节点。控制台应用程序在设置为 Selenium Hub 的 PC 上运行。
从 Hub 计算机中的 Firefox、Chrome 和 IE 中截图效果良好。
在远程计算机中 Firefox 的截图也很好。
但是使用 IE 会返回一张黑色的图片。
Hub 和 Node 计算机都运行在 Windows 7 64 位上,都有安装 IE11。我在两个 PC 上都使用了 64 位的 IEDriver。
Node 计算机没有被锁定。

using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Support.UI;

static void Main(string[] args)
 {
   IWebDriver NewDriver = null;
   using (NewDriver = new RemoteWebDriver(new Uri("http://172.165.10.111/wd/hub"), DesiredCapabilities.InternetExplorer()))
    {
      if (NewDriver != null)
       {
         NewDriver.Navigate().GoToUrl("http://www.google.com");
         NewDriver.Manage().Window.Size = new Size(1804, 1096);
         Screenshot ss = ((ITakesScreenshot)NewDriver).GetScreenshot();
         ICapabilities capabilities = ((RemoteWebDriver)NewDriver).Capabilities;
         ss.SaveAsFile(@"C:\Path\123.png", ImageFormat.Png);
         NewDriver.Quit();
       }
    }
 }
8个回答

11
由于您的屏幕被锁定,或正在运行屏幕保护程序。

您需要关闭屏幕保护程序并将 Windows 配置为在不使用时从不锁定。关闭屏幕保护程序:

  • 单击“开始”按钮。
  • 单击“控制面板”。
  • 在搜索框中键入“屏幕保护程序”。
  • 单击“打开或关闭屏幕保护程序”。

然后修改您的屏幕保护程序设置。确保取消选中“恢复时显示登录屏幕”。

当您进入控制面板时,最好检查一下电源选项,并确保计算机不会在设置的一段时间后进入睡眠或关机状态。

您还将需要使用 VNC 或远程协助来访问 GUI。如果您使用 RDP 登录,它将锁定当前已登录的本地用户的屏幕,并且在断开连接时再次锁定屏幕。

最后,请不要使用 64 位 IE 驱动程序,应该使用 32 位版本。没有人使用 64 位版本的 IE(即使他们拥有 64 位能力的机器)。

****** 编辑 添加了更多来自可信赖来源的信息 ******

以下是 Selenium 用户论坛上一篇帖子的链接,其中 Jim Evans(编写 IEDriver 二进制文件的开发人员)解释了这个问题:

http://selenium.10932.n7.nabble.com/IE-Screenshots-are-black-when-not-connected-via-Remote-Desktop-to-the-VM-hosting-an-IE-Node-td37004.html

特别是这句话关于在从 RDP 实例断开连接时拍摄屏幕截图的问题:

 

这是一个已知的限制。目前没有已知的解决方法。向 Microsoft 抱怨。他们是制作 PrintWindow API 的人(该 API 是用来捕获屏幕截图的工具)。

正确的API在获取屏幕截图时使用),它的行为是这样的。要么这样,要么如果您发现一种使其工作的方法,欢迎提交一个补丁。

他在博客中更详细地解释了屏幕截图代码的工作方式:

http://jimevansmusic.blogspot.co.uk/2014/09/screenshots-sendkeys-and-sixty-four.html

具体来说:

IE驱动程序使用PrintWindow API函数进行屏幕截图。 PrintWindow只能截取任何给定窗口的可见部分,这意味着为了获得全页截图 (WebDriver API所需),窗口必须足够大以显示整个页面而没有滚动条。 但是,Windows不允许窗口调整大小超过可见屏幕分辨率。当我们请求IE调整大小时, 会在调整大小事件上发送WM_GETMINMAXINFO消息,以便IE可以确定窗口可能有多大。 通过用钩子拦截该消息并修改最大值,我们可以欺骗IE认为窗口可以被调整到超出屏幕分辨率的大小。


2

看起来这可能是配置方面的已知问题:

https://code.google.com/p/selenium/issues/detail?id=3536

根据@ShubhasmitGupta之前提到的,当桌面被锁定时,IE驱动程序会输出黑屏截图(我假设这与DWM / Explorer未渲染窗口有关)。

有一个解决办法,涉及在通过RDP连接到目标计算机时不锁定它。基本上,您需要创建一个名为disconnect.bat的文件,其内容如下:

tscon rdp-tcp#0 /dest:console

我不确定这应该在何时运行,但是这个概念是为了防止通过远程桌面连接时测试计算机被锁定。如果有帮助的话,太棒了;我自己还没有能够测试这种解决方法并弄清如何设置它。也许有人可以写一个更简洁的答案。


远程计算机没有被锁定,我认为那个解决方法不够全面,也不想在我的C#代码中使用它。 - sukesh

1
打开服务控制管理器--您可以按Windows键+R(运行)并输入services.msc,然后按<ENTER>,它将启动。
找到该服务,右键单击并从上下文菜单中选择属性允许服务与桌面交互 现在,选择“登录”选项卡。 您希望确保选中“允许服务与桌面交互”的复选框。
您可以在下面的图像中看到它。 注意: 我没有那个服务,所以我只是在示例图片中选择了另一个。

enter image description here


0

你可以尝试删除下面这行代码

//NewDriver.Manage().Window.Size = new Size(1804, 1096);

请将您的浏览器最大化。
NewDriver.Manage().Window.Maximize();

0

我一直有一个隐秘的怀疑,即IE在渲染时已经使用了DirectX一段时间,而this article显然表明情况确实如此...这就解释了为什么你会遇到问题,因为基于GDI的屏幕截图无法与DirectX表面配合使用。

我并不是说这是绝对的...只是一种直觉。


0

我之前也遇到了同样的问题,虽然我并不完全理解这个问题,但基本上是因为执行selenium的进程运行在系统帐户下,因此IE GUI仅在会话0中可见,而会话1仅显示黑屏。

对我有效的解决方案是在远程主机上创建一个本地用户帐户,保持该用户永久登录并解锁,以便他们有一个可用的交互式桌面,然后以该用户身份运行您的selenium应用程序/测试。我知道这不是理想的解决方案,但由于我们有几十个旧盒子闲置着,使用其中一个作为专用测试服务器并没有什么损失。希望这能在一定程度上帮助到您!

抱歉,我的声望不够高,无法将此添加为评论。


你能在描述的场景中使用Jenkins吗?如果可以,你是如何做到的? - AudioDroid

0

或许是一个有趣的提示...

...使用 Selenium 2.47.x 和 2.52.0 Jenkins,在服务器 Win 2008 上以 IE 7 模式(由网站设置)使用 RDP 和 IE 11。此外,我还连接了两个屏幕到我的 PC。

如果我从 Win Server 断开连接(未注销),我会遇到两种情况:

服务器上的 JAVA 程序会产生黑色框或真实的屏幕截图。区别仅在于客户端(Win 7)本地 RDP 配置中显示部分的 RDP 选项中的一个标记。

我没有英语显示,所以希望翻译可以理解。

配置详细信息为:“通过远程会话使用所有监视器”

如果设置了此标记,则会获得真实的屏幕截图。如果未设置此标记,则会出现黑色框。我无法解释为什么,但它就是这样运作...


-1

有时候,Windows 会因为机器/桌面长时间未使用而导致黑屏。


远程桌面在我的情况下没有被锁定。 - sukesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接