2013-05-31 2 views
45

Существует сайт, который я пытаюсь очистить, который сначала загружает html/js , изменяет поля ввода формы с помощью js, а затем POST. Как я могу получить окончательный вывод html на странице POSTed?сохранить html вывод страницы после выполнения javascript страницы

Я попытался сделать это с помощью phantomjs, но у него есть только возможность рендеринга файлов изображений. Гуглинг вокруг предполагает, что это должно быть возможно, но я не могу понять, как это сделать. Моя попытка:

var page = require('webpage').create(); 
var fs = require('fs'); 
page.open('https://www.somesite.com/page.aspx', function() { 
    page.evaluate(function(){ 

    }); 

    page.render('export.png'); 
    fs.write('1.html', page.content, 'w'); 
    phantom.exit(); 
}); 

Этот код будет использоваться для клиента, я не могу ожидать, что он установить слишком много пакетов (nodejs, casperjs и т.д.)

Благодаря

+0

Нужно ли использовать Python? Является ли вариант Java? – OakNinja

+0

Вы также можете получить содержимое страницы с помощью 'document.outerHTML' –

ответ

4

Когда я скопировал код непосредственно, и изменил URL для www.google.com, он работал отлично, с двумя файлами, сохраненными:

  • 1.html
  • export.png

Имейте в виду, что файлы будут записаны в папку, вы запустите скрипт из не там, где ваш файл .js находится

-1

один подход, который приходит на ум, кроме того, используя обезглавленного браузер очевидно, для имитации вызовов ajax и для ансамбля постпроцесса страницы, запроса по запросу .. это, однако, часто бывает сложным и должно использоваться в качестве последнего средства, если вы действительно не хотите копать код javascript.

-8

Это можно легко сделать с помощью некоторого кода php и javascript использовать fopen() и fwrite() и эту функцию для его сохранения: var generatedSource = new XMLSerializer(). SerializeToString (document);

0

Я пробовал несколько подходов к подобной задаче и наилучшие результаты, полученные с помощью Selenium.

Прежде чем я попробовал PhantomJS и Cheerio. Фантом слишком часто рушился, выполняя JS на странице.

0

Я использую CasperJS для запуска тестов с помощью PhantomJS. Я добавил этот код на tearDown функции:

var require = patchRequire(require); 
var fs = require('fs'); 

casper.test.begin("My Test", { 
    tearDown: function(){ 
     casper.capture("export.png"); 
     fs.write("1.html", casper.getHTML(undefined, true), 'w'); 
    }, 
    test: function(test){ 
     // test code 

     casper.run(function(){ 
      test.done(); 
     }); 
    } 
}); 

См документы для capture и getHTML.

23

Выходной код у вас есть, но есть проблема с синхронизацией. Линии вывода, которые у вас есть, выполняются до того, как страница будет загружена. Вы можете связать в onLoadFinished Callback, чтобы узнать, когда это произойдет. См. Полный код ниже.

var page = new WebPage() 
    var fs = require('fs'); 

    page.onLoadFinished = function() { 
     console.log("page load finished"); 
     page.render('export.png'); 
     fs.write('1.html', page.content, 'w'); 
     phantom.exit(); 
    }; 

    page.open("http://www.google.com", function() { 
     page.evaluate(function() { 
     }); 
    }); 

При использовании сайт, как Google, это может быть обманчивым, так как он загружает так быстрее, что часто можно выполнить Screengrab инлайн, как у вас есть. Сроки - сложная вещь в phantomjs, иногда я тестирую с помощью setTimeout, чтобы определить, является ли время проблемой.

+8

Зачем вам нужно дважды задавать' onLoadFinished'? – Max

+0

Что относительно образов и стилей? – Toolkit

1

После 2 долгих дней борьбы и разочарования я, наконец, получил мою аналогичную проблему.Что было трюком в примере waitfor.js в PhantomJS' official website. Будь счастлив!

"use strict"; 

function waitFor(testFx, onReady, timeOutMillis) { 
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s 
     start = new Date().getTime(), 
     condition = false, 
     interval = setInterval(function() { 
      if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { 
       // If not time-out yet and condition not yet fulfilled 
       condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code 
      } else { 
       if(!condition) { 
        // If condition still not fulfilled (timeout but condition is 'false') 
        console.log("'waitFor()' timeout"); 
        phantom.exit(1); 
       } else { 
        // Condition fulfilled (timeout and/or condition is 'true') 
        console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); 
        typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled 
        clearInterval(interval); //< Stop this interval 
       } 
      } 
     }, 250); //< repeat check every 250ms 
}; 


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

// Open Twitter on 'sencha' profile and, onPageLoad, do... 
page.open("http://twitter.com/#!/sencha", function (status) { 
    // Check for page load success 
    if (status !== "success") { 
     console.log("Unable to access network"); 
    } else { 
     // Wait for 'signin-dropdown' to be visible 
     waitFor(function() { 
      // Check in the page if a specific element is now visible 
      return page.evaluate(function() { 
       return $("#signin-dropdown").is(":visible"); 
      }); 
     }, function() { 
      console.log("The sign-in dialog should be visible now."); 
      phantom.exit(); 
     }); 
    } 
}); 
Смежные вопросы