javascript - test - Cómo iniciar sesión rellenando el formulario en CasperJs
phantomjs 1.9 8 (4)
En caso de que alguien más encuentre esto ... utilicé una combinación de estas respuestas: mi formulario de inicio de sesión también estaba en un iframe que agregaba algunas dificultades, pero básicamente el problema que vi (inicio de sesión basado en cookies) es que Casper iba al siguiente paso. Antes de que el servidor pudiera responder y configurar la cookie. Agregué algunas devoluciones de llamada .wait () para asegurar el tiempo suficiente para obtener esa cookie. Puede que no sea infalible, pero todavía tengo que tener un problema con él
Eso sí, la cookie debe ser configurada TODAS LAS CANGAS
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);
});
A continuación se muestra el hlml del formulario de inicio de sesión que tengo
<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>
Estoy usando el siguiente código para iniciar sesión:
this.fill(''form#user-login'', {
''form_submit'': 1,
''name'': ''[email protected]'',
''pass'': ''pwd'',
''op'': ''Log in''
}, true);
Pero no creo que esté haciendo la cosa por mí.
Hmmm ... Sigue eso con:
casper.then(function () {
this.evaluate(function () {
$(''form#user-login'').submit();
});
});
casper.waitForSelector("form input[name=''name'']", function() {
this.fillSelectors(''form#user-login'', {
''input[name = name ]'' : ''[email protected]'',
''input[name = pass ]'' : ''pwd''
}, true);
});
Simplemente use esto (vea la documentación de waitForSelector ). En primer lugar, esperar a que se cargue el formulario. Luego rellene el formulario utilizando los selectores.
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());
});