2017-02-22 12 views
1

CasperjsでログインしているWebページを正しくキャプチャできません。私はWebページを単に "実装されていない" H1タグがある写真を取得します。ここでは、以下のスクリプトです:ここではエラーコード:402 CasperjsでWebページをキャプチャしようとしています

var casper = require('casper').create({ 
pageSettings: { 
    loadImages: false,//The script is much faster when this field is set to false 
    loadPlugins: false, 
    userAgent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36', 
    customHeaders:{ 
    'Authorization':'Basic '+btoa('someusername:somepassword') 
    } 
} 
}); 

    casper.on("resource.error", function(resourceError){ 
    console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')'); 
    console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString); 
    }); 


//First step is to open SkySpark Login 
casper.start().thenOpen("http://192.168.9.150:89/user/login", function() { 
    console.log("SkySpark website opened"); 
}); 

//Second step is to click to the Sign-in button 
casper.then(function(){ 
    this.evaluate(function(){ 
    document.getElementById("nav-tools").children[0].click(); 
}); 
    }); 

//Now we have to populate username and password, and submit the form 
casper.then(function(){ 
    console.log("Login using username and password"); 
    this.evaluate(function(){ 
     document.getElementById("username").value="someusername"; 
     document.getElementById("password").value="somepassword"; 
     document.getElementById("loginForm").submit(); 
    }); 
    }); 

//Wait to be redirected to the Home page, and then make a screenshot 
casper.then(function(){ 
    console.log("Make a screenshot and save it as SkySparkTens.png"); 
    this.capture('SkySparkTens.png'); 
}); 

//prints HTML to the console 
casper.then(function(){ 
    this.wait(5000, function() { 
     console.log(this.getHTML()); 
    }); 
}); 

casper.run(); 

は、コンソール応答され、私は戻って取得:

D:\ tempに\ CasperLogin> casperjs logCasper.js

SkySparkのウェブサイトが使用して

ログインを開設ユーザ名とパスワード

