javascript - 错误代码: 402 when trying to capture Web Page with Casperjs

标签 javascript html phantomjs casperjs

我无法正确捕获使用 Casperjs 登录的网页。我得到一张网页的图片,其中只有一个带有“未实现”的 H1 标签。下面是脚本:

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。描述:下载时出错 http://192.168.9.150:89/user/log in - 服务器回复:未实现

制作屏幕截图并将其另存为 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>

最佳答案

我终于让我的脚本正常工作了,而且我使脚本比我发布的原始脚本更加动态。

我意识到有两个问题导致我的脚本无法运行。第一个问题是在创建 pdf 之前捕获没有等待页面完全加载。下面的这一行获取 URL 并等待其加载。这可确保脚本中稍后的屏幕捕获创建完全加载页面的 pdf。

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

我还使用下面这一行将超时时间从 5 秒增加到 25 秒,以确保加载数据量大的报告而不会超时。

 casper.options.waitTimeout = 25000; 

第二个问题是我尝试创建 PDF 的网页使用名为 Domkit 的 Fantom pod。 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();

关于javascript - 错误代码: 402 when trying to capture Web Page with Casperjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42399946/

相关文章:

javascript - 用 CasperJS 抓取 : page seems to load without javascript enabled

javascript - onClick - 获取对函数和硬编码参数的引用

javascript - Internet Explorer 11 中的 Facebook FB.init "Access is Denied"

javascript - Bootstrap 表特定列的最后一行

html - 使用 flex-grow : 1 使网格元素像 flex 元素一样使用剩余空间

jquery - jquery slideDown()后div不在一行中

javascript - 当我调度事件()时,表单元素变为空白

javascript - 在 Javascript 中为 document.getElementById 创建别名

javascript - 通过designer 2013添加js以删除sharepoint上的功能区

javascript - 有没有办法从选择标签选项列表值生成 html 链接?