PhantomJS / CasperJS - 以编程方式单击重新加载页面

时间:2016-01-03 10:17:47

标签: login automation phantomjs

我正在尝试使用PhantomJS在我的远程服务器上自动化网站。

对于本网站,我必须使用我的用户名和密码登录。

检查HTML,我看到了:

<form class="" method="post" action="https://foo.com/login/"
                               id="foo_login_bar" accept-charset="utf-8">
    <input tabindex="1" name="user_name" id="user" value="" type="text">
    <input tabindex="2" name="password"  id="pass" value="" type="password">
    <div class="wrapper_login_button">
        <input class="saved_url_for_login" name="login_url" 
           value="http://foo.com/" type="hidden">
        <input tabindex="3" id="login_button" class="btn left login_button" 
           name="login" value="Login" type="submit">
    </div>
</form>

所以我试试:

var page = require('webpage').create();

page.onConsoleMessage = function(msg) {
  console.log('CONSOLE: ' + msg);
};

page.open('http://foo.com', function(status) 
{
    console.log("Status: " + status);

    if(status === "success") 
        page.evaluate( bot );

    page.render('example.png');
    phantom.exit();
});

function bot()
{
    if( ! Foo.isLoggedIn() ) {
        console.log("Not logged in!");

        document.getElementById( "user" ).value = "myuser";
        document.getElementById( "pass" ).value = "mypass";

        document.getElementById( "login_button" ).click();
    }
}

检查屏幕截图显示它已在用户和密码字段中正确输入了文本,但无法刷新页面。

即。如果我填写两个字段并单击Firefox上的登录按钮,则会将我带到我的帐户主页。

我猜这里发生的事情是代码在页面有机会重新加载之前立即到达屏幕截图。

重新加载完成后,如何让执行继续?

编辑:Phantomjs login, redirect and render page after pageLoad finishes

1 个答案:

答案 0 :(得分:1)

  

我猜这里发生的事情是代码在页面有机会重新加载之前立即到达屏幕截图。

你是绝对正确的,你需要等待页面重新加载。

在PhantomJS中,您可以在页面加载完成时注册回调函数。

var page = require('webpage').create();
var action;

page.onLoadFinished = function(result)
{
    page.render('example' + (new Date()).getTime() + '.png');

    // Need to check `action` variable because 
    // this callback will also fire when opening page for the first time
    if(action == "loggin in") 
    {
         phantom.exit();        
    }
}

page.onConsoleMessage = function(msg) {
  console.log('CONSOLE: ' + msg);
};

page.open('http://foo.com', function(status) 
{
    console.log("Status: " + status);

    if(status === "success") 
    {
        action = "loggin in";
        page.evaluate( bot );
    }

});

function bot()
{
    if( ! Foo.isLoggedIn() ) 
    {
        console.log("Not logged in!");

        document.getElementById( "user" ).value = "myuser";
        document.getElementById( "pass" ).value = "mypass";

        document.getElementById( "login_button" ).click();
    }
}