Upload
alexei-barantsev
View
6.269
Download
2
Embed Size (px)
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: [email protected]: barancev
http://software-testing.ru/test_automation/http://software-testing.ru/trainings/http://selenium2.ru/