2017-02-22 39 views
1

Я не могу правильно захватить веб-страницу, с которой я вхожу в систему с помощью Casperjs. Я получаю изображение веб-страницы, у которой просто есть тег H1 с «Not Implemented». Вот скрипт ниже:Код ошибки: 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

ли вы использовать Basic Auth или вы войти на этот сайт через форму? – Vaviloff

+0

Я верю его через форму, но я точно не уверен. Я обновил свое исходное сообщение, чтобы включить форму, которая находится на странице входа, к которой я пытаюсь получить доступ. – nuccio

ответ

0

Я, наконец, получил свой сценарий для правильной работы, а также сделал сценарий более динамичным, чем оригинальный сценарий, который я опубликовал.

Я понял, что у меня было две проблемы, которые мешали моему скрипту работать. Первая проблема заключается в том, что захват не ожидал полной загрузки страницы, прежде чем создавать PDF-файл. Эта строка ниже получает URL-адрес и ждет его загрузки. Это гарантирует, что захват экрана позже в скрипте создает pdf полностью загруженной страницы.

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

Я также увеличил время ожидания от 5 секунд до 25 секунд с этой линией ниже, чтобы сделать тяжелые отчеты уверен, что данные будут загружены без тайм-аута.

casper.options.waitTimeout = 25000; 

Второй вопрос о том, что веб-страницы, я пытался создать PDF из использует стручок Fantom под названием Domkit. Domkit не удалось загрузить должным образом в виртуальном браузере Phantomjs. Я решил эту проблему, удалив domkit из пользовательского интерфейса веб-страницы, которую я пытался захватить с помощью Casperjs.

Вот полный скрипт ниже

/* 
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();