WebDriver

w3cselenium

WebDriver

Сегодня я Вам расскажу о стандарте WebDriver от W3C. Данный стандарт применим для управления браузерами посредством замечательного инструмента — selenium. Основным ключевым моментом является отправка команд и получение ответа от selenium посредством REST технологии (где запрос на получение данных осуществляется путем отправки GET запроса, а установка значения или изменения состояния посредством POST запроса, DELETE очистка куков, закрытие окон, закрытие сессии).

Давайте на примере поподробнее рассмотрим как происходит общение с webdriver. Для этого у нас должен уже быть запущен selenium или же запущен браузер, в котором есть встроенный webdriver. Общение происходит по протоколу HTTP имеет стандартный заголовок (GET, POST, DELETE) и если используется POST, то в качестве тела сообщения передается JSON сообщение с дополнительными параметрами. Результат возвращается тоже в формате JSON.

Итак рассмотрим случай когда нам нужно открыть браузер — firefox. Для этого отправляем POST запрос selenium:

POST /wd/hub/ HTTP/1.0
Host: localhost:4444
Content-Type: application/json;charset=UTF-8
Accept: application/json
Content-Length: ...

{"desiredCapabilities":{"browserName":"firefox","moz:experimental-webdriver":true,"platform":"ANY","webdriver_firefox_port":8888}}

Немного прокомментирую. Во-первых советую указывать версию протокола 1.0 (HTTP/1.0) потому как более корректно будет selenium реагировать на Ваши команды.  В json мы указываем, что должен запуститься браузер — firefox, на любой платформе (Windows, Linux и т.д.), а так же порт для браузера — 8888 (этот порт открывается браузером и при запуске нескольких потоков они начинают конфликтовать между собой).  Так же в этом JSON можно задавать и настройки браузера для работы через прокси:

{"desiredCapabilities":{"browserName":"firefox","moz:experimental-webdriver":true,"platform":"ANY","webdriver_firefox_port":8888, "proxy" : {"proxyType" : "manual",  "ftpProxy" : "127.0.0.1:3128", "httpProxy" : "127.0.0.1:3128", "sslProxy" : "127.0.0.1:3128", "socksProxy" : "127.0.0.1:3128"}}}

Ответ придет в формате JSON и будет примерно такого содержания:

{"state":null,"sessionId":"d11d3b46-d27a-47d6-bb0e-035dd82eb23b","hCode":2990915,"value":{"applicationCacheEnabled":true,"rotatable":false,"handlesAlerts":true,"databaseEnabled":true,"version":"46.0","platform":"WINDOWS","nativeEvents":false,"acceptSslCerts":true,"webdriver.remote.sessionid":"d11d3b46-d27a-47d6-bb0e-035dd82eb23b","webStorageEnabled":true,"locationContextEnabled":true,"browserName":"firefox","takesScreenshot":true,"javascriptEnabled":true,"cssSelectorsEnabled":true},"class":"org.openqa.selenium.remote.Response","status":0}

Где «sessionId» — идентификатор сессии, т.е. ключ по которому selenium будет понимать к какому (условно) браузеру применять Ваши команды.  А так же другая информация: версия браузера, платформа, статус операции и прочее.

Я надеюсь общая картина стала понятной? Теперь перейдем к собственно списку команд оговоренным стандартом:

Метод URI шаблон Описание
POST /session Новая сессия
DELETE /session/{session id} Удалить указанную сессию
GET /status Получить текущий статус
GET /session/{session id}/timeouts Получить текущее время ожидания браузера
POST /session/{session id}/timeouts Установить время ожидания браузера
POST /session/{session id}/url Перейти по указанному URL
GET /session/{session id}/url Получить текущий адрес — URL
POST /session/{session id}/back Вернутся браузеру назад
POST /session/{session id}/forward Перейти браузеру вперед
POST /session/{session id}/refresh Обновить текущую страницу
GET /session/{session id}/title Получить заголовок браузера/страницы
GET /session/{session id}/window Получить указатель окна
DELETE /session/{session id}/window Закрыть текущее окно
POST /session/{session id}/window Переключиться к указанному окну
GET /session/{session id}/window/handles Получить список указателей на окна
POST /session/{session id}/frame Переключится к указанному фрейму
POST /session/{session id}/frame/parent Переключиться к вышестоящему фрейму
GET /session/{session id}/window/rect Get Window Rect
POST /session/{session id}/window/rect Set Window Rect
POST /session/{session id}/window/maximize Распахнуть окно
POST /session/{session id}/window/minimize Свернуть окно
POST /session/{session id}/window/fullscreen Окно на весь экран
GET /session/{session id}/element/active Получить данные об активном элементе
POST /session/{session id}/element Найти указанный элемент
POST /session/{session id}/elements Найти все элементы
POST /session/{session id}/element/{element id}/element Найти дочерний элемент указанного элемента
POST /session/{session id}/element/{element id}/elements Найти все дочерние элементы указанного элемента
GET /session/{session id}/element/{element id}/selected Выделен ли указанный элемент?
GET /session/{session id}/element/{element id}/attribute/{name} Получить атрибут элемента
GET /session/{session id}/element/{element id}/property/{name} Получить свойство элемента
GET /session/{session id}/element/{element id}/css/{property name} Получить CSS свойство элемента
GET /session/{session id}/element/{element id}/text Получить текст элемента
GET /session/{session id}/element/{element id}/name Получить имя тега
GET /session/{session id}/element/{element id}/rect Get Element Rect
GET /session/{session id}/element/{element id}/enabled Проверка элемент доступен
POST /session/{session id}/element/{element id}/click Осуществить щелчек мышкой по указанному элементу
POST /session/{session id}/element/{element id}/clear Очистка элемента
POST /session/{session id}/element/{element id}/value Установка значения элементу
GET /session/{session id}/source Получить исходный код страницы
POST /session/{session id}/execute/sync Выполнить указанный скрипт (синхронно — последовательно)
POST /session/{session id}/execute/async Выполнить указанный скрипт асинхронно (паралельно)
GET /session/{session id}/cookie Получить все куки
GET /session/{session id}/cookie/{name} Получить указанное значение куки
POST /session/{session id}/cookie Установить куку
DELETE /session/{session id}/cookie/{name} Удалить указанную куку
DELETE /session/{session id)/cookie Очистить куки
POST /session/{session id}/actions Perform Actions
DELETE /session/{session id}/actions Release Actions
POST /session/{session id}/alert/dismiss Запретить всплывающие сообщения
POST /session/{session id}/alert/accept Включить всплывающие сообщения
GET /session/{session id}/alert/text Получить текст всплывающего сообщения
POST /session/{session id}/alert/text Послать всплывающее сообщение
GET /session/{session id}/screenshot Получить снимок экрана браузера
GET /session/{session id}/element/{element id}/screenshot Получить снимок элемента

Вместо: {session id} нужно подставлять индентификатор сессии. Внутри сессии могут быть открыты несколько окон браузера или несколько вкладок в браузере. Для определения к какому окну осуществлять операции — используються указатели окон. Т.е. сессии индентификаторы браузера (firefox, chrome, opera и т.д., а также настройки для указанного сеанса), а внутри этих браузеров есть еще и указатели на вкладки или окна этого браузера.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *