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