Как обрабатывать всплывающее окно подтверждения с помощью phantomjs + behat + mink

В своих тестах я использую этот шаг для подтверждения всплывающего окна подтверждения javascript:

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

Этот шаг отлично работает с selenium2 и chrome/firefox, но не работает с phantomjs.

Как я могу обработать всплывающее окно подтверждения с помощью phantomjs?

для информации:

  • Симфония: 2.0.23
  • поведение: 2.4.6
  • норка: 1.5.0
  • Расширение Symfony2: 1.0.2
  • MinkExtension: 1.1.4
  • МинкБраузерКитДрайвер: 1.1.0
  • MinkSelenium2Драйвер: 1.1.0
  • фамтомджс 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


person Benjamin Lazarecki    schedule 07.08.2013    source источник
comment
Используете ли вы встроенное оповещение javascript или придуманное?   -  person Ken Hannel    schedule 07.08.2013
comment
Пользуюсь родным.   -  person Benjamin Lazarecki    schedule 08.08.2013
comment
Тебе удалось это понять, Бенджамин? Я столкнулся с той же проблемой...   -  person Matt    schedule 07.10.2013
comment
Не я не сделал. Я обновлю пост, если найду решение.   -  person Benjamin Lazarecki    schedule 08.10.2013
comment
Как вы запускаете свои тесты, которые включают оповещение в мес, через Selenium?   -  person Matt    schedule 08.10.2013
comment
phantomjs --webdriver=9876 › /dev/null 2›&1 & php -S localhost:8000 -t web › /dev/null 2›&1, и я обновляю свой пост, добавляя файл конфигурации behat.yml.   -  person Benjamin Lazarecki    schedule 08.10.2013
comment
привет @BenjaminLazarecki не могли бы вы обновить эту тему? я пробовал выше, но это не сработало для меня, интересно, есть ли лучший способ решить это сейчас.   -  person Luis Lopes    schedule 05.07.2016


Ответы (2)


Я обновил свой "Selenium2Driver.php" следующим образом:

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

Это делает accept_alert() доступным для драйвера.

Таким образом, в сценарии вы можете сделать что-то в этой строке, чтобы принять предупреждение.

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

Обратите внимание, что я использую RawMinkContext, а не собственный MinkContext.

person vijay pujar    schedule 24.06.2014

phantomjs — это безголовый браузер, поэтому все диалоги не отображаются и с ними нельзя взаимодействовать. Решение состоит в том, чтобы переписать widnow.confirm и window.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
person Alex Skrypnyk    schedule 09.03.2017