如何处理Behat和Goutte的模态对话框?

时间:2018-01-18 14:11:01

标签: drupal behat gherkin

我正在网站上测试功能,允许用户填写表单。在某个时刻,用户需要单击一个按钮,该按钮会触发一个Ajax加载的模式,允许他上传文件。但是,当我触发按钮时,Behat似乎没有“看到”模态窗口。

也许我应该准确地说我在Drupal 8环境中,但我不知道这是否改变了什么

我们很清楚,我不是在谈论警报,而是kind of modal

到目前为止,我的测试看起来像这样:

Scenario: Creates a stage test with two sessions
    Given I am on "/user/login"
    And I fill in "user@user.com" for "name"
    And I fill in "password" for "pass"
    And I press "Log in"
    Then I should get a "200" HTTP response
    And I should see "User Name"
    When I go to "/node/add/stage"
    Then I should get a "200" HTTP response
    And I should see "Add content CISIA Stage"
    When I fill in "Test Cisia Stage" for "edit-title-0-value"
    And I press "Select files"
    Then I should see "Upload files" <-- fails
    And I should see "Click or drop files here to upload them" <-- gets ignored but is likely to fail too

我无法在SO或Google上找到与模式相关的任何内容,只关于小消息提醒,人们谈论我没有的对象或功能(例如getWebDriver()

我也试图通过这样做来找到模态的内容:

public function iShouldSeeAModalWindow() {

    $element = $this->getSession()->getPage();
    $modal = $element->find('css', sprintf('div:contains("%s")', 'Upload files'));

    if($modal) {
      exit('Yaaaay!');
    }

    else {
      throw new Exception("No modal found");
    }
}

但到目前为止我没有运气。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

你有一个iframe,你需要切换到它。

使用类似的东西:

$this->getSession()->getDriver()->switchToIFrame('iframe_name');

我认为您还应该考虑在高级别上编写场景,并使用页面对象扩展来避免长时间难以维护和不可读的场景,并尽可能多地重用代码。

  

遵循行为驱动开发方法。