1

javascript に接続された href を持つアンカーを持つシステムで CasperJS をテストします。いつものことをしている

casper.then(function() {
this.evaluate(function() {
//      document.querySelector('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]').click();    // works in FF
//  window.onload=submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');

      //eval("submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH_1');");
//submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');
//  window.onload=submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');

//      this.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      self.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      this.this.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
..

});

});

上記のアプローチはどれも機能しませんでした。__utils__プロジェクトの Git リポジトリは、要素を呼び出す方法であるクリック メソッドを持つと思われる CasperUtils/ClientUtils ライブラリが Casper にあることを示していますhref="javascript:foo()"

ただし、これを実行する方法がわかりません。

誰かが CasperJS を使用していて、これがどのように実装されているかについてのコードのサンプルを持っているなら、私たちは感謝します!

理想的には、最終結果は次のようになります。

casper.then(function() {
  e=document.querySelector("id['foo']");
  CasperUtilsSomething.click(e);
});

または、私が実行できるテスト コード ケースへのポインターがあれば、これがどのように実装されるかを確認できます。

4

1 に答える 1

1

ここでの問題は、関数の範囲に関する混乱のようです。これは、PhantomJS (CasperJS がその上に構築されている) を操作する際の注意が必要な点です。2 つの完全に別個のスコープがあり、そのうちの 1 つは PhantomJS コンテキストで実行され、casperオブジェクトにアクセスできます。 runs in -casper.evaluate()たとえば run in はすべてリモート コンテキストのサンドボックスで実行され、casperオブジェクトやそのメソッドにはアクセスできません。

this.click()そのため、内部で呼び出そうとするとcasper.evaluate()失敗します。実行中の関数はcasperインスタンスにアクセスできず、ブラウザー内のオブジェクトthisを参照します。window

通常、これを行う方法は次のとおりです。

casper.then(function() {
    casper.click('#CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');
    casper.evaluate(function() {
        // some function that needs to run after clicking
    });
});

また、私の知る限り、通常はwindow.onloadコードを実行できないことに注意してくださいcasper.evaluate()。ウィンドウのloadイベントは、コードを実行するまでに既に発生しています。

于 2012-05-21T16:48:26.287 に答える