53
Selenium vs AJAX [Crash Course] Алексей Баранцев Software-Testing.Ru SeleniumCamp 2012

Selenium vs AJAX

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Selenium vs AJAX

Selenium vs AJAX[Crash Course]

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

Page 2: Selenium vs AJAX

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

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

Page 3: Selenium vs AJAX

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

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

WebDriver это не Selenium RC :)

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

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

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

Page 4: Selenium vs AJAX

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

Page 5: Selenium vs AJAX

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

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

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

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

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

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

Page 6: Selenium vs AJAX

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

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

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

Page 7: Selenium vs AJAX

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

Page 8: Selenium vs AJAX

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

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

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

selenium.waitForPageLoad(" 30000 ");

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

Page 9: Selenium vs AJAX

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

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

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

HtmlUnit

client.setRefreshHandler(new WaitingRefreshHandler());

Page 10: Selenium vs AJAX

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

Page 11: Selenium vs AJAX

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

Page 12: Selenium vs AJAX

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

driver.findElementdriver.findElements

element.findElementelement.findElements

Page 13: Selenium vs AJAX

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

idnametagNameclassNamexpathcssSelectorlinkText

Page 14: Selenium vs AJAX

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

Page 15: Selenium vs AJAX

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

Page 16: Selenium vs AJAX

AJAX

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

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

Page 17: Selenium vs AJAX

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

Page 18: Selenium vs AJAX

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

Page 19: Selenium vs AJAX

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

Page 20: Selenium vs AJAX

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

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

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

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

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

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

Page 21: Selenium vs AJAX

Видимость элемента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.

Page 22: Selenium vs AJAX

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

.implicitlyWait(10, TimeUnit.SECONDS);

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

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

Page 23: Selenium vs AJAX

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

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

Page 24: Selenium vs AJAX

Эксплицитные ожидания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); }};

}

Page 25: Selenium vs AJAX

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

Page 26: Selenium vs AJAX

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

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

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

Page 27: Selenium vs AJAX

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

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

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

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

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

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

Page 28: Selenium vs AJAX

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

WebDriverWait – это FluentWait<WebDriver>

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

Page 29: Selenium vs AJAX

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);

Page 30: Selenium vs AJAX

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

wait.until(ExpectedConditions.alertIsPresent());

Page 31: Selenium vs AJAX

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

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

Page 32: Selenium vs AJAX

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

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

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

Page 33: Selenium vs AJAX

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

Page 34: Selenium vs AJAX

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

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

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

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

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

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

Page 35: Selenium vs AJAX

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

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

Page 36: Selenium vs AJAX

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

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

Page 37: Selenium vs AJAX

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

Page 38: Selenium vs AJAX

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

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

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

Page 39: Selenium vs AJAX

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

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

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

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

Page 40: Selenium vs AJAX

Что умеет WebDriver

clicksendKeysи всё

Page 41: Selenium vs AJAX

Что умеет WebDriver

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

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

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

Page 42: Selenium vs AJAX

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

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

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

сделать!!!

Page 43: Selenium vs AJAX

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

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

Page 44: Selenium vs AJAX

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

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

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

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

Page 45: Selenium vs AJAX

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

Page 46: Selenium vs AJAX

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

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

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

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

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

должны

Page 47: Selenium vs AJAX

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

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

Page 48: Selenium vs AJAX

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

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

Page 49: Selenium vs AJAX

Native vs Synthesized

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

Page 50: Selenium vs AJAX

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

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

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

Page 51: Selenium vs AJAX

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

сlickcontextClickmoveToElement

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

dragAndDropsendKeyskeyDown/keyUp

Page 52: Selenium vs AJAX

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

moveToElementmoveByOffsetdragAndDropBy

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

Page 53: Selenium vs AJAX

Алексей Баранцев, Software-Testing.Ruemail: [email protected]: barancev

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