Behat\Mink: ожидание($timeout) не работает

Я использую Mink вместе с Zombie Driver для написания приемочных тестов. Теперь я пытаюсь сделать вызов ajax, поэтому я использую метод wait($timeout) для ожидания ответа, но он не работает. Я вызываю ожидание как $this->session->wait(20000), но когда я замерил время с помощью функции php time(), было очевидно, что это почти не требует времени, поэтому я предположил, что это неблокирующий вызов, и он заблокировался бы, если бы я попытался для доступа к вещам в $this->session->getPage(), но это тоже неправда. Изначально у меня было условие ($.active === 0) в качестве второго аргумента wait(), но это не сработало, поэтому я удалил второй аргумент, чтобы изолировать проблему.
Нужно ли использовать функцию spin(), как в документы behat или достаточно функции wait(). Если нужно spin(), то зачем wait()?

Обновлять

Установив драйвер phantomjs для mink и увидев, что он работает, я должен сделать вывод, что Проблема находится с Zombie Driver.


person user2268997    schedule 20.08.2016    source источник
comment
Какое это имеет отношение к PHPUnit?   -  person Sebastian Bergmann    schedule 20.08.2016
comment
Он запускается в PHPUnit, я добавил это на всякий случай...   -  person user2268997    schedule 20.08.2016


Ответы (2)


Вы можете использовать wait() для условия JS, например:

wait(30000, "document.readyState === 'complete'")

Используйте spin для пользовательских ожиданий с функциями, как описано в документации.

Вот несколько других примеров для ajax -ожидание-вызова-ajax

person lauda    schedule 21.08.2016

Я обнаружил ту же проблему и нашел эту функцию в Интернете, она отлично работает. Ссылка.

/**
 * Wait
 *
 * @param integer $time  * @param string  $condition
 *
 * @throws BehaviorException If timeout is reached
 */
 public function wait($time = 10000, $condition = null){
    if (!$this->getSession()->getDriver() instanceof Selenium2Driver) {
        return;
    }
    $start = microtime(true);
    $end = $start + $time / 1000.0;
    if ($condition === null) {
        $defaultCondition = true;
        $conditions = [
            "document.readyState == 'complete'",           // Page is ready
            "typeof $ != 'undefined'",                     // jQuery is loaded
            "!$.active",                                   // No ajax request is active
            "$('#page').css('display') == 'block'",        // Page is displayed (no progress bar)
            "$('.loading-mask').css('display') == 'none'", // Page is not loading (no black mask loading page)
            "$('.jstree-loading').length == 0",            // Jstree has finished loading
        ];
        $condition = implode(' && ', $conditions);
    } else {
        $defaultCondition = false;
    }
    // Make sure the AJAX calls are fired up before checking the condition
    $this->getSession()->wait(100, false);
    $this->getSession()->wait($time, $condition);
    // Check if we reached the timeout unless the condition is false to explicitly wait the specified time
    if ($condition !== false && microtime(true) > $end) {
        if ($defaultCondition) {
            foreach ($conditions as $condition) {
                $result = $this->getSession()->evaluateScript($condition);
                if (!$result) {
                    throw new BehaviorException(
                        sprintf(
                            'Timeout of %d reached when checking on "%s"',
                            $time,
                            $condition
                        )
                    );
                }
            }
        } else {
            throw new BehaviorException(sprintf('Timeout of %d reached when checking on %s', $time, $condition));
        }
    }
person Lucas Karst Caminha Ruggiero    schedule 14.02.2017