PhantomJS登录和页面重定向

Dig*_*kam 1 javascript phantomjs

我正在尝试抓取一个网站,登录后有一个登录页面分离并跳转主页.这是我的代码,但我不是成就跳跃主页:

var page = require('webpage').create() ;
var login = 'https://webstie.com/login' ;
var home = 'https://website.com/home' ;

page.open(login, function (status) {
    if (status !== 'success') {
        console.log('fail!');
    } else {
        page.evaluate(function(){
            function timer (f,n) {
                var i = 0 ;
                var t = setInterval(function(){
                    if (n < i) {
                        clearInterval(t) ;
                        f() ;
                    }
                    i++ ;
                },50) ;
            }
            $("input[name=email]").val("user") ;
            $("input[name=password]").val("pass") ;
            $("input[type=submit]").click() ;
            timer(function(){
                document.location.href = home ;
                timer(function(){
                    $('body').css('border','1px solid red') ;
                },100) ;
            },100) ;
        }) ;
        page.render('page.png') ;
    }
    console.log('finished!') ;
    phantom.exit() ;
});
Run Code Online (Sandbox Code Playgroud)

Art*_* B. 5

你忘了等待异步处理.您的timer()函数是异步的,因为它setTimeout()是异步的.这就是为什么你的page.render()呼叫实际发生在timer()运行之前.同样的道理phantom.exit().

但是你不想使用document.location.href = home,因为那时你需要听一下页面打开事件.您可以与其他人以综合方式完成此操作page.open().

尝试:

page.open(login, function (status) {
    if (status !== 'success') {
        console.log('fail!');
        phantom.exit(1);
    } else {
        page.evaluate(function(){
            $("input[name=email]").val("user") ;
            $("input[name=password]").val("pass") ;
            $("input[type=submit]").click() ;
        });
        setTimeout(function(){
            page.open(home, function(status){
                if (status !== "success") {
                    console.log('fail2');
                    phantom.exit(1);
                    return;
                }
                page.evaluate(function(){
                    $('body').css('border','1px solid red') ;
                });
                page.render('page.png');
                console.log('finished!');
                phantom.exit();
            });
        }, 500);
    }
});
Run Code Online (Sandbox Code Playgroud)

使用waitFor()了更稳健的等待特定的条件,或使用page.onCallback与window.callPhantom()对.