Selenium vs AJAX

Preview:

DESCRIPTION

 

Citation preview

Selenium vs AJAX[Crash Course]

Алексей БаранцевSoftware-Testing.RuSeleniumCamp 2012

Я буду рассказывать про WebDriver

Потому что за нимбудущее

Это курс уровня 300

Я предполагаю, что вы:понимаете, что

WebDriver это не Selenium RC :)

в целом знаете интерфейс WebDriver

хорошо знаете, что такое DOM

немного знаете JavaScript

«Клеточный уровень» автотестов

Тесты на «клеточном уровне»

Выполни действие

Подожди, пока будет

готов результат

Выполни проверку

Подожди, пока можно выполнить действие

Подожди, пока…

Загрузится страницаПоявится элементЭлемент станет

видимымЭлемент исчезнетПоявится alertПоявится окно…

Подожди, пока…загрузится страница

Завершение загрузки страницы

FF, Chrome, IE, Opera – загрузка синхронная

завершение определяется «автоматически»

selenium.waitForPageLoad(" 30000 ");

– не работает, если есть long poll или типа того

Завершение загрузки страницы

FF – режим асинхронной загрузки

FirefoxProfile fp = new FirefoxProfile();fp.setPreference("webdriver.load.strategy", "unstable");// до версии 2.19 было "fast"

HtmlUnit

client.setRefreshHandler(new WaitingRefreshHandler());

Подожди, пока…появится элемент

Но сначала – пропоиск элементов

Методы поиска (методы «отбора»)

driver.findElementdriver.findElements

element.findElementelement.findElements

Встроенные стратегии поиска

idnametagNameclassNamexpathcssSelectorlinkText

Забудьте про код страницы!

Selenium работает с DOM!

AJAX

Сложная структура DOMDOM строится динамическиDOM меняется!!!

Нет уникальных id или nameВообще нет id или name

Подожди, пока…появится элемент

«Найден» – не значит «виден»!http://foto.rambler.ru/users/timnbjj/tags/12/4e27c513-38f7-092a-b29e-38e697847dcd/

«Виден» – не значит «доступен»!

Состояния элемента

Отсутствует (не найден)

Есть, но невидимый

Есть, видимый, но не interactable

Есть, видимый, можно выполнять действия

Был, но удалён из DOM

Видимость элементаbot.dom.isShown = function(elem, opt_ignoreOpacity) {

// Title elements are shown if and only if they belong to the bot window.// Option or optgroup is shown iff enclosing select is shown.// Map is shown iff image that uses it is shown.// Area is shown iff enclosing map is shown.// Any hidden input is not shown.// Any element with hidden visibility is not shown.// Any element with a display style equal to 'none' or that has an ancestor// with display style equal to 'none' is not shown.// Any transparent element is not shown.// Any element without positive size dimensions is not shown.// Zero-sized elements should still be considered to have positive size// if they have a child element or text node with positive size.

Имплицитные ожиданияdriver.manage().timeouts()

.implicitlyWait(10, TimeUnit.SECONDS);

dialog = driver.findElement(By.id("dialog-confirm-delete"));

методы поиска становятся синхроннымиfindElements ищет хотя бы один элементожидание – на стороне браузера

Когда это не работает

надо просто проверить наличие элементанадо найти один (любой) элемент из двухожидание исчезновения элемента

Эксплицитные ожиданияWebDriverWait + ExpectedCondition

new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.id("dialog-confirm-delete")));

public static ExpectedCondition<WebElement>presenceOfElementLocated(final By locator)

{return new ExpectedCondition<WebElement>() { public WebElement apply(WebDriver driver) { return findElement(locator, driver); }};

}

Подожди, пока…[что угодно]

Подожди, пока…

Загрузится страницаПоявится элементЭлемент станет

видимымЭлемент исчезнетПоявится alertПоявится окно…

ExpectedConditions: готовые условия

