2015-07-16 2 views
0

В настоящее время я пытаюсь написать исходный код страницы в текстовый файл по URL-адресу. Все работает хорошо, но я хочу дополнительно добавить файл JavaScript. Проблема в том, что файл не включается должным образом. Загружаются только последние загруженные страницы, но другие неполные.PhantomJS page.injectJs не работает

//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(); 

ответ

0

Не перепутать page.injectJs() и page.includeJs().

injectJs(filename): Загружает локальный файл JavaScript на страницу и оценивает его синхронно.

includeJs(url, callback): Загружает удаленный файл JavaScript с указанного URL-адреса и оценивает его. Поскольку он должен запрашивать удаленный ресурс, это выполняется асинхронно. Прошедший обратный вызов вызывается сразу после завершения операции. Если вы не используете обратный вызов, ваш код, скорее всего, будет запущен до того, как будет включен удаленный 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-файл на свой компьютер, а затем вы можете использовать injectJs().

+0

Мне нужно использовать injectJs, потому что файл и внешне, я хочу как-то изменить сайт, чтобы включить исходный код, который отличается по-разному. У меня все еще такая же проблема, первые страницы не загружаются полностью, может быть, что страницы загружаются и слишком быстро? Есть ли функция, ожидающая загрузки страницы перед другой загрузкой? В любом случае, спасибо за всю помощь, которую вы мне дали! – Culvanen

+0

Затем вам необходимо загрузить файл на свой компьютер. Только тогда вы можете использовать 'page.injectJs()'. Вы можете подождать еще немного с 'page.includeJs ('http://mylink.com', function() {setTimeout (function() {var path ...}, 5000)});' –

+0

Я прихожу на тест с includeJs и он работает, но проблема с страницей загрузки всегда здесь – Culvanen

Смежные вопросы