Есть ли способ автоматически сделать скриншот сбоя во время автоматизации сайта? - PullRequest
1 голос
/ 28 марта 2019

Все мои сценарии автоматизации должны запускаться в полночь, и я вижу сбои в отчете на следующее утро и не могу воспроизвести их, а мои поднятые проблемы для разработчиков отклоняются как непроизводимые.Я хочу создать среду, которая будет способна делать скриншоты веб-страницы после неудачного шага.* Код написан на Gherkin Language * Мы используем стандартные функции Mink и некоторые пользовательские функции PHP * Мы используем Gitlab и Gitlab runner для выполнения

Я новичок в Behat и PHP.Итак, я еще ничего не пробовал.

  • В идеале я хотел бы увидеть скриншоты сбоев с именем изображения, конкретной строкой или каким-то уникальным идентификатором.
  • Изображения могут быть сохранены в хранилище [Cloud / gitlab / Local system]

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

В Behat доступно много готовых расширений, так же, как вы используете библиотеку Mink для имитации взаимодействия пользователя с браузером.Аналогично, есть также расширение для скриншотов, которое делает снимки экрана для неудачных шагов.Вы можете найти детали здесь - https://packagist.org/packages/bex/behat-screenshot

0 голосов
/ 28 мая 2019

Это сделало работу за меня:

public function takeScreenshotAfterFailedStep(AfterStepScope $scope) {

    try {    

       $session =  $this->getSession();

       if (99 === $scope->getTestResult()->getResultCode()) {
          $stepName = $scope->getStep()->getText();   
          $this->takeScreenshot($stepName);
          echo "\n\nYour test may have failed - ";
          echo "\nCurrent Page URL: ". $session->getCurrentUrl();
       }
    } catch(Exception $e) {

        $e_msg = "Something went wrong when taking screenshots";
        throw new Exception($e_msg, $e->getCode(), $e);
    }

} 

public function takeScreenshot($stepName=null) {

    echo "The current working directory:  " . getcwd() . "\n";

    $filePath = getcwd();      // default path

    date_default_timezone_set('America/New_York');    
    $fileName =   'screenshot-' . uniqid() . '_' . date('Y-m-d-H-i-s') .'.png';

    # if directory path is specified in Behat yml, use it.
    if (isset($this->parameters['screen_shot_path'])) {
       $filePath = $this->parameters['screen_shot_path'];
    }

    $this->saveScreenshot($fileName, $filePath);
    echo "\nScreenshot taken -> " . $fileName . "\n";
}
0 голосов
/ 29 марта 2019

Добавьте после шага хука , который может с этим справиться.

Затем на крючке вы просто делаете скриншот.

Найден фрагмент кода здесь, который может вам помочь.

    /**
     * @AfterStep
     */
    public function takeScreenshotAfterFailedStep(AfterStepScope $scope)
    {
        if (TestResult::FAILED === $scope->getTestResult()->getResultCode()) {
            $driver = $this->minkContext->getSession()->getDriver();

            if (!$driver instanceof Behat\Mink\Driver\Selenium2Driver) {
                return;
            }

            $page               = $this->minkContext->getSession()->getPage()->getContent();
            $screenshot         = $driver->getScreenshot();
            $screenshotFileName = date('d-m-y').'-'.uniqid().'.png';
            $pageFileName       = date('d-m-y').'-'.uniqid().'.html';
            // NOTE: hardcoded path:
            $filePath           = "/var/www/symfony.dev/";

            file_put_contents($filePath.$screenshotFileName, $screenshot);
            file_put_contents($filePath.$pageFileName, $page);
            print 'Screenshot at: '.$filePath.$screenshotFileName."\n";
            print 'HTML dump at: '.$filePath.$pageFileName."\n";
        }
    }
...