Загрузка страницыwait.until(titleIs("New page title"));

Появление элементаwait.until(presenceOfElementLocated(locator));

Видимость элементаwait.until(visibilityOfElementLocated(locator));

Невидимость элементаwait.until(invisibilityOfElementLocated(locator));

Исчезновение элемента из DOMwait.until(stalenessOf(element));

Тонкая настройка

WebDriverWait – это FluentWait<WebDriver>

withTimeout(timeOutInSeconds, TimeUnit.SECONDS);pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);ignoring(NotFoundException.class);

WebElementWait

FluentWait<WebElement>

public static Predicate<WebElement> displayed= new Predicate<WebElement>(

{public boolean apply(WebElement el) { return el.isDisplayed();}

};

new WebElementWait(element, 30).until(displayed);

Ожидание появления алерта

wait.until(ExpectedConditions.alertIsPresent());

Как проверить отсутствие?

в FF ожидание алерта «полусинхронное»driver.switchTo().alert() ждёт две секунды

Альтернатива: автоперехват

любое действие может завершиться сUnhandledAlertException

зато больше нет «вечной блокировки»на неожиданных алертах

Ожидание открытия нового окна

Ожиданиеоткрытия окна

Нет готовогоExpectedCondition

Почему? Потому что его

нельзя сделать Надо сначала

запомнитьdriver.getWindowHandles()потом кликнутьа потом ждать, когда

изменится список окон

Ещё немного про окна

Не переключайтесь слишком быстро!http://code.google.com/p/selenium/issues/detail?id=2764

Ещё немного про окна

Не забудьте переключиться обратнопосле закрытия окна

Действия с элементами

«Традиционные» действия

кликнутьссылкирадиобатоны и чекбоксысписки

ввести текстприцепить файл

Действия «с JavaScript’ом»

клавиатурные сочетания

ввести текст«п о с т е п е н н о»

правая кнопка мышиперетаскиваниенаведение мышидвойной клик

Что умеет WebDriver

clicksendKeysи всё

Что умеет WebDriver

select?это несколько кликов

toggle?это просто click

check/uncheck?это просто click

«Сахар», впрочем, не мешает

clear для полей вводаsubmit для любого элемента формы

Пользователь не может этого

сделать!!!

«Сахар», впрочем, не мешает

new Select(selectElement)selectByText(text) – с нормализацией пробеловselectByValue(value)

click: подробности

На что можно кликнуть?Невидимые элементы: как по ним кликать?Какие обработчики сработают?

клик поднимается вверх по DOM’упо крайней мере должен

Координаты клика?левый верхний угол?центр?

Автоскроллирование

sendKeys: подробности Где можно

нажимать клавиши?Как заполнить

невидимое поле?Какие обработчики

сработают?поднимаются вверх

по DOM’упо крайней мере

должны

Почему так медленно???

каждая клавиша отдельноkeyDown, keyUp, keyPressособенно заглавные буквы!!!

А можно ли быстро?

http://art-apple.ru/displayimage.php?album=13&pos=4

Native vs Synthesized

FirefoxProfile p = new FirefoxProfile();p.setEnableNativeEvents(false);

sendKeys для «нетекста»<input type=“file”>ENTER/RETURNстрелки и прочая

навигацияKeys.chord«хоткеи»Ctrl-A/Ctrl-C/Ctrl-V

быстрая вставка

Actions: тонкие действия

сlickcontextClickmoveToElement

не персистентно!!!clickAndHold/release

dragAndDropsendKeyskeyDown/keyUp

Ещё более тонкие действияКоординаты

moveToElementmoveByOffsetdragAndDropBy

Действия «без элемента»clickclickAndHold/releasesendKeyskeyDown/keyUp

Алексей Баранцев, Software-Testing.Ruemail: barancev@gmail.comskype: barancev

http://software-testing.ru/test_automation/http://software-testing.ru/trainings/http://selenium2.ru/