リソースをロードできません(#4URL:http://192.168.9.150:89/user/login) エラーコード:402説明:エラーd中http://192.168.9.150:89/user/log ownloading - サーバーは答えた:

実装されていないスクリーンショットを作成し、SkySparkTens.png

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
      <title>501 Not Implemented</title> 
     </head> 
     <body> 
      <h1>Not Implemented</h1> 
     </body> 
     </html> 

として保存すると、ここで私がアクセスしようとしていますサイトにログインページに表示される形式は、 。

 <script type='text/javascript'> 
     userModLogin.passwordRequired = false; 
     userModLogin.authUri = "/user/auth"; 
     userModLogin.redirectUri = '/ui/'; 
     userModLogin.localeLogin = 'Login'; 
     userModLogin.localeLoggingIn = 'Logging in'; 
     userModLogin.localeBadCres = 'Invalid username or password'; 
     userModLogin.autoFocusId = 'username'; 
     window.onload = function() { userModLogin.init(false); } 
    </script> 
    </head> 
    <body> 
     <form id='loginForm' method='post' action='/user/login'> 
     <p class='logo'> 
      <img src='/brand/logo.svg' title='SkySpark' alt='SkySpark' />   </p> 
     <p id='err'> 
      Invalid username or password</p> 
     <p> 
     <label for='username'> 
      Username:</label> 
     <input type='text' id='username' name='username'placeholder='Username' /></p> 
     <p> 
     <label for='password'>Password:</label> 
     <input type='password' id='password' name='password' size='25' autocomplete='off' placeholder='Password' /></p> 
     <p> 
      <label for='mobile'> 
      <input type='checkbox' id='mobile' value='mobile' /> Mobile</label> 
     </p> 
      <p> 
      <input type='submit' id='loginButton' value='Login' onclick='return userModLogin.loginAuth();' /></p> 
     </form> 
    </body> 
+1

以下の完全なスクリプトは、基本認証を使用するか、フォームを経由してそのサイトにログインしますかか? – Vaviloff

+0

私はフォームを介してそれを信じていますが、私は正確にはわかりません。私は元の投稿を更新して、正しくアクセスしようとしているログインページにあるフォームを追加しました。 – nuccio

答えて

0

最終的に私のスクリプトが正しく動作するようになりました。また、私が投稿した元のスクリプトよりもスクリプトを動的にしました。

スクリプトが動作しなくなるという2つの問題があることに気付きました。最初の問題は、キャプチャがPDFを作成する前にページが完全に読み込まれるのを待っていないことです。下の行はURLを取得し、ロードするのを待ちます。これにより、スクリプトの後の画面キャプチャによって、完全にロードされたページのpdfが作成されます。

this.waitForUrl(casper.cli.get("report"), function() { 
    casper.back(); 
    }); 

私はまた、データ重いレポートはタイムアウトせずにロードされていることを確認するために、次の行で25秒まで5秒からタイムアウト時間を増加させました。

casper.options.waitTimeout = 25000; 

2番目の問題は、私がPDFを作成しようとしていたWebページが、DomkitというFantomポッドを使用していたことでした。 Phantomjs仮想ブラウザにDomkitを正しく読み込むことができませんでした。私はCasperjsでキャプチャしようとしていたWebページのUIからDomkitを削除してこの問題を解決しました。ここで

/* 
note: all parameters should be formatted like so on the command line: -- parameter=value 
note: all paramters must be separated by a space from each other: -- paramter1=value1 parameter2=value2 
Parameter 1: --filename (required, Whatever name given here will be the name of the file) 
Parameter 2: --username (required, This needs to be the users SkySpark username) 
Parameter 3: --password (required, This needs to be the users SkySPark password) 
Parameter 4: --report (required, url needed to get to the desired report in SkySpark) 
Parameter 4: --directory (optional will default to the io directory if null. This is the path needed to 
         get to the desired place to store file. All \ must be entered as /) 
Parameter 5: --fileType (optional will default to PDF if null, fileType needed to render the file as desired type(pdf,png,jpeg,jpg), 
         only png and pdf are supported)  
*/ 
var casper = require('casper').create({ 
    // verbose: true, 
    // logLevel: 'debug', 
    pageSettings: { 
    loadImages: true,//The script is much faster when this field is set to false 
    loadPlugins: false, 
    userAgent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36' 
    } 
}); 

//First step is to open the report in SkySpark. 
casper.start().thenOpen(casper.cli.get("report"), function() { 
    console.log("SkySpark website opened"); 
}); 

//Changes the timeout from 5 seconds to 25 seconds 
casper.options.waitTimeout = 25000; 


//Now we have to populate username and password, and submit the form 
casper.then(function(username, password){ 
    console.log("Login using username and password"); 
//take user name and password from variables and creates varaible to pass into the evaluate 
var uName = casper.cli.get("username"); 
var pWord = casper.cli.get("password") 
/*function that will be executed in the DOM context (you can also call it the page context). 
You can pass some primitives as arguments to this function and return one primitive back. 
Keep in mind that this function that you pass to evaluate must be self contained. It cannot use 
variables or functions that are defined outside of this function. 
*/ 
this.evaluate(function(username, password){ 
    //SkySpark 
    document.getElementById("username").value = username; 
    document.getElementById("password").value = password; 
    document.getElementById("loginButton").click(); 
}, uName, pWord); 
//This waits for the report to load completely before continueing 
this.waitForUrl(casper.cli.get("report"), function() { 
    casper.back(); 
}); 

}); 
//Gets the path from the parameters, if user puts null as parameter the paramter will be set to the io directory in SkySpark 
var directory; 
if(casper.cli.get("directory") == null || casper.cli.get("directory").length <= 1){ 
    directory = 'D:\\SkySpark\\skyspark-3.0.9\\var\\proj\\development\\io\\'; 
}else{ 
    directory = casper.cli.get("directory"); 
} 
//fileType determines what the captured file will be. 
var fileType; 
if(casper.cli.get("fileType") == "png"){ 
    fileType = '.png'; 
}else if(casper.cli.get("fileType") == "jpg" || casper.cli.get("fileType") =="jpeg"){ 
    fileType = '.jpeg'; 
}else{ 
    fileType = '.pdf'; 
} 

//Wait to be redirected to the Home page, and then make a screenshot 
casper.then(function(){ 
    console.log("Make a screenshot and save it as Sky Home Page"); 
    this.capture(directory + casper.cli.get("filename") + fileType); 
    console.log(directory + casper.cli.get("filename") + fileType); 
    this.echo(this.getCurrentUrl()); 
}); 

casper.run(); 
関連する問題