2017-02-22 70 views
1

我無法正確捕獲我正在用Casperjs登錄的網頁。我得到一張簡單地帶有「未實現」H1標籤的網頁圖片。這裏是下面的腳本:錯誤代碼:402當試圖用Casperjs捕獲網頁時

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 ownloading在http://192.168.9.150:89/user/log - 服務器的回覆:未實現

製作一個屏幕畫面並將其保存爲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

我終於得到了我的腳本正常工作,我也使腳本比我發佈的原始腳本更具動態性。

我意識到我有兩個問題阻止我的腳本工作。第一個問題是在創建PDF之前,捕獲並未等待頁面完全加載。下面這行代碼獲取URL並等待加載。這可確保稍後在腳本中捕獲屏幕創建完全加載頁面的pdf。

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

我還增加了超時時間從5秒到25秒與該線以下,以確保數據重報告被加載而不超時。

casper.options.waitTimeout = 25000; 

第二個問題是我試圖創建PDF的網頁使用了一個名爲Domkit的Fantom窗格。 Domkit無法在Phantomjs虛擬瀏覽器中正確加載。我通過從我試圖用Casperjs捕獲的網頁的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(); 
相關問題