Behat/Mink 测试失败时如何让浏览器保持打开状态

How to leave the browser open when a Behat/Mink test fails

我正在使用 selenium2 驱动程序在 docker 容器中使用 Behat/Mink 测试我的 Drupal 站点。

使用 Selenium Standalone-Chrome 容器,我可以看到我的 behat 测试失败了,但问题是一旦失败,浏览器就会关闭,这让我更难看出问题所在.

我 运行 我的测试是这样的:

behat --tags '@mystuff' --config=behat-myconfig.yml --strict --stop-on-failure

有没有办法在测试失败时让远程控制的浏览器保持打开状态?

默认情况下是不可能的。

也许您可以找到一些 hack 来做到这一点,但不推荐这样做,因为每个场景都应该被隔离,这不是一个好的解决方案,至少当 运行 一些套件有多个测试时。

一次只看看您是否可以使用 printscreen 的逻辑并改用 breakpoint

无论如何,您应该使用详细(-vvv 对于 Behat 3)输出 + ide 调试器来调试您的代码。

最后我找到了一个很好的解决方案:behat-fail-aid

将失败辅助添加到您的 FeatureContext,然后 运行 使用 --wait-on-failure 选项:

the --wait-on-failure={seconds} option can be used to investigate/inspect failures in the browser.

您可以在使用 Behat 钩子“AfterStep”出现错误时截图。 考虑看看 Panther Driver 或 DChrome Driver。 这是一个缩短的示例,还考虑了非 javascript 测试(速度更快):

use Behat\Mink\Driver\Selenium2Driver;

/** Context Class Definition ... */

/**
 * @AfterStep
 */
public function takeScreenShotAfterFailedStep(AfterStepScope $scope)
{
    if (99 !== $scope->getTestResult()->getResultCode()) {
        return;
    }
    $this->takeAScreenShot('error');
}


private function takeAScreenShot($prefix = 'screenshot')
{
    $baseName= sprintf('PATH_FOR_YOUR_SCREENSHOTS/%s-%s', $prefix, (new \DateTime())->format('Y_m_d_H_i_s'));

    if ($this->supportsJavascript()) {
        $extension = '.png';
        $content = $this->session->getScreenshot();
    } else {
        $extension = '.html';
        $content = $this->getSession()->getPage()->getOuterHtml();
    }
    file_put_contents(sprintf('%s%s', $baseName, $extension), $content);
}

private function supportsJavascript()
{
    return $this->getSession()->getDriver() instanceof Selenium2Driver;
}