Как войти, заполнив форму в CasperJs
Ниже приведен hlml формы входа, которая у меня есть
<div class="login_area_user">
<form method="post" action="https://www.tradus.com/login?dest_url=https://www.tradus.com/cart/select-address" id="user-login">
<input type="hidden" value="1" name="form_submit">
<h3 style="display:inline-block;">Already a Member</h3>
<p id="login-main-center-right-descp">You can use tradus login id and password</p>
<div class="login-row">
<label class="colorBlack">Email / Login*</label>
<input class="login-field" type="text" name="name" id="edit-namepopup">
</div> <!-- [/login-row] -->
<div class="login-row">
<label>Password</label>
<input class="login-field" type="password" id="edit-passpopup" name="pass">
</div> <!-- [/login-row] -->
<div class="login-row">
<a class="forgotPassword" href="/forgot_password">Forgot your password?</a>
<!--input type="checkbox" name="remember" /><span>Remember me</span-->
</div>
<div class="login-row">
<input class="login-button" value="Login" type="submit">
</div>
<input type="hidden" name="op" value="Log in">
</form>
</div>
Используйте следующий код для входа:
this.fill('form#user-login', {
'form_submit': 1,
'name': '[email protected]',
'pass': 'pwd',
'op': 'Log in'
}, true);
Но я не делаю этого, делая это для меня.
Ответы
Ответ 1
casper.waitForSelector("form input[name='name']", function() {
this.fillSelectors('form#user-login', {
'input[name = name ]' : '[email protected]',
'input[name = pass ]' : 'pwd'
}, true);
});
Просто используйте это (см. waitForSelector docs).
Во-первых, дождитесь загрузки формы.
Затем заполните форму с помощью селекторов.
Ответ 2
casper.waitForSelector('form', function(){
this.fill('form', {
'name': '[email protected]',
'pass': 'pwd'}, true);
});
<!-- wait until a form tag disappears -->
casper.waitWhileSelector('form', function(){
this.echo('selector is no more!');
});
casper.then(function(){
this.echo(this.getTitle());
});
Ответ 3
В случае, если кто-то еще найдет это. Я использовал некоторую комбинацию этих ответов. Моя форма входа также была в iframe, которая добавила некоторые трудности, но в основном проблема, которую я видел (вход в cookie-based), заключается в том, что кассовый аппарат собирался следующий шаг до того, как сервер сможет ответить и установить файл cookie. Я добавил некоторые .wait() обратные вызовы, чтобы обеспечить достаточно времени для получения этого файла cookie. Возможно, он не является надежным, но у меня еще есть проблема с ним.
Помните, что cookie должен быть установлен КАЖДОЙ CRAWL
casper.start(config.loginUrl, function() {
console.log("Checking login status @ " + config.loginUrl);
// set a wait condition to make sure the page is loaded (particularly iframe in my case)
this.wait(5000,function(){
// switch to iframe (won't be necessary for most)
this.page.switchToChildFrame('login');
// fill out the form
this.fillSelectors("form[name='loginForm']",{
'input#txtUsername' : config.username,
'input#txtPassword' : config.password
});
// click the login button
console.log("Logging In...")
this.click('input.button.login');
// ** give my crappy dev server 5 seconds to respond
this.wait(5000,function(){
console.log('Starting to spider ' + dataObj.start)
// do yo dance
spider(dataObj.start);
});
Ответ 4
Хммм.. Следуйте за этим:
casper.then(function () {
this.evaluate(function () {
$('form#user-login').submit();
});
});