2012-08-23 109 views
5

我想在依賴於jQuery的@BeforeStep鉤子的頁面上執行一些JavaScript。但是當時jQuery沒有定義,事實上頁面是空白的。貂皮:等待頁面加載@BeforeStep

這裏就是我想才達到:

/** 
* @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的,但事實並非如此。似乎執行被暫停,直到該鉤子被處理。

behat/mink生態系統在頁面上執行javascript的正確位置是什麼?

+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")'); 
}