在带有叠加层的页面上使用phantomjs捕获屏幕截图

时间:2016-01-05 13:40:59

标签: javascript phantomjs

我试图将网站的特定div捕获到屏幕截图中,以方便我必须做的一些繁重的工作。到目前为止,我使用的是我在这个完全相同的网站上找到的代码,有点正在工作:

var page = require('webpage').create();

page.open('http://www.example.org', function() {
  // being the actual size of the headless browser
  page.viewportSize = { width: 1440, height: 900 };

  var clipRect = page.evaluate(function(){
    return document.querySelector("div.example").getBoundingClientRect();
  });

  page.clipRect = {
    top:    clipRect.top,
    left:   clipRect.left,
    width:  clipRect.width,
    height: clipRect.height
  };

  page.render('google.png');
  phantom.exit();
});

这实际上有效,但我有两个问题:

1)页面在第一次访问时有一个叠加,一个弹出窗口出现在屏幕截图上。 2)图像显然是在需要渲染时下载的(它们仅在网页上滚动时出现)

所以最后我最终得到了这样的东西: problem

我对phantomjs没有经验,所以我不知道如何解决这个问题。在截取屏幕截图之前消除叠加DIV并以某种方式强制图像加载可能有效,但我不知道如何实际编码它。

非常感谢!

1 个答案:

答案 0 :(得分:5)

您可以通过编程方式删除叠加元素,设置页面滚动位置(以像素为单位),等待几秒钟以加载图像,然后制作屏幕截图。

var page = require('webpage').create();

page.viewportSize = { width: 1440, height: 900 };

page.open('http://www.jovago.com', function() {

    // jQuery is used at the target site
    page.evaluate(function(){
        $("#overlay, #modal").remove();
    });

    // Simulate scrolling down
    page.scrollPosition = {
        top: 1400,
        left: 0
    };    

    var clipRect = page.evaluate(function(){
        return document.querySelector("div.top-destinations-homepage.promo-banners-box").getBoundingClientRect();
    });

    page.clipRect = {
        top:    clipRect.top,
        left:   clipRect.left,
        width:  clipRect.width,
        height: clipRect.height
    };

    // Wait 10 seconds for images to download
    setTimeout(function(){
          page.render('jovago.png');
          phantom.exit();
    }, 10000);

});