2013-08-07 3 views
5

In meinen Tests verwende ich diesen Schritt ein Javascript bestätigen Popup zu bestätigen:Wie mit PhantomJS bestätigen Popup zu handhaben + Behat + Nerz

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

Dieser Schritt arbeiten gut mit selenium2 und Chrom/firefox, aber nicht der Fall ist arbeiten mit phantomjs.

Wie kann ich ein Bestätigungs-Popup mit Phantomjs handhaben?

für Informationen:

  • symfony: 2.0.23
  • Behat: 2.4.6
  • Nerz: 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" 

Dank!

PS: Hier ist der Kern: https://gist.github.com/blazarecki/2888851

+0

Sind Sie mit dem nativen javascript "Alarm" oder ein ausgeheckt? –

+0

Ich benutze die native. –

+0

Haben Sie es geschafft, das herauszufinden, Benjamin? Ich bin auf das gleiche Problem gestoßen ... – Matt

Antwort

0

ich meine "Selenium2Driver.php" aktualisiert mit den folgenden:

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

Dies macht die accept_alert() für den Treiber zur Verfügung.

Also im Skript könnten Sie etwas tun, um die Warnung zu akzeptieren.

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

Beachten Sie, dass ich bin mit dem RawMinkContext nicht die native MinkContext

0

phantomjs ist ein Headless Browser, so dass alle Dialoge zeigen nicht und kann nicht mit interagiert werden. Eine Lösung besteht darin, widnow.confirm und window.alert mit eigenen Funktionen neu zu schreiben, die vordefinierte Werte zurückgeben.

Da ein Szenario innerhalb desselben Treibers ausgeführt wird, ist es vollkommen sicher, native Methoden mit vordefinierten Rückgabewerten zu überschreiben (Sie werden keine Situation haben, in der Sie wirklich ein Fenster innerhalb desselben Szenarios sehen müssen). Darüber hinaus ist es sicher, diese Schrittdefinitionen mehrmals innerhalb eines einzelnen Szenarios aufzurufen, um den zurückgegebenen Wert umzukehren.

/** 
* @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;}'); 
} 

Szenario Beispiel:

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 
Verwandte Themen