2012-08-23 14 views
5

Voglio eseguire qualche javascript sulla pagina nel hook @BeforeStep che dipende da jQuery. Tuttavia jQuery non è definito in quel momento, infatti la pagina è vuota.Mink: attendere che la pagina venga caricata in @BeforeStep

Qui è quello che sto cercando di 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); 
    } 

ho pensato che forse potevo aspettare per il caricamento della pagina jQuery prima (linea commentato), ma non è vero. Sembra che l'esecuzione venga interrotta fino all'elaborazione di quel gancio.

Qual è il posto giusto nell'ecosistema behat/mink per eseguire javascript sulla pagina?

+0

ho finito di aggiungere lo script JS sopra al codice sorgente. – Dziamid

risposta

5

Che ne dici di questo?

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

non aiuta neanche. Aspetta 5 secondi mentre lo schermo è bianco e continua. – Dziamid

+1

Ho fatto qualcosa di simile, ma questo fa sì che uno scenario venga eseguito molto più a lungo quando un passaggio non interagisce con il browser, come quando si caricano i dati dei prerequisiti. Fare un check come '$ this-> getSession-> getCurrentUrl() === 'about: blank'' aiuta, ma forse c'è un modo più elegante. –

0

Il javascript viene eseguito prima del passaggio, ovvero prima che la pagina venga caricata. Ma se carichi una pagina, anche tutti i tipi di JavaScript onloadload/pageload verranno attivati.

Se siete felici di eseguirlo dopo la pagina iniziale, è possibile utilizzare @AfterStep in questo modo:

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