PhantomJS page.injectJs不起作用

时间:2015-07-16 20:43:40

标签: javascript phantomjs

我目前正在尝试通过网址将页面源代码写入文本文件。一切都运作良好,但我想另外注入一个JavaScript文件。问题是文件没有正确包含。只有最后加载的页面,但其他页面不完整。

//phantomjs C:\PhantomJS\Script\test1.js

var fs = require('fs');
var numeroEpisode = 0;
var maxEpisode = 10;
var fichierLien = fs.read('C:\\PhantomJS\\Fichier\\lien.txt');
var ListeLien = fichierLien.split(/[\n]/);

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

function GetPage()
{
    if (numeroEpisode > maxEpisode) 
    { 
        phantom.exit();
    }
    page.open(ListeLien[numeroEpisode], function(status)
    {
        if(status !== 'success')
        {
            console.log('Impossible de charger la page.');
        }
        else
        {
            console.log('URL: '+ListeLien[numeroEpisode]+'');
            page.injectJs('http://mylink.com', function() { });
            var path = 'C:\\PhantomJS\\Fichier\\episode_'+numeroEpisode+'.html';
            fs.write(path, page.content, 'w');
            setTimeout(GetPage, 15000); // run again in 15 seconds
            numeroEpisode++;
        }   
    });
}
GetPage();

1 个答案:

答案 0 :(得分:0)

不要混淆page.injectJs()page.includeJs()

injectJs(filename)将本地JavaScript文件加载到页面中并同步评估它。

includeJs(url, callback)从指定的网址加载远程JavaScript文件并对其进行评估。由于它必须请求远程资源,因此这是异步完成的。操作完成后立即调用传递的回调。如果您不使用回调,您的代码很可能会在包含远程JavaScript之前运行。使用该回调:

page.includeJs('http://mylink.com', function() {
    var path = 'C:\\PhantomJS\\Fichier\\episode_'+numeroEpisode+'.html';
    fs.write(path, page.content, 'w');
    numeroEpisode++;
    setTimeout(GetPage, 15000); // run again in 15 seconds
});

由于您加载的JavaScript会更改页面上的某些内容,因此您可能需要在所有页面脚本运行后加载它。如果这是一个JavaScript重页面,那么你需要稍等一下。您可以等待一段时间:

setTimeout(function(){
    page.includeJs('http://mylink.com', function() {
        //...
    });
}, 5000); // 5 seconds

或利用waitFor等待,直到出现表示页面已完全加载的元素。这有时候非常棘手。

如果您仍想使用injectJs()而不是includeJs()(例如由于其同步性质),那么您需要将外部JavaScript文件下载到您的计算机,然后您可以使用{{ 1}}。