2017-02-02 7 views
0

PhantomJSを使用してログイン認証を使用してWebサイトからの情報のスクレイピングを自動化しようとしています。 ページのログインフォームにアクセスするには、ボタンをクリックする必要があります。ボタンをクリックすると、フォームを描画するjavascript関数がトリガーされます。 私のコードでは、単純にjs関数を呼び出してフォームを描画し、その後にフィールドを埋めるようにしています。 問題は、phantomjsが新しい描画要素を見つけられないことです。 もう一方で、関数を呼び出した後にスクリーンショットを撮ると、その要素が表示されます。 ページ上の他のフォーム要素にアクセスすることは問題なく動作するので、問題が完全に描画される前にphantomjsが要素にアクセスしようとしている可能性があります。PhantomJs:jsファンクションで描画されたアクセスエレメント

ここに私のコードは次のとおりです。

var page = require('webpage').create(); 
url = "http://websiteURL.bla"; 
page.open(url, function(status) { 

    if (status === "success") { 
    page.evaluate(function() { 
     netbar_login_signup() //js function to show login form 
    }); 
    page.evaluate(function() { //wait a few seconds, then fill the fields 
    document.getElementById("gsnet_login_name").value = "name"; 
    document.getElementById("gsnet_login_passwd").value = "password"; 
    document.getElementById("gsnet_login_submit").click(); 
    },3000); 
    window.setTimeout(function() { //wait a few more seconds, then take screenshot 
     page.render("page.png"); 
    },5000); 

    } 
}); 

誰もが同じような問題を経験したか、私の解決策を知っていますか?

答えて

0

あなたはほとんど権利を持っていますが、最初の待機期間です。

page.evaluate実際には、関数の後に追加の引数を取ることができますが、タイムアウトではありません。これらは、page.evaluateの内部に渡される引数です。したがって、待つためにはどちらの場合もsetTimeoutを使用する必要があります。

var page = require('webpage').create(); 
url = "http://websiteURL.bla"; 
page.open(url, function(status) { 

    // This looks a bit cleaner, less nesting 
    if (status !== "success") { 
     console.log(status); 
     phantom.exit(1); // 1 = error exit code 
    } 

    page.evaluate(function() { 
     netbar_login_signup() //js function to show login form 
    }); 

    // from this moment both setTimeout functions are executed simultaneously 
    // the difference is that the second is waiting for 2 seconds longer 

    // wait three seconds, then fill the fields 
    setTimeout(function() { 
     page.evaluate(function() { 
      document.getElementById("gsnet_login_name").value = "name"; 
      document.getElementById("gsnet_login_passwd").value = "password"; 
      document.getElementById("gsnet_login_submit").click(); 
     }); 
    }, 3000); 

    // wait two more seconds, then take screenshot 
    setTimeout(function() { 
     page.render("page.png"); 
     phantom.exit(); // phantom.exit(0) // success exit code 
    }, 5000); 

}); 
関連する問題