Скриншот с Selenium Webdriver и PHPUnit

#php #selenium #phpunit

#php #selenium #phpunit

Вопрос:

Я знаю, что скриншоты можно было бы делать, расширяя PHPUnit_Extensions_Selenium2TestCase но прямо сейчас я использую Facebook php-webdriver, поэтому я просто расширяю с PHPUnit_Framework_TestCase

Есть ли способ делать скриншоты только с этим драйвером, не расширяя расширение?

Спасибо.

Ответ №1:

 $driver->takeScreenshot('/path/to/image.png');
  

Комментарии:

1. takeScreenshot() также возвращает данные изображения. Попробуйте $image = $driver->takeScreenshot(); , если хотите использовать изображение немедленно, вместо того, чтобы сохранять его на диске.

2. Он отлично работает для открытой страницы, но его всплывающая страница не работает

Ответ №2:

Я нашел такое решение, чтобы сделать скриншот при сбое:

 /**
 * {@inheritdoc}
 */
public function tearDown()
{
    $status = $this->getStatus();
    if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR 
        || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
        $now = new DateTime('now');
        $screenshotFileName = $this->getParameter('screenshots_directory_full_path');
        $screenshotFileName = $screenshotFileName . $now->format('Y-m-d H:i:s') . ' test ' . $this->getName() . '.png';

        $this->webDriver->takeScreenshot($screenshotFileName);
    }
    $this->webDriver->quit();
}
  

Вы спрашивали об этом давно, но надеюсь, это поможет кому-нибудь еще 🙂

Ответ №3:

основываясь на том, что сказал @a_sarana. как минимум в версиях > = 5 вы можете использовать метод phpunit:

 $this->hasFailed();
  

пример

 if($this->hasFailed())
{
    $selenium->takeScreenshot($filename);   
}
  

Это предполагает, что вам все равно, какой тип сбоя произошел.

Примечание, если в итоге вы получите пустые скриншоты, возможно, вам придется дождаться загрузки страницы. Я потерял около половины рабочего дня на отладку этого.

пример

 sleep(1); // one second
  

или

 // wait max of 2 sec check every 1/10 sec until element is viable
$driver->wait(2, 1000)->until(
    WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::id("elementID")) 
);