Selenium: приемы работыСташевский Павел, 2010
План мероприятия1. Работа с AJAX-интерфейсами2. WYSWYG3. Файлы: загрузка и скачивание
Ожидание событий   Зачем ждать?Selenium RC не отработает на том интерфейсе, которого нетИмитируем действия пользователяЧто ждать?Клиентский JSAJAXНе всегда отработаетВремя тестов растетsleep(5);
Ожидание событийwhile(!isElementPresent(‘locator’)) {	sleep(1);}Бесконечный циклЭто не наши методы!!!
Нормальное ожидание событияpublic function waitElementExist($sLocator, $iTimeout = null) {    $iTimeout = (isset($iTimeout) ? $iTimeout : 180000) / 1000;    $iStartTime = time();    while (!$this-isElementPresent($sLocator)) {	sleep(1);	if (time() - $iStartTime > $iTimeout) {		return false;}}    return true;}Это наши методы!!!
Работаем с popupopenWindow( string $url, string $windowID) – открsть всплывающее окноselectWindow( string $windowID) – переключится на всплывающее окноwaitForPopUp( string $windowID, string $timeout) – ждать, пока попап появится
WYSWYGSelenium не умеет работать с WYSWYGПриходится писать JSДля тестов, как правило, требуются операции: добавить текст, проверить текст
WYSWYGclass CSlWYSWYGField{public function check($mValue) {    }public function fill($mValue) {    }public function clean() {    }}Пишем один разИспользуем много раз
WYSWYG. Записьpublic function fill($mValue) {    $sScript = "document.getElementById(‘Locator_ifr’).contentDocument.documentElement.childNodes[1].innerHTML     = '" . $mValue. "';";    $this->runScript($sScript);}
WYSWYG.Проверка значенияpublic function check($mValue) {    $sScript = "window.document.getElementById(‘Locator_ifr’).contentDocument.documentElement.childNodes[1].firstChild.innerHTML;";    $mFormValue = $this->getEval($sScript);    return $mFormValue == $mValue ? true : false;}getEval( string $script) -  возвращает результат выполнения  $ script
Работа с файламиТестирование загрузки файлов (например, аватар)Тестирование скачивания файлов Файлы нужно где-то хранитьИспользовать сервер, на котором выполняются тестыИспользовать FTP-сервер
Загрузка файлаtype( string $locator, string $value)Может использоваться только в “*chrome”В остальных случаях используем имитацию нажатия клавиш клавиатуры с помощью:keyDownNative( string $keycode)  - нажать клавишу без отпусканияkeyUpNative( string $keycode) -  отпустить клавишуkeyPressNative( string $keycode) – нажать клавишу клавиатуры и отпустить
Загрузка файла. Примерpublic function fill($mValue) {	$this->windowFocus();	$this->click(‘locator_input’);	sleep(1);foreach(str_split($mValue) as $sChar) { 		if ($sChar == ':') {			$this->keyDownNative(‘16’);			$this->keyPressNative(’59’); 			$this->keyUpNative(‘16’);	...	sleep(1);}
Скачивание файловattachFile( string $fieldLocator, string $fileLocator) – скачивает файл $fieldLocatorв указанную директорию $fileLocatorpublic function testDownloadFile() {    // что-то делаем до скачивания файла$this->attachFile(‘link=Скачать файл’, ‘S:\file.txt’);//что-то делаем после скачивания файла}Может использоваться только в “*chrome”В других браузерах используем key…Проблема: по-разному во всех браузерах
Проблемы SeleniumПроблема работы с различным тестовым окружением (тесты + phpunit+ selenium rc + браузеры + ОС)Миф о кроссбраузерности тестовПроблемы с авторизацией open(login:password@url);Selenium не все может
ВопросыPavel.Stashevskiy@softline.ruSkype: pavel.stashevsky_sl

Selenium: приемы работы

  • 1.
  • 2.
    План мероприятия1. Работас AJAX-интерфейсами2. WYSWYG3. Файлы: загрузка и скачивание
  • 3.
    Ожидание событий Зачем ждать?Selenium RC не отработает на том интерфейсе, которого нетИмитируем действия пользователяЧто ждать?Клиентский JSAJAXНе всегда отработаетВремя тестов растетsleep(5);
  • 4.
  • 5.
    Нормальное ожидание событияpublicfunction waitElementExist($sLocator, $iTimeout = null) { $iTimeout = (isset($iTimeout) ? $iTimeout : 180000) / 1000; $iStartTime = time(); while (!$this-isElementPresent($sLocator)) { sleep(1); if (time() - $iStartTime > $iTimeout) { return false;}} return true;}Это наши методы!!!
  • 6.
    Работаем с popupopenWindow(string $url, string $windowID) – открsть всплывающее окноselectWindow( string $windowID) – переключится на всплывающее окноwaitForPopUp( string $windowID, string $timeout) – ждать, пока попап появится
  • 7.
    WYSWYGSelenium не умеетработать с WYSWYGПриходится писать JSДля тестов, как правило, требуются операции: добавить текст, проверить текст
  • 8.
    WYSWYGclass CSlWYSWYGField{public functioncheck($mValue) { }public function fill($mValue) { }public function clean() { }}Пишем один разИспользуем много раз
  • 9.
    WYSWYG. Записьpublic functionfill($mValue) { $sScript = "document.getElementById(‘Locator_ifr’).contentDocument.documentElement.childNodes[1].innerHTML = '" . $mValue. "';"; $this->runScript($sScript);}
  • 10.
    WYSWYG.Проверка значенияpublic functioncheck($mValue) { $sScript = "window.document.getElementById(‘Locator_ifr’).contentDocument.documentElement.childNodes[1].firstChild.innerHTML;"; $mFormValue = $this->getEval($sScript); return $mFormValue == $mValue ? true : false;}getEval( string $script) - возвращает результат выполнения $ script
  • 11.
    Работа с файламиТестированиезагрузки файлов (например, аватар)Тестирование скачивания файлов Файлы нужно где-то хранитьИспользовать сервер, на котором выполняются тестыИспользовать FTP-сервер
  • 12.
    Загрузка файлаtype( string$locator, string $value)Может использоваться только в “*chrome”В остальных случаях используем имитацию нажатия клавиш клавиатуры с помощью:keyDownNative( string $keycode) - нажать клавишу без отпусканияkeyUpNative( string $keycode) - отпустить клавишуkeyPressNative( string $keycode) – нажать клавишу клавиатуры и отпустить
  • 13.
    Загрузка файла. Примерpublicfunction fill($mValue) { $this->windowFocus(); $this->click(‘locator_input’); sleep(1);foreach(str_split($mValue) as $sChar) { if ($sChar == ':') { $this->keyDownNative(‘16’); $this->keyPressNative(’59’); $this->keyUpNative(‘16’); ... sleep(1);}
  • 14.
    Скачивание файловattachFile( string$fieldLocator, string $fileLocator) – скачивает файл $fieldLocatorв указанную директорию $fileLocatorpublic function testDownloadFile() { // что-то делаем до скачивания файла$this->attachFile(‘link=Скачать файл’, ‘S:\file.txt’);//что-то делаем после скачивания файла}Может использоваться только в “*chrome”В других браузерах используем key…Проблема: по-разному во всех браузерах
  • 15.
    Проблемы SeleniumПроблема работыс различным тестовым окружением (тесты + phpunit+ selenium rc + браузеры + ОС)Миф о кроссбраузерности тестовПроблемы с авторизацией open(login:password@url);Selenium не все может
  • 16.