2017-02-12 3 views
1

Ich bin erfolgreich in der Lage gewesen, roh html (die mit einem anderen Produkt abgerufen wurde) dann phantomjs nehmen Sie diese Roh HTML und rendern die ganze Seite einschließlich der Ausführung alle/alle Javascript. Ich bin kürzlich auf eine Seite gestoßen, auf der JavaScript nicht gerendert wurde. DiesePhantomJs kann nicht eine bestimmte Seite von der Quelle

ist, wie ich es laufen ...

phantomjs myscript.js > OUTPUT.txt 2>&1 

Hier ist die MyScript.js Datei, die das Problem veranschaulicht ...

var page = require('webpage').create(), 
var system = require('system'); 
var address = 'http://cloud.firebrandtech.com/#!/login'; 
var rawHtml = '<!DOCTYPE html>\ 
<html>\ 
<head>\ 
    <meta charset="utf-8">\ 
<meta http-equiv="X-UA-Compatible" content="IE=edge">\ 
<meta name="viewport" content="width=device-width, initial-scale=1.0">\ 
<meta name="description" content="Web Portal for managing Cloud Products, Assets, and Distributions">\ 
<meta name="author" content="Firebrand Technologies">\ 
<title>Firebrand Cloud</title>\ 
<link rel="stylesheet" href="/widgets/css/widgets.css">\ 
<link rel="stylesheet" href="/css/portal.css">\ 
</head>\ 
<body ng-app="portal" fc-app="cloud" fc-direct="true" class="fc">\ 
    <div>\ 
     <div data-ng-if="user.isLoaded" data-ng-controller="PortalCtrl">\ 
      <div data-ng-include="getView()"></div>\ 
      <div class="container">\ 
       <div data-ui-view></div>\ 
      </div>\ 
     </div>\ 
    </div>\ 
    <script src="/widgets/js/widgets.js"></script>\ 
<script src="/js/vendor.js"></script>\ 
<script src="/js/portal.js"></script>\ 
</body>\ 
</html>'; 

page.settings.resourceTimeout = 5000; 
page.settings.loadImages = false; 
page.setContent(rawHtml, address); 
window.setTimeout(function() { 
    if(page.content.indexOf('Sign In') > -1) 
     console.log('YAY!!! Javascript Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') 
    else 
     console.log('BOO!!! Javascript NOT Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!')  

    phantom.exit(); 
}, 5000); 

Scheint, wie diese Seite einige erfordert Auth/cors arbeiten. Ich kann es zum Laufen bringen, wenn phantomjs die tatsächliche Anfrage (mit page.open) macht, um die Quelle wie das folgende Beispiel zu erhalten. Diese Lösung wird jedoch für mich nicht funktionieren. Phantomjs muss die Quelle wie im obigen Beispiel verwenden (was, wie ich bereits erwähnt habe, für alle anderen Seiten gut funktioniert hat).

var page = require('webpage').create(), 
var system = require('system'); 
var address = 'http://cloud.firebrandtech.com/#!/login '; 

page.open(address, function(status) { 
    setTimeout(function(){ 
     if(page.content.indexOf('Sign In') > -1) 
      console.log('YAY!!! Javascript Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') 
     else 
      console.log('BOO!!! Javascript NOT Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!')  

     phantom.exit(); 
    }, 5000) 
}); 

Ich habe bereits versucht, Fahnen wie die folgenden verwenden, aber sie scheinen keine Wirkung zu haben ...

phantomjs --web-security=false --ignore-ssl-errors=true thefilebelow.js > OUTPUT.txt 2>&1 

Antwort

0

Schließlich diese Arbeit bekommt ...

Da ich ein anderes Produkt verwendet (nicht phantomjs), um die Seitenquelle abzurufen, musste ich die Cookies beibehalten, die mit dieser Anfrage zurückgeschickt wurden. Dann hatte ich in diesen Cookies wie so mit addCookie passieren ...

var page = require('webpage').create(), 
var system = require('system'); 
var address = 'http://cloud.firebrandtech.com/#!/login'; 
var rawHtml = 'same raw html as above...'; 

//THE NEXT 3 LINES ARE WHAT CHANGED 
var cookiesFromInitialRequest = [{name: 'aaa', value: 'bbb', domain: 'ccc'}, etc...] 
for(var i = 0; i < cookiesFromInitialRequest.length; i++) 
    phantom.addCookie(cookiesFromInitialRequest[i]) 

page.settings.resourceTimeout = 5000; 
page.settings.loadImages = false; 
page.setContent(rawHtml, address); 
window.setTimeout(function() { 
    if(page.content.indexOf('Sign In') > -1) 
     console.log('YAY!!! Javascript Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') 
    else 
     console.log('BOO!!! Javascript NOT Rendered!!!!!!!!!!!!!!!!!!!!!!!!!!')  

    phantom.exit(); 
}, 5000); 
+0

So ... das ist die Antwort auf Ihre Frage? – Vaviloff

+0

Ja, ich kann es nur als Antwort bis morgen wählen. – sjdirect

Verwandte Themen