2013-08-07 64 views
5

在我的測試中我使用此步驟確認JavaScript的confirm彈出:如何處理確認彈出與phantomjs +貝哈特+貂

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

這一步做工精細用selenium2和Chrome/Firefox,但不與phantomjs一起工作。

如何處理phantomjs的確認彈出窗口?

的信息:

  • 的symfony:2.0.23
  • 貝哈特:2.4.6
  • 貂: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" 

謝謝!

PS:這裏的要點是:https://gist.github.com/blazarecki/2888851

+0

您使用的是原生的JavaScript 「警報」 或炮製了一個? –

+0

我使用本機。 –

+0

你設法弄清楚本傑明?我碰到過同樣的問題... – Matt

回答

0

我更新了我的 「Selenium2Driver.php」 有以下幾點:

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

這使得accept_alert()可用於驅動程序。

所以在腳本中,你可以做一些事情來接受警報。

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

請注意,我使用的RawMinkContext不是本地MinkContext

0

phantomjs是一個無頭的瀏覽器,因此所有的對話都無法顯示,無法與之交互。解決方法是用您自己的函數重寫widnow.confirmwindow.alert,返回預定義的值。

由於場景在同一個驅動程序中運行,因此使用預定義的返回值覆蓋原生方法是絕對安全的(您不會出現真正需要在同一場景中查看窗口的情況)。而且,在單個場景中多次調用這些步驟定義以翻轉返回值是安全的。

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

場景例如:

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