2012-08-23 13 views
5

jQueryに依存する@BeforeStepフックでページ上にいくつかのjavascriptを実行します。しかし、jQueryはその時点では定義されていません。実際はページは空白です。Mink:@BeforeStepでページが読み込まれるのを待ちます。

は、ここで私はachiveしようとしているものです:私は考え出し

/** 
* @BeforeStep @javascript 
*/ 
public function registerAjaxEventHandlers() 
{ 
    $javascript = <<<JS 
     window.jQuery(document).ready(function() { 
      if (window.__ajaxStatus !== undefined) { 
       return; 
      } 
      window.__ajaxStatus = 'none'; 

      $('body').ajaxStop(function() { 
       window.__ajaxStatus = 'idle'; 
      }); 

      $('body').ajaxStart(function() { 
       window.__ajaxStatus = 'in-flight'; 
      }); 
     }); 
JS; 
     //$this->getSession()->wait(5000, 'window.jQuery !== undefined'); 
     $this->getSession()->executeScript($javascript); 
    } 

は多分私が最初に(コメント行)のjQueryをロードするためにページを待つこともできますが、それは真実ではありません。そのフックが処理されるまで、実行のように見えます。

JavaScriptをページ上で実行するためのbehat/minkエコシステムの適切な場所は何ですか?

+0

私は、ソースコードに上記のJSスクリプトを追加することになりました。 – Dziamid

答えて

5

これはいかがですか?

$this->getSession()->wait(5000, 'typeof window.jQuery == "function"'); 
+0

どちらも助けません。画面が白く表示されている間、5秒間待ちます。 – Dziamid

+1

私は似たようなことをしましたが、前提条件のデータを読み込むときなど、ステップがブラウザとやりとりしない場合にシナリオがずっと長く実行されます。 '$ this-> getSession-> getCurrentUrl()=== 'about:blank''のようなチェックを行うと助けになりますが、おそらくもっとエレガントな方法があります。 –

0

JavaScriptは、ステップが実行される前、つまりページがロードされる前に実行されます。しかし、ページを読み込むと、あらゆる種類のondomload/pageload JavaScriptも既に起動します。

あなたが最初のページの後にそれを実行するために満足している場合、あなたはこのよう@AfterStep使用することができます:

/** 
* @AfterStep 
*/ 
public function set_selenium_css_selector (Behat\Behat\Event\StepEvent $event) { 
    $this->getSession()->wait(10, 'jQuery ("body").addClass ("selenium")'); 
} 
関連する問題