2015-10-18 349 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