Selenium vs AJAX

7,457 views
7,364 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,457
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
78
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Selenium vs AJAX

  1. 1. Selenium vs AJAX [Crash Course] Алексей Баранцев Software-Testing.Ru SeleniumCamp 2012
  2. 2. Я буду рассказывать про WebDriverПотому что за нимбудущее
  3. 3. Это курс уровня 300 Я предполагаю, что вы: понимаете, что WebDriver это не Selenium RC :) в целом знаете интерфейс WebDriver хорошо знаете, что такое DOM немного знаете JavaScript
  4. 4. «Клеточный уровень» автотестов
  5. 5. Тесты на «клеточном уровне» Подожди, пока можно Выполни выполнить действие действие Подожди, Выполни пока будет проверку готов результат
  6. 6. Подожди, пока… Загрузится страница Появится элемент Элемент станет видимым Элемент исчезнет Появится alert Появится окно…
  7. 7. Подожди, пока…загрузится страница
  8. 8. Завершение загрузки страницыFF, Chrome, IE, Opera – загрузка синхронная завершение определяется «автоматически» selenium.waitForPageLoad(" 30000 "); – не работает, если есть long poll или типа того
  9. 9. Завершение загрузки страницыFF – режим асинхронной загрузки FirefoxProfile fp = new FirefoxProfile(); fp.setPreference("webdriver.load.strategy", "unstable"); // до версии 2.19 было "fast"HtmlUnit client.setRefreshHandler(new WaitingRefreshHandler());
  10. 10. Подожди, пока…появится элемент
  11. 11. Но сначала – пропоиск элементов
  12. 12. Методы поиска(методы «отбора»)driver.findElementdriver.findElementselement.findElementelement.findElements
  13. 13. Встроенные стратегии поискаidnametagNameclassNamexpathcssSelectorlinkText
  14. 14. Забудьте про код страницы!
  15. 15. Selenium работает с DOM!
  16. 16. AJAXСложная структура DOMDOM строится динамическиDOM меняется!!!Нет уникальных id или nameВообще нет id или name
  17. 17. Подожди, пока…появится элемент
  18. 18. «Найден» – не значит «виден»! http://foto.rambler.ru/users/timnbjj/tags/12/4e27c513-38f7-092a-b29e-38e697847dcd/
  19. 19. «Виден» – не значит «доступен»!
  20. 20. Состояния элемента Отсутствует (не найден) Есть, но невидимыйЕсть, видимый, но не Есть, видимый, можно interactable выполнять действия Был, но удалён из DOM
  21. 21. Видимость элемента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.
  22. 22. Имплицитные ожиданияdriver.manage().timeouts() .implicitlyWait(10, TimeUnit.SECONDS);dialog = driver.findElement(By.id("dialog-confirm-delete"));методы поиска становятся синхроннымиfindElements ищет хотя бы один элементожидание – на стороне браузера
  23. 23. Когда это не работаетнадо просто проверить наличие элементанадо найти один (любой) элемент из двухожидание исчезновения элемента
  24. 24. Эксплицитные ожиданияWebDriverWait + ExpectedConditionnew 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); } }; }
  25. 25. Подожди, пока… [что угодно]
  26. 26. Подожди, пока… Загрузится страница Появится элемент Элемент станет видимым Элемент исчезнет Появится alert Появится окно…
  27. 27. ExpectedConditions: готовые условия Загрузка страницы wait.until(titleIs("New page title")); Появление элемента wait.until(presenceOfElementLocated(locator)); Видимость элемента wait.until(visibilityOfElementLocated(locator)); Невидимость элемента wait.until(invisibilityOfElementLocated(locator)); Исчезновение элемента из DOM wait.until(stalenessOf(element));
  28. 28. Тонкая настройкаWebDriverWait – это FluentWait<WebDriver>withTimeout(timeOutInSeconds, TimeUnit.SECONDS);pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);ignoring(NotFoundException.class);
  29. 29. WebElementWaitFluentWait<WebElement> public static Predicate<WebElement> displayed = new Predicate<WebElement>({ public boolean apply(WebElement el) { return el.isDisplayed(); }};new WebElementWait(element, 30).until(displayed);
  30. 30. Ожидание появления алертаwait.until(ExpectedConditions.alertIsPresent());
  31. 31. Как проверить отсутствие?в FF ожидание алерта «полусинхронное» driver.switchTo().alert() ждёт две секунды
  32. 32. Альтернатива: автоперехват любое действие может завершиться с UnhandledAlertException зато больше нет «вечной блокировки» на неожиданных алертах
  33. 33. Ожидание открытия нового окна
  34. 34. Ожиданиеоткрытия окна Нет готового ExpectedCondition Почему? Потому что его нельзя сделать Надо сначала запомнить driver.getWindowHandles()  потом кликнуть  а потом ждать, когда изменится список окон
  35. 35. Ещё немного про окнаНе переключайтесь слишком быстро! http://code.google.com/p/selenium/issues/detail?id=2764
  36. 36. Ещё немного про окнаНе забудьте переключиться обратно после закрытия окна
  37. 37. Действия с элементами
  38. 38. «Традиционные» действиякликнуть ссылки радиобатоны и чекбоксы спискиввести текстприцепить файл
  39. 39. Действия «с JavaScript’ом» клавиатурные сочетания ввести текст «п о с т е п е н н о» правая кнопка мыши перетаскивание наведение мыши двойной клик
  40. 40. Что умеет WebDriverclicksendKeysи всё 
  41. 41. Что умеет WebDriverselect? это несколько кликовtoggle? это просто clickcheck/uncheck? это просто click
  42. 42. «Сахар», впрочем, не мешаетclear для полей вводаsubmit для любого элемента формы Пользователь не может этого сделать!!!
  43. 43. «Сахар», впрочем, не мешаетnew Select(selectElement) selectByText(text) – с нормализацией пробелов selectByValue(value)
  44. 44. click: подробностиНа что можно кликнуть?Невидимые элементы: как по ним кликать?Какие обработчики сработают? клик поднимается вверх по DOM’у по крайней мере должен Координаты клика? левый верхний угол? центр?
  45. 45. Автоскроллирование
  46. 46. sendKeys: подробности  Где можно нажимать клавиши?  Как заполнить невидимое поле?  Какие обработчики сработают?  поднимаются вверх по DOM’у  по крайней мере должны 
  47. 47. Почему так медленно???каждая клавиша отдельноkeyDown, keyUp, keyPressособенно заглавные буквы!!!
  48. 48. А можно ли быстро? http://art-apple.ru/displayimage.php?album=13&pos=4
  49. 49. Native vs SynthesizedFirefoxProfile p = new FirefoxProfile();p.setEnableNativeEvents(false);
  50. 50. sendKeys для «нетекста» <input type=“file”> ENTER/RETURN стрелки и прочая навигация Keys.chord «хоткеи» Ctrl-A/Ctrl-C/Ctrl-V быстрая вставка
  51. 51. Actions: тонкие действия сlick contextClick moveToElement не персистентно!!! clickAndHold/release dragAndDrop sendKeys keyDown/keyUp
  52. 52. Ещё более тонкие действия Координаты moveToElement moveByOffset dragAndDropBy Действия «без элемента» click clickAndHold/release sendKeys keyDown/keyUp
  53. 53. Алексей Баранцев, Software-Testing.Ruemail: barancev@gmail.comskype: barancevhttp://software-testing.ru/test_automation/http://software-testing.ru/trainings/http://selenium2.ru/

×