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

How can I handle modal dialogs with Behat and Goutte?

我正在网站上测试允许用户填写表格的功能。此刻,用户需要单击一个按钮,这会触发一个 Ajax 加载模式,允许他上传文件。但是,当我触发按钮时,Behat 似乎没有 "see" 模态 window.

也许我应该准确地说我在 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");
    }
}

然而到目前为止我没有运气。

我该怎么办?

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

使用这样的东西:

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

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

Follow Behavior Driven Development methodology.