В недрах FACEBOOK была разработана библиотека на PHP — php-webdriver. Данная библиотека работает в связке с SELENIUM, исходный код которого выложен на GitHub. Что это за чудо? Что может? Зачем это им нужно было разрабатывать? Для начала, давайте разберем, что такое — Selenium. Это, в первую очередь, де-факто всемирно признанный — Web Driver по управлению браузером. Да… да… да… он позволяет управлять практически всеми популярными Web браузерами: IE, Opera, Chrome, Firefox. Этим предоставляя нам поистине фантастические возможности по автоматизации процесса парсинга и серфинга просторов «Интернета». При этом «вычислить», что управляет браузером не человек, а программа практически не возможно! Но и минусы конечно у такого подхода есть:
- повышенная нагрузка на CPU
- увеличенное потребление RAM
Но данные минусы с лихвой окупаются, толковым железом и достижением поставленной цели!
Что же может — php-webdriver и зачем он нужен? Все дело в том, что SELENIUM это всего лишь драйвер по управлению браузером, т.е. прослойка между управляющей программой и браузером. Надо отметить, что управляющие команды Selenium принимает по http протоколу. Т.е. фактически мы можем управлять браузером, через другой браузер посылая определенные команды. Об этом есть замечательная статья здесь. php-webdriver — это современная, мощная библиотека, по управлению браузером посредством подачи команд — Selenium. С помощью нее можно довольно просто подать команду перейти браузеру на определенную веб-страничку, получить содержимое веб страницы, получить снимок окна браузера, найти определенный элемент в DOM, выполнить JavaScript команду, запустить браузер, закрыть браузер, щелкнуть на кнопку в веб-форме, заполнить поля формы и т.д.
Зачем же понадобилось писать ее Facebook? Все довольно просто. Изначально php-webdriver разрабатывался для тестирования сайтов! Выявление «багов» на сайте и прохождения авто-тестов. В целом — это мощный инструмент по автоматическому тестированию сайтов, с выявлением ошибок и пр.
Давайте разберемся как ее пользоваться. Во-первых, ее нужно установить. Для этого рекомендуется использовать удобный инструмент — Composer:
1. Качаем библиотеку
curl -sS https://getcomposer.org/installer | php
2. Устанавливаем
php composer.phar require facebook/webdriver
3. Если у Вас не установлен Selenium, то качаем его отсюда. Нам нужен — Selenium Standalone Server
4. Запускаем его:
java -jar selenium-server-standalone-#.jar
* — если запускаем сразу несколько копий, то используем дополнительный ключ, задающий порт (4000) по которому будет слушать команды Selenium:
java -jar selenium.jar --interactive -port 4000
5. Далее собственно запуск PHP скрипта по управлению браузером:
// Указываем пространство имен namespace Facebook\WebDriver; // Указываем какие классы будут использоватся use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; //Пподключаем автолоадер классов require_once('vendor/autoload.php'); // Задаем хост на котором запущен Selenium (localhost - если же на этом компьютере) и номер порта (4444 - порт по умолчанию, если мы не задали другой) $host = 'http://localhost:4444/wd/hub'; // Если мы управляем Firefox, то инициализируем web драйвер (5000 - время ожидания ответа от Selenium) и запускаем Firefox $driver = RemoteWebDriver::create($host, DesiredCapabilities::firefox(), 5000); // Для chrom: $driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome()); // Подаем команду браузеру переход на URL: 'http://docs.seleniumhq.org/' $driver->get('http://docs.seleniumhq.org/'); // Указываем id тега (menu_about), которым будем манипулировать $tag = WebDriverBy::id('menu_about') // Производим поиск на текущей странице указанного тега $link = $driver->findElement( $tag); // Ну и собственно щелкаем по заданному тегу $link->click();
Как видите ничего сложного в использовании данной библиотеки нет. Инструмент довольно мощный и очень хорошо продуман. Надо заметить, что при поиске отсутствующего тега, библиотека генерирует исключение. Поэтому необходимые места, оборачиваем в конструкцию: try-catch. Так же, во время работы библиотеки генерируются дополнительные файлы — javascript, которые размещаются во временном каталоге системы — Temp. При некорректном завершении, иногда возникают ситуации переполнения Temp каталога. Это приводит к ошибки записи в каталог (Превышен лимит количества файлов в каталоге). Данная проблема решается периодической чисткой каталога.
По данной библиотеке есть мощная документация, но правда на англ. языке. Ее можно почитать здесь.
Более подробно, я постараюсь изложить в следующих статьях. Спасибо за внимание. Активно комментируйте или задавайте вопросы. Буду рад помочь.
Подскажите, как подключиться повторно к открытому окну webdriver-ом.
// Получаем список открытых окон
$win = $driver->getWindowHandles();
// Проверяем, что было возвращено
if(!empty($win) && is_array($win)) {
foreach($win as $str) {
if(!empty($str) && is_string($str)) {
// Делаем активным окно и получаем ссылку на драйвер по управлению этим окном
$drv = $driver->switchTo()->window($str); }; }; };
/**
* Вариант 2
* если известен ключ сессии, может быть получен с помощью: $driver->getSessionID()
*/
$driver = RemoteWebDriver::createBySessionID($session, $host);
выдает ошибку… хотя все делал по инструкции)
Error forwarding the new session Empty pool of VM for setup Capabilities [{browserName=firefox, platform=ANY, firefox_profile=UEsDBBQAAAAIAKy1BUvf9RXUNAAAADIAAAAHAAAAdXNlci5qcystTi2KLyhKTdNQKkpNTEkt0itILCpO1c3P083JT0zRS81LTMpJTVHSUUhLzClO1bTmAgBQ
Вездесущий гугл дал ответ на вашу ошибку:
http://software-testing.ru/forum/index.php?/topic/23413-rabota-s-remotewebdriver/
Удачи!
А если надо кликнуть по объекту, находящемуся в Shadow-root, чем его можно найти? XPath не находит?
Спасибо за вопрос. Честно говоря раньше не слышал про него. Благодаря вам и поисковику гугл узнал про него. Пробуйте средствами javascript. Благо данная возможность есть: driver->executeScript($js); $js — код на JavaScript.