Se-ниматограф by Dima

Драйвер Selenium (для java) имеет четыре функции для работы со скриншотами:

- captureScreenshot(filename)
- captureScreenshotToString()
- captureEntirePageScreenshot(filename, kwargs)
- captureEntirePageScreenshotToString(kwargs)

Давайте разберёмся, чем они отличаются друг от друга, и в каких случаях какую лучше использовать.

Функция captureScreenshot(filename) делает скриншот в формате png и сохраняет его в указанный файл. Большой недостаток этой функции в том, что она сохраняет обычный скриншот, такой, какой бы получился по нажатию кнопки “Print screen”.

Это значит, что если ваш браузер свернут или не распахнут на весь экран, то вся страница или ее часть не будут видны на скриншоте. Если даже броузер распахнут на весь экран, но страница слишком длинная (или широкая), т.е. ее нужно скроллить, то на скриншоте также будет зафиксирована лишь видимая в данный момент область страницы.

captureScreenshot()

Рис. 1 – результаты работы captureScreenshot()

Этих недостатков нет у функции captureEntirePageScreenshot(filename, kwargs). Создание скриншота происходит средствами самого браузера, и скриншот содержит целиком всю страницу, какой её видит браузер.

captureEntirePageScreenshot()

Рис. 2 – результаты работы captureEntirePageScreenshot()

Дополнительный параметр kwargs позволяет задать цвет фона.

Самое обидное, что поддержка создания скриншотов есть только у Firefox (искаропки) и у IE(если поставить плагин). В наших тестах salesforce для создания скриншотов мы использовали как раз эту функцию, и, признаться, несколько упустили из виду, что работает она не со всеми браузерами. Тесты, конечно, не упадут (а только предупредят, что не удалось сохранить скриншоты), но и картинок не будет.

В нашем случае проблема решается добавлением в CommonActions.getScreenshot() условия использования первой или второй функции в зависимости от текущего браузера:

if (browser == "*chrome" || browser == "*iehta") {
    seleniumInstance.captureEntirePageScreenshot(filename, "");
}
else {
    seleniumInstance.captureScreenshot(filename);
}

Кстати, ситуацию с captureScreenshot можно несколько улучшить, если после запуска браузера развернуть его на весь экран с помощью функции windowMaximize(). Так вы хотя бы будете уверены, что браузер виден.

Осталось разобраться с captureScreenshotToString() и captureEntirePageScreenshotToString().

Если тесты выполняются на Selenium Grid (то есть Hub и один или больше RC), то сохранением скриншотов для описанных выше функций captureScreenshot() и captureEntirePage() занимается RC. Если и hub, и RC находятся на одной машине, вы этого, скорее всего, и не заметите. Однако если ваш Selenium Hub находится на одном PC, а RC – на другом, вы должны это обязательно учитывать, потому что файлы скриншотов будут создаваться на том PC, на котором работает RC. Если вы указываете в качестве параметра только имя файла, файл сохранится в текущей для RC папке. Если же вы используете полный или относительный путь к файлу, например, “C:\screenshots\screen_1.png”, то необходимо убедиться, что заданная папка существует именно на машине с RC – иначе будет сгенерировано исключение.

Но! В случае с удалённым RC хотелось бы иметь возможность получать скриншоты сразу на ту машину, на которой выполняются тесты, а не заниматься потом специально копированием. Это как раз и позволяют сделать функции captureScreenshotToString() и captureEntirePageScreenshotToString().

Вместо того, чтобы сразу сохранять скриншот в файл, они возвращают строку, содержащую закодированный в base64 скриншот. Всё, что остаётся – это раскодировать скриншот и сохранить его в файл – теперь уже в любом удобном месте.

Вот как будет выглядеть функция для раскодирования и сохранения полученного скриншота:

import sun.misc.BASE64Decoder;
import java.io.*;
 
//....
 
public static boolean decodeAndWriteScreenshot(String screen, String filename) {
   if (screen==null) {
      return false;
   }
   BASE64Decoder decoder = new BASE64Decoder();
   byte[] decoded;
   OutputStream out;
   try {
      decoded = decoder.decodeBuffer(screen);
       out = new FileOutputStream(filename);
       try {
          out.write(decoded);
       } finally {
          out.close();
       }
   } catch (Exception E){
      return false;
   }
   return true;
}

В примере использован sun.misc.BASE64Decoder, обратите внимание – его использование не рекомендуется.

Нужно сказать, что функции captureEntirePageScreenshotToString() может и не быть в других драйверах Selenium – например, в драйвере PHP её нет.

Таким образом, самая универсальный функция для получения скриншотов (она будет работать для всех браузеров, для всех драйверов, и позволит сохранять файл на машине, где запущены тесты) – это функция captureScreenshotToString().

Если же вы пишете тесты на java и планируете использовать только Firefox и IE, вам наверняка будет удобнее работать со скриншотами, которые делает функция CaptureEntirePageScreenshotToString().

Вы можете сами посмотреть на различия между captureScreenshotToString() и captureEntirePageScreenshotToString() для вашего сайта. Для этого можете скачать пример (на java) и поменять в нём значение webSite.


br

Print this post | Home

One comment

  1. Jimmy says:

    Скачал альфа-версию php-драйвера testing_selenium v 0.4.4. В нем не оказалось метода captureScreenshotToString(), был только captureScreenshot().