Behat \ Mink:wait($ timeout)不起作用

时间:2016-08-20 09:11:35

标签: php symfony phpunit mink

我正在使用Mink Zombie Driver 来编写接受测试。现在我正在尝试进行 ajax调用,所以我使用wait($timeout)方法等待响应,但它不起作用。我正在调用等待$this->session->wait(20000),但是当我使用php函数time()计时时,显然这几乎没有时间完成,所以我认为这是一个非阻塞调用,如果我试图访问$this->session->getPage()中的内容,它会阻止,但这也不是真的。我最初有一个($.active === 0)条件作为wait()的第二个参数,但是没有用,所以我删除了第二个参数以隔离问题。
是否有必要使用behat's docs中的spin()函数,或wait()函数是否足够。如果需要spin()那么wait()是什么?

更新

安装了phantomjs driver for mink并看到它有效后,我必须得出结论问题与僵尸驱动程序相关

2 个答案:

答案 0 :(得分:0)

您可以将wait()用于JS条件,例如:

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

使用spin进行自定义等待,其功能如文档中所述。

以下是ajax how-to-make-behat-wait-for-an-ajax-call

的其他一些示例

答案 1 :(得分:0)

我发现了同样的问题并在互联网上找到了这个功能,它运行正常。 Reference

/**
 * 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));
        }
    }