从phantom.js截图保存?(Where are screenshots from phanto

2019-08-17 07:17发布

只需通过自制软件在我的Mac上安装后,开始接触Phantom.js。

我想出来的例子通过保存的网站截图https://github.com/ariya/phantomjs/wiki/Quick-Start

var page = require('webpage').create();
page.open('http://google.com', function () {
    page.render('google.png');
    phantom.exit();
});

但我没有看到任何地方的图像。 他们将在同一目录中.js文件?

Answer 1:

PhantomJS通常呈现图像的同一目录中,你正在运行的脚本。 所以,是的,它应该是在同一个目录中,你正在运行使用PhantomJS JavaScript文件。

编辑

看来,那个特定的例子是有缺陷的。 问题是, page.render(...); 需要一些时间来渲染页面,但是你打电话phantom.exit()它已经完成渲染之前。 我能够这样做是为了获得预期的输出:

var page = require('webpage').create();
page.open('http://google.com', function () {
    page.render('google.png');
    setTimeout(function() { phantom.exit(); }, 5000) // wait five seconds and then exit;
});

不幸的是,这是不理想的,所以我能拿出的东西,这是一个发好。 我说“头发”,因为我基本上轮询时看到的页面呈现完毕:

var done = false; //flag that tells us if we're done rendering

var page = require('webpage').create();
page.open('http://google.com', function (status) {
    //If the page loaded successfully...
    if(status === "success") {
        //Render the page
        page.render('google.png');
        console.log("Site rendered...");

        //Set the flag to true
        done = true;
    }
});

//Start polling every 100ms to see if we are done
var intervalId = setInterval(function() {
    if(done) {
        //If we are done, let's say so and exit.
        console.log("Done.");
        phantom.exit();
    } else {
        //If we're not done we're just going to say that we're polling
        console.log("Polling...");
    }
}, 100);

上面的代码工作,因为回调不立即执行。 因此,投票代码将启动并开始调查。 然后执行回调的时候,我们要检查一下网页的状态(我们只想渲染,如果我们能够成功地加载网页)。 然后我们渲染页面,并设置轮询我们的代码检查上,该标志true 。 所以轮询码下次运行时,该标志为true ,所以我们退出。

这看起来是与PhantomJS的方式运行有问题webpage#render(...)调用。 我怀疑这是一个非阻塞调用,但根据笔者在这个问题上 ,它是一个阻塞调用。 如果让我猜的话,也许渲染的行为是一个阻塞调用,但这并渲染可能会在数据移交给另一个线程,它处理持久化数据到磁盘(所以这部分可能是一个非代码-blocking调用)。 不幸的是,这个电话可能还在执行时,又回到主脚本并执行执行phantom.exit()这意味着上述异步代码从来没有得到机会完成它在做什么。

我能找到的PhantomJS论坛,与交易后你描述 。 我看不出已提交的任何问题,所以如果你愿意,你可以继续发布一个。



Answer 2:

我有同样的问题,因为这个帖子的作者,并为我工作的代码示例没有。 那种迷惑有在Phantom.js第二个示例文件无法正常工作。 在Snow Leopard上使用家酿安装。

我发现了一个工作示例

var page = require("webpage").create();
var homePage = "http://www.google.com/";
page.settings.javascriptEnabled = false;
page.settings.loadImages = false;
page.open(homePage);
page.onLoadFinished = function(status) {
  var url = page.url;
  console.log("Status:  " + status);
  console.log("Loaded:  " + url);
  page.render("google.png");
  phantom.exit();
};


Answer 3:

只是一个快速的帮助谁到这里来寻找其中PhantomJS或CasperJS的屏幕截图保存的目录人:这是在默认脚本目录。 但是,你有控制权。

如果你想控制他们保存你可以改变文件名,如下所示:

page.render('screenshots/google.jpg'); // saves to scriptLocation/screenshots/
page.render('/opt/google.jpg'); // saves to /screenshots (in the root)

或者,如果你使用CasperJS你可以使用:

casper.capture('/opt/google.jpg',
        undefined,
        { // imgOptions
            format: 'jpg',
            quality: 25
        }); 

希望这样可以节省别人的麻烦!



Answer 4:

我不知道,如果事情已经改变,但在例如http://phantomjs.org/screen-capture.html罚款为我工作:

var page = require('webpage').create();
page.open('http://github.com/', function() {
  page.render('github.png');
  phantom.exit();
});

我正在phantomjs-2.1.1-窗口。

然而,是什么促使我这个线程最初的图像文件从来没有让我的磁盘就像原来的问题上创建。 我想这是某种安全问题,所以我登录到虚拟机,并通过把一切在同一目录开始。 我用一个批处理文件来揭开序幕phantomjs.exe我.js文件传过来的参数文件。 对于所有在我的虚拟机在同一目录中的文件,它的工作太棒了。 经过反复试验,我发现我的批处理文件必须是在同一目录作为我的.js文件。 现在一切都很好,我的主机上也是如此。

因此,在总结...这可能是一个安全相关的问题对我来说。 无需添加任何超时。

我的回答原来的问题是,如果你拥有了一切设置正确,该文件将在同一目录中phantomjs.exe运行的.js文件。 我试图指定为图像文件的完全合格的路径,但似乎并没有工作。



Answer 5:

根本原因是page.render()可能不准备即使在onLoadFinished()事件来呈现图像。 您可能需要page.render向上前等待几秒钟()可以成功。 我发现呈现PhantomJS图像的唯一可靠的方法是反复调用page.render(),直到该方法返回true,表明它成功描绘的图像。

解:

var page = require("webpage").create();
var homePage = "http://www.google.com/";

page.onLoadFinished = function(status) {
  var rendered, started = Date.now(), TIMEOUT = 30 * 1000; // 30 seconds
  while(!((rendered = page.render('google.png')) || Date.now() - started > TIMEOUT));
  if (!rendered) console.log("ERROR: Timed out waiting to render image.")
  phantom.exit();
};

page.open(homePage);


Answer 6:

从偷rasterize.js例子 ,它比我接受的答案更可靠。

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

page.open('http://localhost/TestForTest/', function (status) {
    console.log("starting...");
    console.log("Status: " + status);

    if (status === "success") {
        window.setTimeout(function () {
            page.render('myExample.png');
            phantom.exit();
        }, 200);
    } else {
        console.log("failed for some reason.");
    }
});


Answer 7:

很多在这里很好的建议。 有一两件事我想补充:

我运行一个phantomjs码头工人形象,默认用户是“phantomjs”,没有根。 因此,我试图写,我并没有权限上(这是泊坞窗主机上的PWD)的位置...

> docker run -i -t -v $(pwd):/pwd --rm wernight/phantomjs touch /pwd/foo.txt
touch: cannot touch '/pwd/foo.txt': Permission denied

没有错误的所有运行上面的代码(一个或多个),但如果他们没有权限写入到目标,然后他们会默默地忽略的请求......

因此,例如,以@ vivin-paliath的代码(目前接受的答案):

var done = false; //flag that tells us if we're done rendering

var page = require('webpage').create();
page.open('http://google.com', function (status) {
    //If the page loaded successfully...
    if(status === "success") {
        //Render the page
        page.render('google.png');
        console.log("Site rendered...");

        //Set the flag to true
        done = true;
    }
});

//Start polling every 100ms to see if we are done
var intervalId = setInterval(function() {
    if(done) {
        //If we are done, let's say so and exit.
        console.log("Done.");
        phantom.exit();
    } else {
        //If we're not done we're just going to say that we're polling
        console.log("Polling...");
    }
}, 100);

而作为默认的用户产生运行它:

docker run -i -t -v $(pwd):/pwd -w /pwd --rm wernight/phantomjs phantomjs google.js 
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Polling...
Site rendered...
Done.

但是,没有google.png并没有错误。 简单地增加-u root到泊坞窗命令解决了这一点,我得到的google.png在我的CWD。

为了完整起见,最后的命令:

搬运工运行-u根-i -t -v $(PWD):/密码-w /密码--rm wernight / phantomjs phantomjs google.js



文章来源: Where are screenshots from phantom.js saved?