2016-07-11 5 views
-1

これはあなたのGoogleアカウントにログインしようとしているスクリプトです(作成しました)。しかし、明らかに、それはうまくいきません。ここに特別な目的はありませんが、それを機能させることです。終わりPhantomJSの基本スクリプトのバグ

var page = require('webpage').create(); 
page.onConsoleMessage = function(msg) { 
    console.log('CONSOLE: ' + msg); 
}; 
page.open('https://google.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    page.evaluate(function() { 
     function include(arr,obj) { // those functions are not part of scraping 
      return (arr.indexOf(obj) != -1); 
     } 
     function add(a, b) { 
      return a + b; 
     } 
     Array.min = function(array){ 
      return Math.min.apply(Math, array); 
     }; 
     function dofirst() { 
      $('#gb_70').click(); 
      main(1, 0); 
     } 
     function dosecond() { 
      document.getElementById('Email').value = '[email protected]'; 
      $('#next').click(); 
      main(2, 0); 
     } 
     function dothird() { 
      document.getElementById('Passwd').value = 'P4SSW0RD'; 
      $('#signIn').click(); 
      main(3, 0); 
     } 
     function dofourth() { 
      L1 = ['test', 'test2', 'google']; 
      for (var i = 0; i < 1; i++) { 
       if (L1, 'google') { 
        console.log('SUCCESS!'); 
       } 
      } 
      main(4, 0); 
     } 
     function dofifth() { 
      $('.gb_b.gb_8a.gb_R').click() 
      setTimeout(function(){$('#gb_71').click()}, 500); 
      main(0, 5000); 
     } 
     function main(i, j) { 
      if (i === 0) { 
       console.log('launching 0'); 
       setTimeout(dofirst(), j); // connections 
      } 
      else if (i === 1) { 
       console.log('launching 1'); 
       setTimeout(dosecond(), 5000); 
      } 
      else if (i === 2) { 
       console.log('launching 2'); 
       setTimeout(dothird(), 5000); 
      } 
      else if (i === 3) { 
       console.log('launching 3'); 
       setTimeout(dofourth(), 5000); 
      } else if (i === 4) { 
       console.log('launching 4'); 
       setTimeout(dofifth(), 5000); 
      } 
     } 
     main(0, 5000); 
    }); 
    console('super end'); 
    page.render('google.png'); 
}); 

私はこれらのエラーを取得:

CONSOLE: launching 0 
CONSOLE: launching 1 
TypeError: null is not an object (evaluating 'document.getElementById('Email').value = '[email protected]'') 

    undefined:7 in dosecond 
    :22 in main 
    :4 in dofirst 
    :18 in main 
    :29 
    :30 

は、私は多くの方法を試してみましたが、誰も働いていません。私はPythonとセレンのWebドライバ(本当の愛でした)でも動作させることができました。しかし、今は時間が経過し、javascript(完全にDOM/jQueryになるためにはWeb互換)にする必要があります。

私はそれを動作させるようにしてください!

編集1:スクリーンショットをキャプチャしようとすると、空のPNGが保存されます。

EDIT 2:私はそれがヒント、私はphantomjsのtest.jsを行うときに、それが最終的に迅速にすべてをロードして、ログに非常に長い時間がかかるかもしれないと思う...

EDIT 3:私は、ドキュメントを変更しました。 get(...)。value = 'blabla'を$( '#id')に設定します。val( 'blabla');そして今すぐ印刷する

CONSOLE: launching 0 
CONSOLE: launching 1 
CONSOLE: launching 2 
CONSOLE: launching 3 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 

しかし、それは1つのSUCCESSだけを出力し、明らかにまだキャプチャは動作しません。 EDIT 1については

+0

私は '.value'はjavascriptのDOM要素のプロパティではないと思います。 jQuery( '#Email')を使用しようとしていますか?jQueryのようにval( '[email protected]')? 'Email'要素のDOM型は何ですか? – Fredster

+0

しかし、なぜロードに時間がかかりますか? –

+0

あなたは正しいと思いました。 EDIT 3 –

答えて

0

:ページがロードされていることを確認するには、画面

チェックに状態をキャプチャしようとしています。

page.open(url, function(status) { 
    if (status !== 'success') { 
     // exit if it fails to load the page 
     console.log(status); 
     phantom.exit(1); 
    } 
    else{ 
     // your code here 
    } 
}); 
+0

あなたが助けてくれたように答えを受け入れました。しかし私には別の問題があります。 私のスクリプトは、質問でそうするようにスクリプトを変更したので、いつもループで実行しなければなりません。しかし、私は 'RangeError:最大呼び出しスタックサイズを超えました。 'というエラーが発生し、すべてが非常に速くなりますが、5秒全てを実行する必要があります。何が起きているのですか?どうすれば修正できますか? –

+0

ロジックに無限ループがあります。 'dofifth()'関数はmain関数を '0'で呼び出し、他のすべての関数の呼び出しをやり直します。私はあなたのコードをphantomJS 'waitFor'で再構築することを提案します。これを確認してくださいhttp://stackoverflow.com/a/32502929/2519988 – Fredster

+0

ロジックは、無限ループを持つことです。 私は毎分x分/秒(何でも)スクリプトを起動できるようにしたいと考えています。これは、マスターから呼び出される5つの関数として構成されています。 –

関連する問題