2017-02-22 110 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(); 
相关问题