- Web applications testing and Selenium blog by Deep Shift Labs - http://www.deepshiftlabs.com/sel_blog -

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

Posted By by Dima On 28 July 2010 @ 14:14 | Comments Disabled

[1]

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

- captureScreenshot(filename) [2]
- captureScreenshotToString() [3]
- captureEntirePageScreenshot(filename, kwargs) [4]
- captureEntirePageScreenshotToString(kwargs) [5]

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

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

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

captureScreenshot() [6]

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

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

captureEntirePageScreenshot() [7]

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

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

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

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

View Code [8] JAVA
if (browser == "*chrome" || browser == "*iehta") {
    seleniumInstance.captureEntirePageScreenshot(filename, "");
}
else {
    seleniumInstance.captureScreenshot(filename);
}

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

Осталось разобраться с 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 скриншот. Всё, что остаётся – это раскодировать скриншот и сохранить его в файл – теперь уже в любом удобном месте.

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

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

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

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

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

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

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


br


Article printed from Web applications testing and Selenium blog by Deep Shift Labs: http://www.deepshiftlabs.com/sel_blog

URL to article: http://www.deepshiftlabs.com/sel_blog/?p=1480&lang=ru

URLs in this post:

[1] Image: http://ru.wikipedia.org/wiki/Каникулы_в_Простоквашино

[2] captureScreenshot(filename): http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#captureScreenshot(java.lang.String)

[3] captureScreenshotToString(): http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#captureScreenshotToString()

[4] captureEntirePageScreenshot(filename, kwargs): http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#captureEntirePageScreenshot(java.lang.String, java.lang.String)

[5] captureEntirePageScreenshotToString(kwargs): http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#captureEntirePageScreenshotToString(java.lang.String)

[6] Image: http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2010/07/captureScreenshotToString.png

[7] Image: http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2010/07/captureEntirePageScreenshot.png

[8] View Code: http://www.deepshiftlabs.com/sel_blogjavascript:;

[9] windowMaximize(): http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#windowMaximize()

[10] String: http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky

[11] OutputStream: http://www.google.com/search?hl=en&q=allinurl%3Aoutputstream+java.sun.com&btnI=I%27m%20Feeling%20Lucky

[12] FileOutputStream: http://www.google.com/search?hl=en&q=allinurl%3Afileoutputstream+java.sun.com&btnI=I%27m%20Feeling%20Lucky

[13] Exception: http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky

[14] не рекомендуется: http://java.sun.com/products/jdk/faq/faq-sun-packages.html

[15] драйвере PHP: http://pear.php.net/package/Testing_Selenium

[16] скачать пример: http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2010/07/screenshoots_example.zip

Content copyright © 2009 Deep Shift Labs.