当前位置: 代码迷 >> JavaScript >> PhantomJS page.injectJs不起作用
  详细解决方案

PhantomJS page.injectJs不起作用

热度:67   发布时间:2023-06-12 13:48:07.0

我目前正在尝试通过URL将页面源代码写入文本文件。 一切正常,但我想另外注入一个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();

不要混淆和 。

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

includeJs(url, callback)从指定的URL加载一个远程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

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


如果你仍然想使用injectJs()代替includeJs()例如,由于其同步性),那么你就需要外部JavaScript文件下载到本机,然后你可以使用injectJs()

  相关解决方案