2016-07-08 11 views
0

私は現在、ヘッドレスブラウザ(PhantomJS)とすべてのDOMナビゲーションと可能なアクション(ダウンロードを除く)が必要な自動テストスクリプトで作業しています。 したがって、PhantomJSは適合するはずです。PhantomJSを使用したjQueryバグ

しかし、私は、次のエラーとしてのjavascript jQueryを使ってPhantomJSを使用することはできません。

var page = require('webpage').create(); 
page.open('http://mywebsite.com/', function() { 
    function dothat() { 
     console.log('0 started'); 
     $('#id').children().eq(0).click(); 
     console.log('0 finished'); 
     return main(1, 0); 
    } 
} 
dothat() 

はここでスクリプトが「0開始」を停止します。私がロードするページはjQueryを使用していますので、私はそれをダウンロードする必要はありません。それでも、ロードしてみましょう。

var page = require('webpage').create(); 
page.open('http://mywebsite.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    function dothat() { 
     console.log('0 started'); 
     $('#id').children().eq(0).click(); 
     console.log('0 finished'); 
     return main(1, 0); 
    } 
} 
dothat() 

はい(非常にしっかりと)私は ...同じディレクトリにファイルをローカルに持っており、それは、そのエラーを示しています。あなたはそれを修正する

TypeError: undefined is not a constructor (evaluating 'jQuery.easing[jQuery.easing.def](t,e,n,i,a)') 

何をしていることをお勧めしますか? これはPhantomJSの内部のバグなので、私はUbuntuでFirefoxとXvfbを試してみるべきですか、それともどこかで私のエラーですか? 私は最初にコードを非jQueryバージョンに変更しましたが、クラスで大きなセレクタが必要で、いくつかのオブジェクトをクリックする必要があります...

私に解決策を教えていただきありがとうございます!

編集1:最初の回答からわかったことに従ってこれを変更しました。今すぐコンソールに何も印刷されない

var page = require('webpage').create(); 
page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 
page.open('http://mywebsite.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    var result = page.evaluate(function() { 
     function dothat() { 
      console.log('0 started'); 
      $('#id').children().eq(0).click(); 
      console.log('0 finished'); 
      return main(1, 0); 
     } 
     function main(x, y) { 
      if (x === 0) { 
       return setTimeout(dothat(), y); 
      } else if (x === 1) { 
       return setTimeout(dothis(), y); 
      } 
     } 
     return main(0, 5000); //first launch 
    } 
}); 

私はそれがあなたが指摘していたものだったかどうかは分かりません。

EDIT 2:これはgoogle.comに行き、私としてログインしたい本当のスクリプトです。ただし、スクリプトは意図したとおりに動作しません。下記を参照してください。

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 dofirst() { 
      $('#gb_70').click(); 
      return main(1, 0); 
     } 
     function dosecond() { 
      document.getElementById('Email').value = '[email protected]'; 
      $('#next').click(); 
      return main(2, 0); 
     } 
     function dothird() { 
      document.getElementById('Passwd').value = 'mypwd'; 
      $('#signIn').click(); 
     } 
     function main(i, j) { 
      if (i === 0) { 
       console.log('launching 0'); 
       return setTimeout(dofirst(), j); // connections 
      } 
      else if (i === 1) { 
       console.log('launching 1'); 
       return setTimeout(dosecond(), 5000); 
      } 
      else if (i === 2) { 
       console.log('launching 2'); 
       return setTimeout(dothird(), 5000); 
      } 
     } 
     return main(0, 5000); 
    }); 
}); 

ご覧のとおり、mainは、手順を遅らせるために使用している関数です。コードが動作すると私は、このエラー(またはそれらを)返していませんが :

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 

は私を支援しようと保ついただきありがとうございます!

+0

'doThat()'はプライベートなので、 ' – dandavis

+0

'にすることができますが、実際のケースでは失敗します。 –

答えて

0

他の方法でやりたくないですか? PhantomJSで

function dothat() { 
    console.log('0 started'); 
    $('#id').children().eq(0).click(); 
    console.log('0 finished'); 
    return main(1, 0); 
} 

var page = require('webpage').create(); 
page.open('http://mywebsite.com/', dothat) 
+0

特にありません。 @Vaviloffからの非常に良い答えで、コードは大幅に改善されましたが、それでも動作しません。これまで作業コードがないと確信しています! –

1

は常に関数と変数が存在する2つのjavascirptコンテキストがあります:

  1. PhantomJSコンテキストを
  2. 開いたページのコンテキスト彼らはお互いを認識していないとそうでない

交差する!

PhantomJSは、ターゲットページオブジェクトまたはDOMのいずれにもアクセスできません。そのため、$('#id').children().eq(0).click();は機能しません.PhantomJSスクリプトにはjQueryがなく、DOM要素はありません。 2番目のコンテキスト、つまり​​にあります。

ページで何かをするには、そこにテレポートコードを並べ替える必要があります。それはpage.evaluate()メソッドの助けを借りて行われます。

var page = require('webpage').create(); 
page.open('http://mywebsite.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    var result = page.evaluate(function(){ 

     // You can certainly use functions 
     // Be sure to declare them also 
     // inside of page.evaluate 
     function dothat() { 
      console.log('0 started'); 
      $('#id').children().eq(0).click(); 
      console.log('0 finished'); 
      return main(1, 0); 
     } 

     // Important: don't forget to return result 
     // back to PhantomJS main context 
     return dothat(); 
    }); 
}); 

あなたはpage.onConsoleMessageコールバックを経由して、それらに登録する必要があり、サンドボックスページコンテキストからのコンソールメッセージをreceieveへの注意:EDIT 1後

page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 

: 私の悪い、私はブラケットの編集を失ってしまいましたPhantomJS v2.xが不平を言っていないという事実である文法エラーを引き起こしたあなたの例(上記の修正)は、ただ静かにそこにぶら下がります。それはあなたがコンソールメッセージが間違っていたものです。スクリプトの構文エラーを最初にv1.9.8でテストするか、IDEで構文の強調表示をテストすると便利です。

var page = require('webpage').create(); 
page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 
page.open('http://mywebsite.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    var result = page.evaluate(function() { 
     function dothat() { 
      console.log('0 started'); 
      $('#id').children().eq(0).click(); 
      console.log('0 finished'); 
      return main(1, 0); 
     } 
     function main(x, y) { 
      if (x === 0) { 
       return setTimeout(dothat(), y); 
      } else if (x === 1) { 
       return setTimeout(dothis(), y); 
      } 
     } 
     return main(0, 5000); //first launch 
    }); // 
}); 

注:

あなたの現在のコードは、これを(行方不明ブラケットが固定)になりますinextistent dothisについて()関数を文句を言うでしょう。

+0

これでコンソールには何も印刷されません。 編集を参照してください –

+0

今、それは物事を印刷しますが、私はまだ問題があります。実際のコードの一部を編集2に表示します。 –

+0

申し訳ありませんが、@ジョンドーは、あなたのためのコード*を書くことはできません。私はすでにあなたのコードに間違っていたことを示しています(page.evaluateを使用してターゲットページのDOMを操作していない)ので、EDIT 2を別の質問にする必要があります。 – Vaviloff

関連する問題