Как тестировать в нескольких браузерах в PHPUnit-Selenium

Apr 29, 2013 10:57

Как тестировать в нескольких браузерах в PHPUnit-Selenium

В документации к PHPUnit (v 3.7) написано, что можно тестировать в разных браузерах подряд в одном тесте.
Для этого нужно сделать класс наследник PHPUnit_Extensions_SeleniumTestCase с переменной $browsers. В документации дана следующая структура:

public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox',
        'host'    => 'my.linux.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on MacOS X',
        'browser' => '*safari',
        'host'    => 'my.macosx.box',
        'port'    => 4444,
        'timeout' => 30000,
      )
    );

Это неверно! С такой структурой не работает!

Правильно будет, несмотря на то, что написано в официальной документации, следущая структура для $browsers и дополнительный массив $parameters:

class WebTest extends \PHPUnit_Extensions_Selenium2TestCase
{
    // default params
    public $parameters = array(
        'seleniumServerRequestsTimeout' => 30000,
        'timeout'                       => 30000,
    );

// list of browsers with per-browser config
    public static $browsers = array(
        array('browserName' => 'firefox', 'host'=>'10.216.6.84', 'port'=>4445),
        array('browserName' => 'chrome'),
        array('browserName' => 'internet explorer')
    );

protected function setUp()
    {
        $this->setBrowserUrl('http://localhost/php/openinghours/');
    }

function testTitle()
    {
        $this->url('http://localhost/php/openinghours/');
        $this->assertEquals('Opening Hours', $this->title());      
    }
}

Значения host и port по умолчанию localhost и 4444.

Как тестировать
Нам потребуется Selenium Server. Скачивается здесь http://docs.seleniumhq.org/download/ в разделе Selenium Server (formerly the Selenium RC Server).
Запускается с командой строки
java -jar c:/lib/selenium/selenium-server-standalone.jar

Chrome
Потребуется драйвер-запускатель Хрома. Скачивается тут http://code.google.com/p/chromedriver/downloads/list
В строку запуска Selenium сервера добавляем следующее
-Dwebdriver.chrome.driver=c:/lib/selenium/chromedriver.exe

Где c:/lib/selenium/chromedriver.exe - путь к запускателю Хрома.

Желательно всю инсталляцию Selenium, например у меня c:/lib/selenium, добавить в PATH

FireFox
Дополнительный драйвер не нужен. Selenium умеет запускать FireFox самостоятельно. Но Selenium серверу необходимо указать на путь до firefox.exe.
Добавляем следущий параметр к запуску сервера
-Dwebdriver.firefox.bin="C:\Program Files (x86)\Mozilla Firefox\firefox.exe"

Кстати, если кто-то все еще думает, что firefox это лисица, так вот firefox - это красная (малая) панда. Wikipedia


Не устаю это людям рассказывать и удивлять.
Зверь очень красивый, любит лазать по деревьям. Лично видел в зоопарке в Кристиансанде.

Internet Explorer
Для Internet Explorer нужен драйвер (или как он называется в документации для Селениум "Internet Explorer Driver Server"). Скачивается драйвер тут http://code.google.com/p/selenium/downloads/list
Этот exe файл должен должен быть доступен в PATH.
Как уже писал, желательно всю инсталляцию Selenium, например у меня c:/lib/selenium, добавить в PATH

Если мы получаем следующую ошибку при запуске драйвера Internet Explorer
Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.
Нужно установить одинаковое (любое вкл или выкл) значение Protected Mode для всех зон.


Если такая ошибка: Unexpected error launching Internet Explorer. Browser zoom level was set to 107%. It should be set to 100%
Соответственно нужно установить зум 100%


В итоге мой bat файл для запуска сервера Селениум выглядит так:

javaw -jar c:/lib/selenium/selenium-server-standalone.jar
-Dwebdriver.chrome.driver=c:/lib/selenium/chromedriver.exe
-Dwebdriver.firefox.bin="C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
Заметьте здесь javaw, а не java - если не нужен вывод в консоль так будет работать быстрее.

Запускаем сервер в командной сторке, запускаем тест - все работает.

Continuous Integration
Для того, чтобы Селениум работал на сервере интеграции, нам необходимо запускать означенный бат-файл как Windows-сервис.

К сожалению конвенциональных путей от Microsoft сделать это найдено не было. В версиях Windows сервера 2003 и ранее в реските была прграмма srvany, которая могла сделать сервис из любого исполняемого файла. Но в версиях 2008 и далее эта программа недоступна.
Однако, нам поможет замечательная программа Non-Sucking Service Manager, которая делает то, что нам нужно. Помещаем nssm.exe куда-нибудь в PATH (например c:\windows) и запyскаем с командной строки nssm install Selenium, выбираем наш бат-файл и инсталлируем сервис.


Стартуем сервис в сервис менеджере, и все готово.
Теперь, после каждого чекина, все Селениум-тесты будут запускаться на сервере интеграции.

программирование, phpunit, тестирование, php

Previous post Next post
Up