четвер, 27 січня 2011 р.

Про Selenium

Для роботи знадобилося написати невеличку софтину, яка забиватиме в браузер дані про оголошення. Вибір впав на Selenium (благо на ньому уже був невеликий тестовий фреймворк, що використовував selenium-maven-plugin). Тести вже були цілком собі настроєні та працювали, але потрібно було мати можливість підіймати сервер вручну з Java-коду. Здавалося б нескладно, проте...
Підключаємо jar-файл з сервером в pom.xml

<dependency>
  <groupId>org.seleniumhq.selenium.server</groupId>
  <artifactId>selenium-server</artifactId>
  <version>1.0.3</version>
</dependency>

Не тут то було - файла з такою версією у репозиторії просто нема. Проте є версія 1.0, яку я і вибрав. Пробуємо запустити сервер:

SeleniumServer server = new SeleniumServer();
server.boot();

Також було написано трохи тестового коду, який логіниться на сайт та виходить з нього, але це в даному контексті жодної ролі не відіграло.
Пробуємо запустити сервер. Отрибуємо зависання при спробі створити профіль для firefox:

16:20:03.919 INFO - Preparing Firefox profile...
16:20:27.822 WARN - GET /selenium-server/driver/?cmd=getNewBrowserSession&1=*fir
efox&2=http%3a%2f%2fsage-webapp1.qa.idc.com HTTP/1.1
java.lang.RuntimeException: Firefox refused shutdown while preparing a profile
at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her.waitForFullProfileToBeCreated(FirefoxCustomProfileLauncher.java:277)
????????????????????????.
Caused by: org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her$FileLockRemainedException: Lock file still present! C:\DOCUME~1\jsvec\LOCALS
~1\Temp\customProfileDir203138\parent.lock

Видно, що firefox створюючи профіль не вимикається, про що свідчить наявність parent.lock. Офіційна документація радить створити окремий профіль для firefox. Спробував перейти по посиланню, де на мене мало чекати щастя. Чекав мене томкатівський 404 еррор. Щоправда створення профілю так чи інакше входило в мої плани (більше того, він уже був готовий і лежав у директорії з ресурсами), бо самописний сертифікат вимагав підтвердження на кожному логіні. Ні, trustAllSSLCertificates не допомагало, та і профіль мав включати не тільки сертифікати. Отже профіль у нас є, тепер згодуємо його серверу при старті, і нас чекає вже щастя.
Код ініціалізації сервера тепер такий:

RemoteControlConfiguration conf = new RemoteControlConfiguration();
conf.setFirefoxProfileTemplate(getFirefoxProfilePath());
conf.setDebugMode(true);
server = new SeleniumServer(conf);

Як видно додався об'єкт RemoteControlConfiguration, якому передано параметр firefoxProfileTemplate. Для тих, кому цікаво, метод, що повертає директорію з профайлом:

protected static File getFirefoxProfilePath() {
URL firefoxProfileResource = SeleniumServerUtil.class.getResource("/firefox/common/");
File firefoxProfileTemplateFolder = new File(firefoxProfileResource.getFile());
return firefoxProfileTemplateFolder;
}

Себто просто дістаємо директорію з профілем і згодовуємо ненаситному серверу. В теорії все добре, але на практиці не допомогло. Ситуація залишилась рівно та сама - не стартує, хоч плач. Заглибившись в нетрі Ґуґла знайшов інформацію, що Selenium версії 1.0 не підтримує firefox 3.6.*. Правда є один спосіб - розібрати jar, та у всіх файлах install.rdf замінити 3.5.* на 3.6.*. Хоч це нескладно і працює - мені не сподобалось. Проте метод дієвий, і ознайомитися з ним можна тут.
Інтернет в один голос кричав, що версія 1.0.3, та навіть 1.0.2 вже впевнено підтримувала нового фокса. Але де її взяти? Вирішив глянути, що притяг у систему плагін селеніума (який працював вище всяких похвал). Ця звірюка притягла selenium-server-coreless версії 1.0.3. Заміна залежності в pom.xml справа кількох секунд. Задоволено потираючи рученята запускаю і... IllegalStateException - неможливо зупинити сервер, що не стартував. Ексепшн - особливість моєї утиліти-обгортки для запуску сервера. Але сервер при старті не видав жодного повідомлення про помилку. Власне от він вилик:

try {
  SeleniumServerUtil.startServer();
  ...
} catch (Exception ex) {
  LOGGER.error("Cannot start selenium server", ex);
}finally{
  SeleniumServerUtil.stopServer();
}

Тобто будь-які помилки відловляться. Звісно, якщо це exception а не error... Міняю Exception у catch на Throwable - ClassNotFound - org.openqa.selenium.NetworkUtils. Копирсаюся далі. У директорії, де знайшовся selenium-server-coreless є ще й selenium-server-standalone а в ньому необхідні класи. Проте репозиторій про такий артефакт не знає. Сил воювати вже нема - просто інсталюю локально:

mvn install:install-file -Dfile=selenium-server-1.0.3-standalone -DgroupId=org.seleniumhq.selenium.server \
-DartifactId=selenium-server-standalone -Dversion=1.0.3 -Dpackaging=jar

Додаю залежність у pom.xml:


  org.seleniumhq.selenium.server
  selenium-server-standalone
  1.0.3
  compile



Пошуки істини тривають...
Найбільші надії зараз на Selenium Server 2.0

Немає коментарів:

Дописати коментар