--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat MinkExtension.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\MinkExtension\Listener;
+
+use Behat\Behat\EventDispatcher\Event\AfterStepTested;
+use Behat\Behat\EventDispatcher\Event\StepTested;
+use Behat\Testwork\Tester\Result\ExceptionResult;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Behat\Mink\Mink;
+use Behat\Mink\Exception\Exception as MinkException;
+
+/**
+ * Failed step response show listener.
+ * Listens to failed Behat steps and shows last response in a browser.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class FailureShowListener implements EventSubscriberInterface
+{
+ private $mink;
+ private $parameters;
+
+ /**
+ * Initializes initializer.
+ *
+ * @param Mink $mink
+ * @param array $parameters
+ */
+ public function __construct(Mink $mink, array $parameters)
+ {
+ $this->mink = $mink;
+ $this->parameters = $parameters;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function getSubscribedEvents()
+ {
+ return array(
+ StepTested::AFTER => array('showFailedStepResponse', -10)
+ );
+ }
+
+ /**
+ * Shows last response of failed step with preconfigured command.
+ *
+ * Configuration is based on `behat.yml`:
+ *
+ * `show_auto` enable this listener (default to false)
+ * `show_cmd` command to run (`open %s` to open default browser on Mac)
+ * `show_tmp_dir` folder where to store temp files (default is system temp)
+ *
+ * @param AfterStepTested $event
+ *
+ * @throws \RuntimeException if show_cmd is not configured
+ */
+ public function showFailedStepResponse(AfterStepTested $event)
+ {
+ $testResult = $event->getTestResult();
+
+ if (!$testResult instanceof ExceptionResult) {
+ return;
+ }
+
+ if (!$testResult->getException() instanceof MinkException) {
+ return;
+ }
+
+ if (null === $this->parameters['show_cmd']) {
+ throw new \RuntimeException('Set "show_cmd" parameter in behat.yml to be able to open page in browser (ex.: "show_cmd: open %s")');
+ }
+
+ $filename = rtrim($this->parameters['show_tmp_dir'], DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.uniqid().'.html';
+ file_put_contents($filename, $this->mink->getSession()->getPage()->getContent());
+ system(sprintf($this->parameters['show_cmd'], escapeshellarg($filename)));
+ }
+}