ОПЫТ ВНЕДРЕНИЯ JDI МОРОКОВ ДАНИЛА Июль 25, 2017 CONFIDENTIAL 1
JDI в моих проектах M 1 M 2 M 3 M 4 M 5 M 6 M 7 M 8 M 9 M 10 M 11 M 12 Population Analytics ➜ Требовался глубокий рефакторинг ➜ Много «голого» Seleniuma ➜ JDI использовался на уровне Page. Object’a Reporting Information ➜ Живой проект, много тест кейсов ➜ Расширение покрытия ➜ Производительность и стабильность Merck BIODB ➜ Срочное восстановление прогона ➜ Много дебага CONFIDENTIAL 2
Почему JDI 1 Партия как бэ намекает. . 2 Если Page Object, то каскадная инициализация 3 Типизированные web-элементы со встроенными методами 4 Гибкая система Preconditions 5 Enum-ориентированность 6 Возможность параллельного запуска* CONFIDENTIAL 3
Но есть боль 1 Поиск элементов без ожидания 2 Несколько проблемных элементов 3 Таблицы работают только для «правильных» таблиц 4 Секции и уровни HTML дерева 5 Slow-mo дебаг 6 Матчеры в ассертах 7 Консольные логи как Война и Мир CONFIDENTIAL 4
Про поиск элементов • void wait. Displayed(); • void wait. Vanished(); • void wait. Text(); • void wait(Function result. Func) { boolean result = wait(result. Func, r -> r); asserter. is. True(result); } • void admin. Label. wait(el -> el. is. Displayed(), 60); CONFIDENTIAL 5
Про сложные элементы CONFIDENTIAL 6
Про таблицы CONFIDENTIAL 7
Про секции CONFIDENTIAL 8
Про секции CONFIDENTIAL 9
Про секции CONFIDENTIAL 10
Про секции CONFIDENTIAL 11
Про секции @JPage(url = "/#/settings/change-pin") public static Settings. Page settings. Page; @Find. By(css = "nav") public static Header header; @Find. By(css = ". alert-warning") public static Popup. Message alert. Message; @Find. By(css = ". cg-notify-message") public static Popup. Message popup. Message; @Find. By(xpath = "//*[contains(@class, 'cg-notify-message-template')]/. . " ) public static Popup. Message popup. Message. Unassigned. Report ; @Find. By(css = ". modal-content") public static Popup. Warning popup. Warning; CONFIDENTIAL 12
Про секции • @Find. By(css = ". modal-content") public static Popup. Warning popup. Warning; • @Find. By(xpath = "//ancestor: : body//*[contains(@class, 'alert-success')]" ) public Popup. Message popup. Message; • @Find. By(css = ". modal-content") @Section(global = true) public static Popup. Warning popup. Warning; CONFIDENTIAL 13
Про дебаг CONFIDENTIAL 14
Про матчеры • • assert. Not. Displayed() • CONFIDENTIAL assert. Displayed() is. Displayed() – ищет в цикле всегда 15
Про логи @Test() public void check. Report. Group. All() { reports. Page. select. Tab(ALL); reports. Page. search(accession. No 1); reports. Page. check. Report. Status(accession. No 1, NEW); reports. Page. open. Report(accession. No 1); report. Page. start. From. Scratch(); report. Page. perform. Action(REVIEW_COMPLETE); … … … CONFIDENTIAL 16
Про логи CONFIDENTIAL 17
Вывод Организационный • JDI хотелось бы сделать отдельным проектом • Сначала широкий функционал потом частный Технический • Баги надо чинить • Производительность повышать • Не бояться использовать @Deprecated CONFIDENTIAL 18
СПАСИБО ЗА ВНИМАНИЕ МОРОКОВ ДАНИЛА Июль 25, 2017 CONFIDENTIAL 19