2013-08-07 28 views
5

W moich testów używam ten krok, aby potwierdzić javascript potwierdzić popup:Jak obsługiwać potwierdzenia okienko z phantomjs + behat + norek

/** 
* @when /^(?:|I)confirm the popup$/ 
*/ 
public function confirmPopup() 
{ 
    $this->getSession()->getDriver()->getWebDriverSession()->accept_alert(); 
} 

Ten etap pracować dobrze z selenium2 i chrom/Firefox, ale nie pracować z phantomjs.

Jak mogę obsłużyć okno potwierdzenia z phantomjs?

dla informacji:

  • symfony: 2.0.23
  • behat: 2.4.6
  • norek: 1.5.0
  • Symfony2Extension: 1.0.2
  • MinkExtension: 1.1.4
  • MinkBrowserKitDriver: 1.1.0
  • MinkSelenium2Driver: 1.1.0
  • phamtomjs 1.9.1

behat.yml

default: 
    extensions: 
     Behat\Symfony2Extension\Extension: 
      mink_driver: true 
     Behat\MinkExtension\Extension: 
      base_url: "http://localhost:8000/app_test.php" 
      default_session: selenium2 
      selenium2: 
       wd_host: "http://localhost:9876/wd/hub" 

Dzięki!

PS: Oto sedno: https://gist.github.com/blazarecki/2888851

+0

Używasz rodzimych javascript "alert" lub gotowane aż jeden? –

+0

Używam rodzimego. –

+0

Udało ci się to rozgryźć, Benjamin? Natrafiłem na ten sam problem ... – Matt

Odpowiedz

0

zaktualizowałem moją "Selenium2Driver.php" z następujących powodów:

public function acceptAlert() 
{ 
$this->wdSession->accept_alert(); 
} 

To sprawia, że ​​accept_alert() dostępne dla kierowcy.

Tak więc w skrypcie można zrobić coś w linii, aby zaakceptować alert.

$ this-> getSession() -> getDriver() -> acceptAlert();

Zauważ, że używam RawMinkContext nie natywną MinkContext

0

phantomjs jest bezgłowy przeglądarki, dlatego wszystkie dialogi nie pokazują i nie mogą być interakcje z. Rozwiązaniem jest przepisanie widnow.confirm i window.alert z własnymi funkcjami, które zwracają predefiniowane wartości.

Ponieważ scenariusz działa w tym samym sterowniku, całkowicie bezpieczne jest zastąpienie natywnych metod predefiniowanymi wartościami zwracanymi (nie będzie sytuacji, w której naprawdę trzeba będzie zobaczyć okno w tym samym scenariuszu). Co więcej, bezpiecznie jest wywoływać te definicje kroków wiele razy w ramach jednego scenariusza, aby odwrócić zwróconą wartość.

/** 
* @When I accept confirmation dialogs 
*/ 
public function acceptConfirmation() { 
    $this->getSession()->getDriver()->executeScript('window.confirm = function(){return true;}'); 
} 

/** 
* @When I do not accept confirmation dialogs 
*/ 
public function acceptNotConfirmation() { 
    $this->getSession()->getDriver()->executeScript('window.confirm = function(){return false;}'); 
} 

Przykładowy scenariusz:

Scenario: Removal of something with confirmation dialog 
Given I accept confirmation dialogs 
And I click a ".mylink" element 
And I wait for AJAX to finish 
And I should not see a ".some-removed-element" element