Puis-je obtenir de la page d'origine de la source (vs DOM actuel) avec phantomjs/casperjs?
J'essaie d'obtenir la source d'origine pour une page web particulière.
La page exécute des scripts qui modifient les DOM dès son chargement. Je voudrais obtenir le code source avant de script ou de modifications de l'utilisateur n'importe quel objet dans le document.
Avec Chrome ou Firefox (et probablement la plupart des navigateurs) je peux soit regarder les DOM (utilitaire de débogage F12) ou de regarder la source d'origine (clic droit, afficher la source). Ce dernier est ce que je veux accomplir.
Est-il possible de faire cela avec phantomjs/casperjs?
Avant d'arriver à la page que j'ai pour vous connecter. Cela fonctionne bien avec casperjs.
Si j'accédez à la page et rendre les résultats, je sais que je suis sur la page de droite.
casper.thenOpen('http://'+customUrl, function(response) {
this.page.render('example.png'); //*** Renders correct page (current DOM) ***
console.log(this.page.content); //*** Gets current DOM ***
casper.download('view-source:'+customUrl, 'b.html', 'GET'); //*** Blank page ***
console.log(this.getHTML()); //*** Gets current DOM ***
this.debugPage(); //*** Gets current DOM ***
utils.dump(response); //*** No BODY ***
casper.download('http://'+customUrl, 'a.html', 'GET'); //*** Not logged in ?! ***
});
J'ai essayé this.download(url, 'a.html')
mais il ne semble pas partager le même contexte, puisqu'il revient HTML comme si je n'étais pas connecté, même si je cours avec des cookies casperjs test.casper.js --cookies-file=cookies.txt
.
Je crois que je devrais continuer à l'analyse de cette option.
J'ai aussi essayé de casper.open('view-source:url')
au lieu de casper.open('http://url')
mais il semble qu'il ne reconnaît pas l'url depuis que j'ai juste une page blanche.
J'ai regardé le raw de la Réponse HTTP-je obtenir à partir du serveur avec un utilitaire que j'ai et le corps de ce message (qui est en HTML), c'est ce dont j'ai besoin mais quand le chargement de la page dans le navigateur, le DOM a déjà été modifié.
J'ai essayé:
casper.thenOpen('http://'+url, function(response) {
...
}
Mais la response
objet contient uniquement les en-têtes et quelques autres informations, mais pas le corps.
J'ai aussi essayé avec l'événement onResourceRequested.
L'idée est d'interrompre le téléchargement de toutes les ressources nécessaires à une page web spécifique (referer).
onResourceRequested: function(casperObj, requestData, networkRequest) {
for (var i=0; i < requestData.headers.length; i++) {
var obj = requestData.headers[i];
if (obj.name === "Referer" && obj.value === 'http://'+customUrl) {
networkRequest.abort();
break;
}
}
Malheureusement le script qui modifie le DOM qui semble d'abord pour être en ligne la page HTML principale (ou de ce code n'est pas de faire ce que je voudrais faire).
¿Des idées?
Voici le code complet:
phantom.casperTest = true;
phantom.cookiesEnabled = true;
var utils = require('utils');
var casper = require('casper').create({
clientScripts: [],
pageSettings: {
loadImages: false,
loadPlugins: false,
javascriptEnabled: true,
webSecurityEnabled: false
},
logLevel: "error",
verbose: true
});
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X)');
casper.start('http://www.xxxxxxx.xxx/login');
casper.waitForSelector('input#login',
function() {
this.evaluate(function(customLogin, customPassword) {
document.getElementById("login").value = customLogin;
document.getElementById("password").value = customPassword;
document.getElementById("button").click();
}, {
"customLogin": customLogin,
"customPassword": customPassword
});
},
function() {
console.log('Can't login.');
},
15000
);
casper.waitForSelector('div#home',
function() {
console.log('Login successfull.');
},
function() {
console.log('Login failed.');
},
15000
);
casper.thenOpen('http://'+customUrl, function(response) {
this.page.render('example.png'); //*** Renders correct page (current DOM) ***
console.log(this.page.content); //*** Gets current DOM ***
casper.download('view-source:'+customUrl, 'b.html', 'GET'); //*** Blank page ***
console.log(this.getHTML()); //*** Gets current DOM ***
this.debugPage(); //*** Gets current DOM ***
utils.dump(response); //*** No BODY ***
casper.download('http://'+customUrl, 'a.html', 'GET'); //*** Not logged in ?! ***
});
OriginalL'auteur supercoco | 2014-06-05
Vous devez vous connecter pour publier un commentaire.
Hum, avez-vous essayez d'utiliser certains événements? Par exemple :
Je pense qu'il ne fonctionne pas, essayer quand même.
Le problème, c'est que vous ne pouvez pas le faire dans des conditions normales casperJS étape, car les scripts sur votre page sont déjà exécutés. Ça pourrait fonctionner si l'on pouvait lier les DOM-Prêt d'un événement, ou avez une casper événement comme ça. Problème : la page doit être chargée d'envoyer des js de Casper pour les DOM de l'environnement. Afin de liaison onready n'est pas possible (je ne vois pas comment). Je pense qu'avec le fantôme, nous pouvons recueillir des DONNÉES après l'événement de chargement, de sorte que lorsque la page est affichée.
Donc si il n'est pas possible de le pirater avec les événements et peut-être un peu de retard, votre seule solution est de bloquer les scripts qui modifient votre DOM.
Il y a encore la phantomJS option, vous devez l'utiliser : dans casper :
Le problème est que vous devez le js activé pour récupérer les données, de sorte qu'il ne peut pas travailler... :p Ouais commentaire inutile ! 🙂
Sinon, vous devez bloquer le voulait ressource/script qui modifie le DOM à l'aide d'événements.
Ou vous pouvez utiliser la
resource.received
événement à gratter les données voulais avant les ressources spécifiques modifiant DOM apparaissent.En fait, je ne pense pas que c'est possible parce que si vous créez une étape de récupérer une partie des données à partir de la page juste avant ressources spécifiques apparaissent, le temps de votre étape est exécutée, les ressources vont avoir la charge. Il serait nécessaire de geler les ressources suivantes pendant votre étape se fait racler les données.
Ne sais pas comment le faire, mais ces événements pourraient vous aider :
Voir aussi Comment avez-vous Désactiver le css dans CasperJS?.
La solution qui fonctionne : vous identifiez les scripts et de les bloquer. Mais si vous en avez besoin, et bien je ne sais pas, c'est une bonne question. Peut-être qu'on pourrait reporter l'exécution d'un script spécifique. Je ne pense pas que Casper et le fantôme facilement permis que.La seule option utile est
abort()
, de nous donner cette option :timeout("time -> ms")
!onResourceRequested
Ici une question similaire : Injection de script avant les autres
Et au lieu d'annuler, avez-vous essayer de récupérer le code HTML sur une ressource appropriée reçu? avec
var fs = require('fs'); fs.write("results.html", casper.getPageContent(), 'w');
OriginalL'auteur Fanch
Comme Fanch a souligné, il semble qu'il n'est pas possible de le faire. Si vous êtes capable de faire deux demandes, alors cela devient facile. Simplement faire une demande avec JavaScript activé et l'autre sans, de sorte que vous pouvez gratter la source de la page et de le comparer.
Vous pouvez modifier l'ordre en fonction de vos besoins. Si vous êtes déjà sur une page que vous voulez avoir le balisage original, alors vous pouvez utiliser
casper.getCurrentUrl()
pour obtenir l'URL actuelle:OriginalL'auteur Artjom B.
Concernant la docs vous pouvez utiliser
#debugPage()
pour obtenir le contenu de la page en cours.ce qui concerne
david
Mise à jour de ma réponse à utiliser #debugHTML() à la place de #debugPage()
Cela ne fonctionne pas non plus. Il ne retourne pas le HTML d'origine.
lol, c'est une putain de honte!
OriginalL'auteur the binary