Selenium,如何在不打开浏览器的情况下拍摄截图?

时间:2016-02-01 22:57:30

标签: c# .net selenium selenium-webdriver

我想使用Selenium截取网页截图。 我注意到采取屏幕截图的操作需要打开Web浏览器本身。 尝试使用webDriver.Navigate().GoToUrl("http://www.google.com");更改webDriver.Url = "http://www.google.com";,但没有成功, 我甚至试图在没有网址的情况下离开它,浏览器打开了“数据”的网址,现在我明白其他东西会让浏览器打开。

private void button1_Click(object sender, EventArgs e)
{
   var capabilitiesInternet = new 
       OpenQA.Selenium.Remote.DesiredCapabilities();
   capabilitiesInternet.
       SetCapability("ignoreProtectedModeSettings", true);
   IWebDriver webDriver = new ChromeDriver();
   webDriver.Navigate().GoToUrl("http://www.google.com");

   Screenshot screenshot = ((ITakesScreenshot)webDriver).GetScreenshot();
   screenshot.SaveAsFile("E:\\ScreenShot.png", 
       System.Drawing.Imaging.ImageFormat.Png);
   webDriver.Quit();
}

2 个答案:

答案 0 :(得分:1)

不 - 您需要让WebDriver请求页面,否则它怎么知道要生成什么屏幕截图?

如果你想避免一个真实的,慢的'浏览器启动并打开一个窗口,您应该考虑无头地运行该浏览器,如下所示:

How do I run Selenium in Xvfb?

或者查看无头WebKit浏览器PhantomJS(或者SlimerJS),并使用与现在几乎完全相同的WebDriver API,让它生成您的屏幕截图' in-存储器':

Phantomjs - take screenshot of a web page

只需替换:

WebDriver webDriver = new ChromeDriver();

使用:

WebDriver webDriver = new PhantomJSDriver();

(显然需要在本地安装应用程序)

修改:请注意,此操作的典型用例是“隔夜”'从无头CI服务器运行时的持续集成/连续测试。但是,它可以非常容易地添加到其他工作流程中,例如,用于视觉回归测试和简单的一次性检查。

答案 1 :(得分:0)

有多种方法可以解决这个问题:

  • 有铬标志--no-startup-window,应该打开没有窗口的铬。我试了一下,但它不起作用,但是,你可以试一试。
  • 使用hacks - 有一种方法可以在没有看到它的情况下启动chrome,它运行良好。只需使用--window-position=-9999,0,请注意,TakeScreenShot()在我的经验中有一些奇怪的异常 - 它集中了窗口,它随机地耗尽了内存等等。我最后做的是我写了chrome扩展,可以截取屏幕截图并通过JS将它们返回到selenium。