/** * Listens to "step.after" event. * * @param StepEvent $event * * @uses printStep() */ public function afterStep(StepEvent $event) { if ($this->inBackground && $this->isBackgroundPrinted) { return; } if ($this->isStepChainParent($event->getStep())) { $isStepChainParent = true; $this->inChain = false; } if (!$this->inBackground && $this->inOutlineExample) { $this->delayedStepEvents[] = $event; return; } if ($this->inChain) { $this->chainedSteps[] = $event; return; } $this->printStep($event->getStep(), $event->getResult(), $event->getDefinition(), $event->getSnippet(), $event->getException()); if (isset($this->chainedSteps) && count($this->chainedSteps) && isset($isStepChainParent) && $isStepChainParent) { foreach ($this->chainedSteps as $event) { $this->write($this->indent); $this->printStep($event->getStep(), $event->getResult(), $event->getDefinition(), $event->getSnippet(), $event->getException()); } $this->chainedSteps = []; } }
/** * Automated Screenshot on fail * * * @AfterStep */ public function afterStep(Behat\Behat\Event\StepEvent $event) { $context = $event->getContext(); if ($context->getMinkParameter('browser_name') == 'phantomjs' && $event->getResult() == StepEvent::FAILED) { $this->iTakeAScreenshotWithName('fail'); } }
/** * Take a screenshot when a step fails * * @param StepEvent $event * * @AfterStep */ public function takeScreenshotAfterFailedStep(StepEvent $event) { if ($event->getResult() === StepEvent::FAILED) { $driver = $this->getSession()->getDriver(); $rootDir = dirname($this->getParameter('kernel.root_dir')); $filePath = $event->getLogicalParent()->getFile(); $stepStats = ['scenario_file' => substr($filePath, strlen($rootDir) + 1), 'scenario_line' => $event->getLogicalParent()->getLine(), 'scenario_label' => $event->getLogicalParent()->getTitle(), 'exception' => $event->getException()->getMessage(), 'step_line' => $event->getStep()->getLine(), 'step_label' => $event->getStep()->getText(), 'status' => 'failed']; if ($driver instanceof Selenium2Driver) { $dir = getenv('WORKSPACE'); $buildUrl = getenv('BUILD_URL'); if (false !== $dir) { $dir = sprintf('%s/app/build/screenshots', $dir); } else { $dir = '/tmp/behat/screenshots'; } $lineNum = $event->getStep()->getLine(); $filename = strstr($event->getLogicalParent()->getFile(), 'features/'); $filename = sprintf('%s.%d.png', str_replace('/', '__', $filename), $lineNum); $path = sprintf('%s/%s', $dir, $filename); $fs = new \Symfony\Component\Filesystem\Filesystem(); $fs->dumpFile($path, $driver->getScreenshot()); if (false !== $dir) { $path = sprintf('%s/artifact/app/build/screenshots/%s', $buildUrl, $filename); } $stepStats['screenshot'] = $path; $this->getMainContext()->addErrorMessage("Step {$lineNum} failed, screenshot available at {$path}"); } if ('JENKINS' === getenv('BEHAT_CONTEXT')) { echo sprintf("[1;37m##glados_step##%s##glados_step##[0m\n", json_encode($stepStats)); } } }
function it_should_stop_coverage_on_afterStep_event(CodeCoverageSession $coverageSession, StepEvent $step, StepNode $node) { $step->getStep()->willReturn($node); $step->getResult()->willReturn(StepEvent::PASSED); $coverageSession->stop()->shouldBeCalled(); $this->afterStep($step); }
/** * @AfterStep @javascript */ public function failScreenshots(StepEvent $event) { if ($event->getResult() == StepEvent::FAILED) { $scenarioName = urlencode(str_replace(' ', '_', $event->getStep()->getParent()->getTitle())); $filename = sprintf('fail_%s_%s.png', time(), $scenarioName); $this->saveScreenshot($filename, $this->screenshotDir); } }
/** * Take screenshot when step fails. * Works only with Selenium2Driver. * * @AfterStep */ public function takeScreenshotAfterFailedStep(StepEvent $event) { if (StepEvent::FAILED === $event->getResult()) { echo 'This step failed.'; $driver = $this->getSession()->getDriver(); if ($driver instanceof Selenium2Driver) { $step = $event->getStep(); $id = $step->getParent()->getTitle() . '.' . $step->getType() . ' ' . $step->getText(); $fileName = 'Test/Framework/app/screenshot/' . 'Fail.' . preg_replace('/[^a-zA-Z0-9-_\\.]/', '_', $id) . '.jpg'; file_put_contents($fileName, $driver->getScreenshot()); } } else { if ($event->getResult() == 1) { echo 'This step skipped.'; } } }
/** * After state hook to write failure back to the page, which alerts phantom to a * failure. See: http://shaneauckland.co.uk/2012/11/capturing-screenshots-with-mink-sahi-and-phantomjs/ * * @AfterStep */ public function afterStep(StepEvent $event) { $context = $event->getContext(); if ($context->getMinkParameter('browser_name') == 'phantomjs' && $event->getResult() == StepEvent::FAILED) { $javascript = 'window.callPhantom({value:"fail"})'; $context->getSession()->executeScript($javascript); } }
/** * @AfterStep * * Save the output HTML & a screenshot after a failed test. * * @param \Behat\Behat\Event\StepEvent $event */ public function debugDumpAfterFailedStep(\Behat\Behat\Event\StepEvent $event) { if ($event->getResult() !== $event::FAILED) { return; } // Build the information text. $stepInfo = sprintf('Debug FAILED step (%s):', $event->getStep()->getText()); $this->_debugDumpSession(array($stepInfo), $this->debug['dump_html'], $this->debug['dump_screenshot']); }
/** * 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 StepEvent $event */ public function showFailedStepResponse($event) { if (StepEvent::FAILED !== $event->getResult()) { 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))); }
/** @AfterStep */ public function afterStep(StepEvent $event) { /** * @var $context \Behat\MinkExtension\Context\MinkContext */ $context = $event->getContext(); if ($this->parameters['screenshots']['enabled'] && $context->getMinkParameter('browser_name') == 'phantomjs' && $event->getResult() == StepEvent::FAILED) { $string = str_replace("'", "_", $event->getStep()->getLine() . ":" . $event->getStep()->getText()); $context->getSession()->executeScript('window.callPhantom(\'' . $string . '\')'); //TODO: show output via console; toggle output print "Wrote screenshot to {$string}\n"; } }
/** * Listens to "step.after" event. * * @param StepEvent $event * * @uses printStep() */ public function afterStep(StepEvent $event) { if ($this->inBackground && $this->isBackgroundPrinted) { return; } if (!$this->inBackground && $this->inOutlineExample) { $this->delayedStepEvents[] = $event; return; } $this->printStep($event->getStep(), $event->getResult(), $event->getDefinition(), $event->getSnippet(), $event->getException()); }
/** * @AfterStep @javascript * * After every step in a @javascript scenario, we want to wait for AJAX * loading to finish. */ public function afterStep(StepEvent $event) { if ($event->getResult() === 0) { $this->iWaitForAJAX(); } }
/** * Execute any steps required after the step has finished. * * This includes creating an HTML dump of the content if there was a failure. * * @param StepEvent $event event fired after step. * @AfterStep */ public function after_step(StepEvent $event) { global $CFG, $DB; // Save the page content if the step failed. if (!empty($CFG->behat_faildump_path) && $event->getResult() === StepEvent::FAILED) { $this->take_contentdump($event); } // Abort any open transactions to prevent subsequent tests hanging. // This does the same as abort_all_db_transactions(), but doesn't call error_log() as we don't // want to see a message in the behat output. if ($event->hasException()) { if ($DB && $DB->is_transaction_started()) { $DB->force_transaction_rollback(); } } }
/** * Converts the behat-Result to the serverSide format. * * @param StepEvent $event The event containing the behat StepResult. * @return stub_php\stepResult */ public function convertResultToStepResult(StepEvent $event) { switch ($event->getResult()) { case StepEvent::PASSED: return stub_php\stepResult::SUCCESS; case StepEvent::UNDEFINED: case StepEvent::PENDING: case StepEvent::SKIPPED: return stub_php\stepResult::SKIPPED; case StepEvent::FAILED: if ($event->hasException() && !$this->_isAssertionError($event->getException())) { return stub_php\stepResult::ERROR; } else { return stub_php\stepResult::FAILURE; } default: return stub_php\stepResult::ERROR; } }
/** * Collects step statistics. * * @param Behat\Behat\Event\StepEvent $event step.after event */ private function collectStepStats(StepEvent $event) { ++$this->stepsCount; ++$this->stepsStatuses[$this->statuses[$event->getResult()]]; switch ($event->getResult()) { case StepEvent::UNDEFINED: $hash = $event->getSnippet()->getHash(); if (!isset($this->definitionsSnippets[$hash])) { $this->definitionsSnippets[$hash] = $event->getSnippet(); } else { $this->definitionsSnippets[$hash]->addStep($event->getSnippet()->getLastStep()); } break; case StepEvent::FAILED: $this->failedStepsEvents[] = $event; break; case StepEvent::PENDING: $this->pendingStepsEvents[] = $event; break; } }
/** * Execute any steps required after the step has finished. * * This includes creating an HTML dump of the content if there was a failure. * * @param StepEvent $event event fired after step. * @AfterStep */ public function after_step(StepEvent $event) { global $CFG; // Save the page content if the step failed. if (!empty($CFG->behat_faildump_path) && $event->getResult() === StepEvent::FAILED) { $this->take_contentdump($event); } }
/** * Listens to "step.after" event. * * @param StepEvent $event */ public function afterStep(StepEvent $event) { if ($event->hasException()) { if ($event->getResult() === StepEvent::SKIPPED || $event->getResult() === StepEvent::PENDING || $event->getResult() === StepEvent::UNDEFINED) { $this->pendingCount++; } else { $this->exceptions[] = $event->getException(); $this->exceptionsCount++; $this->failureCount++; } } ++$this->stepsCount; ++$this->scenarioStepsCount; }
/** @AfterStep */ public function after(\Behat\Behat\Event\StepEvent $event) { if ($event->getResult() == \Behat\Behat\Event\StepEvent::FAILED) { $screenshot_path = $this->getParameter('screenshots_path'); if ($screenshot_path) { $fileName = uniqid() . '.png'; $path = rtrim($screenshot_path, '/') . '/' . $fileName; $this->getSession()->getDriver()->capturePageScreenshot($path); $screenshot_url = $this->getParameter('screenshots_url'); echo "Captured screenshot: " . ($screenshot_url ? $screenshot_url . '/' . $fileName : $path) . PHP_EOL; } } }
/** * Collects step statistics. * * @param Behat\Behat\Event\StepEvent $event step.after event */ protected function collectStepStats(StepEvent $event) { ++$this->stepsCount; ++$this->stepsStatuses[$this->statuses[$event->getResult()]]; switch ($event->getResult()) { case StepEvent::UNDEFINED: foreach ($event->getSnippet() as $key => $snippet) { if (!isset($this->definitionsSnippets[$key])) { $this->definitionsSnippets[$key] = $snippet; } } break; case StepEvent::FAILED: $this->failedStepsEvents[] = $event; break; case StepEvent::PENDING: $this->pendingStepsEvents[] = $event; break; } }
/** * Return recorded events * * @return array */ public function getEvents() { $events = $this->getEventRecorder()->rip(); foreach ($events as $key => $eventTurple) { list($name, $event) = $eventTurple; if ($event instanceof StepEvent) { $event = new StepEvent($event->getStep(), $event->getLogicalParent(), new NullContext(), $event->getResult(), null, $event->getException() ? new WorkerException($event->getException()->getMessage()) : null, $event->getSnippet()); } if ($event instanceof OutlineExampleEvent) { $event = new OutlineExampleEvent($event->getOutline(), $event->getIteration(), new NullContext(), $event->getResult(), $event->isSkipped()); } if ($event instanceof ScenarioEvent) { $event = new ScenarioEvent($event->getScenario(), new NullContext(), $event->getResult(), $event->isSkipped()); } $event->setDispatcher(new NullEventDispatcher()); $events[$key] = array($name, $event); } return $events; }
/** * Take a screenshot when a step fails * * @param StepEvent $event * * @AfterStep */ public function takeScreenshotAfterFailedStep(StepEvent $event) { if ($event->getResult() === StepEvent::FAILED) { $driver = $this->getSession()->getDriver(); if ($driver instanceof Selenium2Driver) { $dir = getenv('WORKSPACE'); $buildUrl = getenv('BUILD_URL'); if (false !== $dir) { $dir = sprintf('%s/app/build/screenshots', $dir); } else { $dir = '/tmp/behat/screenshots'; } $lineNum = $event->getStep()->getLine(); $filename = strstr($event->getLogicalParent()->getFile(), 'features/'); $filename = sprintf('%s.%d.png', str_replace('/', '__', $filename), $lineNum); $path = sprintf('%s/%s', $dir, $filename); $fs = new \Symfony\Component\Filesystem\Filesystem(); $fs->dumpFile($path, $driver->getScreenshot()); if (false !== $dir) { $path = sprintf('%s/artifact/app/build/screenshots/%s', $buildUrl, $filename); } $this->addErrorMessage("Step {$lineNum} failed, screenshot available at {$path}"); } } }
public function afterStep(StepEvent $event) { if (!$this->enabled) { return; } if (in_array($event->getResult(), $this->ignoredStates)) { return; } // screenshot not needed for these states $file = $event->getStep()->getParent()->getFeature()->getFile(); $line = $event->getStep()->getLine(); $filename = str_replace('/', '_', ltrim(str_replace($this->rootDir, '', $file), '/')) . '_' . $line . '.png'; /** @var BehatContext $ctx */ $ctx = $event->getContext(); $screenData = $ctx->getSession()->currentScreenshot(); file_put_contents($this->outDir . '/' . $filename, $screenData); $this->currentReport['steps'][] = array('text' => $event->getStep()->getText(), 'file' => $filename, 'result' => $event->getResult(), 'exception' => ($ex = $event->getException()) ? $ex->getMessage() : NULL); }
/** * Take screenshot when step fails. * Works only with Selenium2Driver. * * @AfterStep */ public function takeScreenshotAfterFailedStep(StepEvent $event) { if (4 === $event->getResult()) { try { $this->takeScreenshot($event); } catch (\WebDriver\Exception $e) { $this->logException($e); } } }
/** * Listens to "step.after" event. * * @param Behat\Behat\Event\StepEvent $event * * @uses printStep() */ public function afterStep(StepEvent $event) { $this->printStep($event->getStep(), $event->getResult(), $event->getDefinition(), $event->getSnippet(), $event->getException()); }