При запуске теста входа Behat через PhantomJS он проходит только при первом запуске.

Я создал очень простой тест входа в Behat для входа в наше внутреннее приложение. Существует два типа входа в систему (выполняется с одного и того же экрана и окна). Есть базовый и продвинутый. Единственное отличие состоит в том, что в расширенном режиме пользователь, который входит в систему, имеет доступ к более чем одной компании, и его просят выбрать компанию для работы.

Я обнаружил, что всякий раз, когда я запускаю сценарии через PhantomJS вместо Selenium, они работают намного быстрее (очевидно, поскольку ничего не нужно отображать в эмуляторе безголового браузера). Когда я впервые запускаю PhantomJS, он отлично работает в обоих сценариях. Но затем я запускаю его во второй раз, и он не работает в первом сценарии (базовый вход в систему).

Если я перезапущу PhantomJS, он снова будет работать до второй попытки. Я очень смущен этим. Почему мне нужно перезапустить PhantomJS, чтобы оба теста снова прошли при первом вызове.

Если я укажу, что я просто хочу, чтобы он запускал расширенный вход в систему при последующих запусках, он также не сможет войти в систему. Если я укажу базовый логин (по-прежнему предотвращая запуск обоих сценариев), это также не удастся. Но когда я запускаю оба сценария в одном и том же вызове, первый всегда терпит неудачу, а второй всегда проходит.

Я даже изменил порядок так, чтобы базовый сценарий выполнялся вторым, а не первым, и первый сценарий (в данном случае расширенный) терпит неудачу, а второй проходит. Так что же происходит в мире?

В качестве дополнительного бонуса я пошел дальше и добавил строку, которая гласит: «Затем я следую «Выйти из системы»», и внезапно оба сценария снова проходят. Что имело бы смысл, если бы не тот факт, что он отлично работает во втором сценарии. Разве это не должно привести к сбою обоих, если он уже вошел в систему? Есть ли способ убедиться, что кеш для PhantomJS очищается в конце каждого сценария?

Feature: Login
    Login to app using a basic user
    Login to app using a multi-company user

    @javascript
    Scenario: Basic Login
        Given I am on "/"
        And I wait a few seconds
        When I fill in "login" with "ijones"
        And I fill in "password" with "SomeP@ssword"
        And I press "LoginButton"
        And I wait a few seconds
        Then I should see "By clicking below"
        And I press "OK"
        Then I should see "Welcome"

    @javascript
    Scenario: Advanced Login
        Given I am on "/"
        When I fill in "login" with "rtyler"
        And I fill in "password" with "SomeP@ssword"
        And I press "LoginButton"
        Then I wait for the company selection box
        And I click a field "company"
        And I pick "Test Company 2"
        And I press "CompanyLoginButton"
        Then I should see "By clicking below"
        And I press "OK"
        Then I should see "Welcome"

person Patrick    schedule 24.06.2013    source источник
comment
У меня такая же проблема в Codeception. PhantomJS сохраняет сеанс.   -  person Adamamont    schedule 25.06.2013
comment
У меня такая же проблема, но в моем случае даже reset() не помогает.   -  person Pavel    schedule 11.12.2014


Ответы (1)


Ладно, наконец-то я разобрался с этим жуком. Хотя бы частично. Кажется, он поддерживает сеанс между сценариями. Это не полностью объясняет, почему это только первый вызов. Но я подозреваю, что PhantomJS держит предыдущий сеанс открытым, когда последний сценарий закрывается, и что Mink перестраивает сеанс между сценариями, но не после окончания последнего сценария.

В любом случае, решение состоит в том, чтобы создать контекст или ловушку для сброса сеанса в конце каждого вызова сценария. В целях тестирования я создал контекст, который гласит: «И я сбрасываю сеанс».

Я определил это так:

/**
 * @Given /^I reset the session$/
 */
public function iResetTheSession() {
    $this->getSession()->reset();
}

Когда я вызываю этот контекст в конце обоих сценариев, это устраняет проблему. Поэтому я думаю, что я продолжу и сделаю пост-сценарный крючок, который позаботится об этом за меня.

person Patrick    schedule 25.06.2013