PhantomJS를 사용하여 양식을 제출하는 방법
phantomJS (굉장한 도구 btw!)를 사용하여 로그인 자격 증명이있는 페이지의 양식을 제출 한 다음 대상 페이지의 내용을 stdout으로 출력하려고합니다. 팬텀을 사용하여 양식에 액세스하고 값을 성공적으로 설정할 수 있지만 양식을 제출하고 후속 페이지의 내용을 출력하는 올바른 구문이 무엇인지 잘 모르겠습니다. 내가 지금까지 가지고있는 것은 :
var page = new WebPage();
var url = phantom.args[0];
page.open(url, function (status) {
if (status !== 'success') {
console.log('Unable to access network');
} else {
console.log(page.evaluate(function () {
var arr = document.getElementsByClassName("login-form");
var i;
for (i=0; i < arr.length; i++) {
if (arr[i].getAttribute('method') == "POST") {
arr[i].elements["email"].value="mylogin@somedomain.com";
arr[i].elements["password"].value="mypassword";
// This part doesn't seem to work. It returns the content
// of the current page, not the content of the page after
// the submit has been executed. Am I correctly instrumenting
// the submit in Phantom?
arr[i].submit();
return document.querySelectorAll('html')[0].outerHTML;
}
}
return "failed :-(";
}));
}
phantom.exit();
}
나는 그것을 알아. 기본적으로 비동기 문제입니다. 제출하고 후속 페이지를 즉시 렌더링 할 수는 없습니다. 다음 페이지에 대한 onLoad 이벤트가 트리거 될 때까지 기다려야합니다. 내 코드는 다음과 같습니다.
var page = new WebPage(), testindex = 0, loadInProgress = false;
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.onLoadStarted = function() {
loadInProgress = true;
console.log("load started");
};
page.onLoadFinished = function() {
loadInProgress = false;
console.log("load finished");
};
var steps = [
function() {
//Load Login Page
page.open("https://website.com/theformpage/");
},
function() {
//Enter Credentials
page.evaluate(function() {
var arr = document.getElementsByClassName("login-form");
var i;
for (i=0; i < arr.length; i++) {
if (arr[i].getAttribute('method') == "POST") {
arr[i].elements["email"].value="mylogin";
arr[i].elements["password"].value="mypassword";
return;
}
}
});
},
function() {
//Login
page.evaluate(function() {
var arr = document.getElementsByClassName("login-form");
var i;
for (i=0; i < arr.length; i++) {
if (arr[i].getAttribute('method') == "POST") {
arr[i].submit();
return;
}
}
});
},
function() {
// Output content of page to stdout after form has been submitted
page.evaluate(function() {
console.log(document.querySelectorAll('html')[0].outerHTML);
});
}
];
interval = setInterval(function() {
if (!loadInProgress && typeof steps[testindex] == "function") {
console.log("step " + (testindex + 1));
steps[testindex]();
testindex++;
}
if (typeof steps[testindex] != "function") {
console.log("test complete!");
phantom.exit();
}
}, 50);
또한 CasperJS는 링크 클릭 및 양식 작성을 포함하여 PhantomJS 탐색을위한 훌륭한 고급 인터페이스를 제공합니다.
Updated to add July 28, 2015 article comparing PhantomJS and CasperJS.
(Thanks to commenter Mr. M!)
Sending raw POST requests can be sometimes more convenient. Below you can see post.js original example from PhantomJS
// Example using HTTP POST operation
var page = require('webpage').create(),
server = 'http://posttestserver.com/post.php?dump',
data = 'universe=expanding&answer=42';
page.open(server, 'post', data, function (status) {
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log(page.content);
}
phantom.exit();
});
As it was mentioned above CasperJS is the best tool to fill and send forms. Simplest possible example of how to fill & submit form using fill() function:
casper.start("http://example.com/login", function() {
//searches and fills the form with id="loginForm"
this.fill('form#loginForm', {
'login': 'admin',
'password': '12345678'
}, true);
this.evaluate(function(){
//trigger click event on submit button
document.querySelector('input[type="submit"]').click();
});
});
참고URL : https://stackoverflow.com/questions/9246438/how-to-submit-a-form-using-phantomjs
'development' 카테고리의 다른 글
$ rootScope에 도달 할 수 없습니다 (0) | 2020.06.02 |
---|---|
jQuery : 다른 요소 다음에 요소 추가 (0) | 2020.06.02 |
VS2012의 테마를 어디에서 찾을 수 있습니까 (0) | 2020.06.02 |
스칼라 대 파이썬의 스파크 성능 (0) | 2020.06.02 |
단일 선택 단추 (INPUT type =“radio”)에 대한 OnChange 이벤트 핸들러가 하나의 값으로 작동하지 않습니다 (0) | 2020.06.02 |