Что у нас есть?




Блог Terminus'а

Тестирование Web-приложений с помощью Selenium RC

Рубрики: Программирование,
Михаил Бесчетнов @ 17 февраля 2009, в 17:18

Как известно, Selenium (http://seleniumhq.org) это система тестирования функциональности Web-приложений. Selenium RC — ее часть, позволяющая писать тесты на одном из серверных языков, и отслеживать процесс теста в одном их поддерживаемых браузеров.

Мне потребовалось написать тест для системы вывода статистики одной банерной сети. Серверным языком был выбран PHP 5.2.

Первая неприятность, с которой пришлось столкнуться - Selenium не умеет делать скриншоты страниц. Т.е. весь экран сфоткать может (и то, без поддержки многомониторности), а страницу всю, со скролингом - фиг. Да, да, удалось найти недокументированную функцию captureEntirePageScreenshot. Однако она, по признанию авторов, экспериментальная, да и работает, насколько я понял, в Internet Explorer не всегда. В Firefox тоже придется извратиться.

Выходом из этой ситуации стало создание собственного скриншотера, который практически мгновенно делает скрины со скролящихся в обоих направлениях окнах IE версий 6, 7 с последующим сохранением в PNG. Надо думать, с более ранними версиями проблем быть тоже не должно. А IE 8 в цепкие лапы пока не попал.

Второй нюанс. В совершенно случайные промежутки времени оказывалось, что Selenium закачивал страницы тестируемого сайта не целиком. Точнее, PHP скрипты получали эти страницы от Selenium RC кусками. Нехорошо. Решение было найдено на англоязычном форуме.

Итак:

1. берем отсюда функцию load: http://www.bin-co.com/php/scripts/load/

2. Добавляем ее в файл /php/PEAR/Testing/Selenium.php

3. В этом же файле ищем строки
[code]if (!$handle = fopen($url, 'r')) {
throw new Testing_Selenium_Exception('Cannot connected to Selenium RC Server');
}

stream_set_blocking($handle, false);
$response = stream_get_contents($handle);
fclose($handle);[/code]

И заменяем все это на:

[code]$response = $this->load($url);[/code]

Беда с битыми страницами после этого закрывается.

И, наконец, третье. Тесты запускались под Windows, для запуска утилы снятия скринов из PHP требовалось выполнение EXEC, и работала эта связка только если PHP запускался не как модуль апача. И как только я начал тестировать связку, запуская весь механизм в консоли, сразу выявилась новая беда - Selenium перестал понимать команды на UTF-8. Т.е. говоришь ему кликнуть на ссылку с текстом «Войти», а он русский текст категорически не воспринимает.

Решением этого стало отключение половины кода функции load. Той половины, которая допускала получение данных не CURL'ом, а через сокеты. Да и зачем они, эти сокеты, если CURL есть :)

Если кому нужна прога для снятия скринов - пишите в коментах, скину. Прога консольная, принимает в параметрах искомый тайтл страницы (надо обеспечить его уникальность для страницы теста, например, помещаа в title дату и время начала теста), и базовый адрес сохранения. Он заточен под мою структуру тестов, но если что, могу дать исходники на Delphi, разберетесь...


2 комментария к заметке

  1. Борис пишет:

    Заменил загрузку на load, как описано. Теперь почему-то зависает.
    Запускаю тесты selenium через phpunit

  2. Terminus пишет:

    Хм. Ну даже не знаю :)
    У меня с этим load работает отлично, а без — периодически обрезанные страницы получались. Крайне неприятно.

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

В Блоге работает система премодерирования. Спам, реклама, попытки хамить будут беспощадно удаляться. Да, и не работают HTML теги :)

Ну а свежим мыслям я всегда рад, так что не стесняйтесь :)


 
 
©2000—2010 Михаил Бесчетнов aka Terminus
«EXTRACTOR.ru» — игровые ресурсы: распаковка музыки и графики, конверторы форматов и многое другое…
Ссылка на «EXTRACTOR.ru» при перепечатывании оригинальных материалов крайне желательна

Rambler's Top100