Статьи

Selenium 2 из PHP-кода

Selenium 2, новая итерация комплексного инструмента тестирования веб-приложений, содержит некоторые причудливые инновации по сравнению с версией 1.x: он управляет браузером напрямую через ОС, а не генерирует команды JS. Он также более надежен, чем 1.x, так как имеет другую модель ожидания.

После тестирования Selenium 2 для меня было естественным искать его поддержку в PHP-коде; однако на сайте Selenium нет официального PHP Api. Я проверил все PHP-привязки, которые смог найти, чтобы увидеть, какой из них сегодня лучший.

То, что нам нужно

Моя цель — использовать PHP для написания тестов для Selenium 2: его браузер запускается не непосредственно процессом PHP, а с локального сервера, который предоставляет свои функции через порт HTTP.

Таким образом, все эти библиотеки требуют, чтобы автономный сервер Selenium работал во время их запуска (в отличие от тестов на основе Java):

[10:36:27][giorgio@Desmond:~]$ java -jar selenium-server-standalone-2.9.0.jar
Nov 15, 2011 10:36:37 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
...

Они также требуют, чтобы расширение PHP было включено в PHP для связи с сервером. В Ubuntu обязательно установите пакет php5-curl.

Кроме того, нам нужна библиотека PHP, если мы не хотим писать тесты, отправляя сообщения JSON на сервер напрямую …

PHPUnit_Selenium

Это расширение поставляется с PHPUnit в виде пакета PEAR, и, вероятно, оно уже присутствует на ваших машинах. Тем не менее, он был построен для Selenium 1; хотя Selenium 2 (WebDriver для друзей) должен быть в основном совместим со старым Api, я бы не стал рассматривать его вместе с PHPUnit_Selenium (просто продолжайте использовать банки Selenium 1).

Php-webdriver Facebook

Api этих привязок построен с помощью магических методов: он реплицирует протокол проводов JSON Selenium 2 с __call (). Есть некоторые небольшие исключения в таких методах, как element (), которые явно определены для упрощения вызова:

$session->element('id', 'element_id');
// instead of passing array('using' => ..., 'value' => ...) which won't work

Однако некоторые важные команды, такие как sendKeys, не поддерживаются, и value () на самом деле не работает. Это «очень тонкая обертка», но мне она кажется неполной.

Более того, это кажется странно написанным, поскольку в нем говорится, что он дает возможность настройки curl путем исправления статического класса .

Выглядит так:

    $webdriver = new WebDriver();
    $session = $webdriver->session('firefox', array());
    $session->open('http://www.google.com');
    $textbox = $session->element('name', 'q');
    $textbox->value('h');

PHP-WebDriver-привязок

Этот проект, размещенный в коде Google, имеет настоящие методы Api: PHP с сигнатурой, которую можно задокументировать, и которую вы можете узнать через вашу IDE. Это также очень маленькая загрузка.

Это, вероятно, лучший Api, с которым я когда-либо сталкивался: для всех открытых методов есть даже docblocks.

Выглядит так:

    $webdriver = new WebDriver("localhost", "4444");
    $webdriver->connect("firefox");
    $webdriver->get("http://google.com");
    $element = $webdriver->findElementBy(LocatorStrategy::name, "q");
    if ($element) {
        $element->sendKeys(array("php webdriver" ) );
        $element->submit();
    }

WebDriver-PHP

Этот проект легко интегрируется с PHPUnit: хотя расширяемый класс не поставляется, есть пример, где setUp () и tearDown () можно позаимствовать из вашего набора тестов.

На самом деле, проект включает в себя пробный тест для Selenium, и он тестируется модулем! Другие тесты, которые вы видите в исходном коде, нацелены на собственный производственный код.

Библиотека содержит некоторые материалы для запуска тестов в облаке Sauce Labs , поэтому за этим кодом стоит компания. Единственный подводный камень в том, что в коде есть строгие соглашения, такие как method_name (); это также не пространство имен, как и все другие проекты.

Выглядит так:

    $this->driver = WebDriver_Driver::InitAtLocal("4444", "firefox");
    $this->set_implicit_wait(5000);
    $this->load("http://seleniumhq.org/");
    $this->assert_title("Selenium - Web Browser Automation");
    $this->get_element("css=h2")->assert_text("What is Selenium?");

Выводы

У вас есть много (может быть, слишком много) вариантов:

  • старый добрый PHPUnit: вы будете придерживаться Selenium 1 Api.
  • Php-webdriver Facebook: вы получите библиотеку, которая отражает оригинальный протокол и волшебным образом добавляет методы.
  • php-webdriver-bindings: небольшая библиотека, всего несколько килобайт, которая реализует явные методы вместо использования __call (). Наверное, лучший API.
  • WebDriver-PHP: когда вы можете запускать тесты в облаке с помощью Sauce Labs и использовать библиотеку, написанную людьми с большим опытом работы с Selenium.