2015-10-18 54 views
1

我想抓取一个网站,哪种登录页面有一个登录页面分离和跳转主页。这里是我的代码,但我不成就跳跃主页: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() ; 
}); 

回答

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); 
    } 
}); 

使用waitFor()为更稳健的等待特定的条件或使用page.onCallback and window.callPhantom() pair