tipos - tablas dinamicas html javascript
guardar la salida html de la página después de la ejecución del javascript de la página (7)
Hay un sitio que estoy intentando eliminar, que primero carga un html / js modifica los campos de entrada del formulario utilizando js y luego POST. ¿Cómo puedo obtener la salida html final de la página POSTed?
Intenté hacer esto con phantomjs, pero parece que solo tiene una opción para renderizar archivos de imagen. Buscar en Google sugiere que debería ser posible, pero no sé cómo. Mi intento:
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();
});
Este código se usará para un cliente, no puedo esperar que él instale demasiados paquetes (nodejs, casperjs, etc.)
Gracias
Cuando copié su código directamente y cambié la URL a www.google.com, funcionó bien, con dos archivos guardados:
- 1.html
- export.png
Tenga en cuenta que los archivos se escribirán en la ubicación en la que se ejecuta el script, no en la ubicación del archivo .js
Después de 2 largos días de lucha y frustración, finalmente resolví mi problema similar. Lo que hizo el truco fue el ejemplo de waitfor.js en el sitio web oficial de PhantomJS . ¡Sea feliz!
"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();
});
}
});
Estoy usando CasperJS para ejecutar pruebas con PhantomJS. tearDown este código a mi función 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();
});
}
});
Probé varios enfoques para tareas similares y obtuve los mejores resultados con Selenium.
Antes probé con PhantomJS y Cheerio . Phantom se bloqueaba con demasiada frecuencia al ejecutar JS en la página.
Un enfoque que me viene a la mente, además de usar un navegador sin cabeza, es, obviamente, simular las llamadas ajax y armar la página después del proceso, solicitud por solicitud. Sin embargo, esto es a menudo un poco complicado y debe usarse como último recurso. a menos que realmente te gusta cavar a través del código javascript ...
el código de salida que tiene es correcto, pero hay un problema con la sincronicidad. Las líneas de salida que tiene se están ejecutando antes de que la página termine de cargarse. Puede vincularse a la devolución de llamada onLoadFinished para averiguar cuándo sucede eso. Ver código completo a continuación.
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() {
});
});
Cuando usas un sitio como Google, puede ser engañoso porque se carga mucho más rápido, que a menudo puedes ejecutar un Screengrab en línea como si lo tuvieras. La sincronización es una cosa difícil en phantomjs, a veces pruebo con setTimeout para ver si la sincronización es un problema.
Esto se puede hacer fácilmente con algún código php y javascript use fopen () y fwrite () y esta función para guardarlo: var generaSource = new XMLSerializer (). SerializeToString (documento);