php-webdriver

facebook1

    В недрах 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 каталога. Это приводит к ошибки записи в каталог (Превышен лимит количества файлов в каталоге). Данная проблема решается периодической чисткой каталога.
    По данной библиотеке есть мощная документация, но правда на англ. языке. Ее можно почитать здесь.
    Более подробно, я постараюсь изложить в следующих статьях. Спасибо за внимание. Активно комментируйте или задавайте вопросы. Буду рад помочь.


php-webdriver: 6 комментариев

    1. // Получаем список открытых окон
      $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);

  1. выдает ошибку… хотя все делал по инструкции)
    Error forwarding the new session Empty pool of VM for setup Capabilities [{browserName=firefox, platform=ANY, firefox_profile=UEsDBBQAAAAIAKy1BUvf9RXUNAAAADIAAAAHAAAAdXNlci5qcystTi2KLyhKTdNQKkpNTEkt0itILCpO1c3P083JT0zRS81LTMpJTVHSUUhLzClO1bTmAgBQ

  2. А если надо кликнуть по объекту, находящемуся в Shadow-root, чем его можно найти? XPath не находит?

    1. Спасибо за вопрос. Честно говоря раньше не слышал про него. Благодаря вам и поисковику гугл узнал про него. Пробуйте средствами javascript. Благо данная возможность есть: driver->executeScript($js); $js — код на JavaScript.

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

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