вторник, 10 апреля 2012 г.

WebDriverJS

Решил я значит посмотреть на javascript версию WebDriver. Так для своего интереса.

Нет, лукавлю, не для интереса. Была надежда на то что скрипт можно будет запускать прямо из браузера для автоматизации внутри этого же браузера !
Моим надеждам не суждено было оправдаться.....

Кратко расскажу почему.

1. Компиляция WebDriverJs.

Следую инструкции отсюда начал компиляцию, в процессе которой вылезла ошибка недостаточного heap для явы.
Для ее исправления правим файл go.bat
Полученная строка будет выглядеть так:

java -Xmx512m -XX:MaxPermSize=284m -XX:ReservedCodeCacheSize=128m -client -jar third_party\jruby\jruby-complete.jar -X-C -S rake %*

Теперь запуск команды

>go webdriverjs

проходит успешно. На выходе в папке build мы получаем папку с webdriver.js файлом.
Этот файл и есть нужная нам библиотека.

2.Использование

Первые попытки запуска примеров потерпели неудачу. После недельных изысканий и выноса мозга свои коллегам было найдено наконец решение.

В файле библиотеки необходимо заменить последнюю строку на следующую:

;for(var key in webdriver)this[key]=webdriver[key];delete this.webdriver;}).call(typeof exports!=='undefined'&&exports===this?exports:this.webdriver=this.webdriver||{})

После этого все примеры начали работать.

3.Разочарование

Больше всего надежд я возлагал на метод использования описанный тут

Controlling the Host Browser

Launching a browser to run a WebDriver test against another browser is a tad redundant (compared to simply using node). Instead, using WebDriverJS in the browser is intended for automating the browser actually running the script. This can be accomplished as long as the URL for the server and session ID for the browser are known. While these values may be passed to the builder directly, they may also be defined using the wdurl and wdsid "environment variables", which are parsed from the loading page's URL query data:
<!-- Assuming HTML URL is /test.html?wdurl=http://localhost:4444/wd/hub&wdsid=foo1234 -->
<!DOCTYPE html>
<script src="webdriver.js"></script>
<input id="input" type="text"/>
<script>
  // Attaches to the server and session controlling this browser.
  var driver = new webdriver.Builder().build();

  var input = driver.findElement(webdriver.By.tagName('input'));
  input.sendKeys('foo bar baz').then(function() {
    assertEquals('foo bar baz',
        document.getElementById('input').value);
  });
</script>
 
Казалось бы все круто... Мы открываем браузер и нашу страницу test.html и тест 
сразу же начинает выполняться...
Но не тут то было!!!
 
Для начала нам необходимо передать параметры хоста где запущен сервер и сессию для
которой все это делать 
то есть результирующий урл запуска будет:  
 
/test.html?wdurl=http://localhost:4444/wd/hub&wdsid=foo1234 
 
Выяснилась еще одна проблема, как создать сессию ... так как сам новую сессию он не
 включает. ((((
Ну хорошо, для создания сессии идем на хост где запущен сервер 
 http://localhost:4444/wd/hub/static/resource/hub.html
нажимаем Create Session, выбираем браузер... 
У нас запускается браузер и мы видим сессию в которой он запущен

Отлично берем сессию и вставляем его как параметр нашей страницы
 
результирующий урл запуска будет: 
 
 /test.html?wdurl=http://localhost:4444/wd/hub&wdsid=1334043676191  
 
или что-то типа того.
 
Снова запускаем наш тест... и.... опять провал !!!! почему ? 
да потому что тест наш надо запускать в браузере запущенном самим сервером, так 
как в нем установлено дополнение которое взаимодействует с сервером.
 
Хорошо, запустим там.... вуаля ... все сработало как надо ...
 
Но это не то что я искал, я надеялся что сервер в этом процессе участвовать не 
будет и браузер где мы запускаем тесты может быть на машине клиента... А так он 
все равно на стороне сервера.

Разочарование ((((
 
 

 
   

2 комментария:

  1. Есть простое решение используя Selenium Grid и расширения сервлетов.

    Стартуем Selenium Hub:
    java -jar selenium-server-standalone-2.24.1.jar -role hub -servlets org.openqa.selenium.remote.server.DriverServlet

    Затем стартуем Selenium Node:
    java -jar selenium-server-standalone-2.24.1.jar -role node -hub http://localhost:4444/grid/register

    Потом используем этот сервлет с помощью WebDriverJs:
    var client = new webdriver.http.CorsClient('http://localhost:4444/grid/admin/DriverServlet');

    ОтветитьУдалить
    Ответы
    1. Это конечно можно но основная моя задумка от использования WebDriverJS была в отказе от сервера и прочих внешних штук.

      Спасибо про информацию про расширение сервлетов ) Если честно не знал )

      Удалить