SlideShare a Scribd company logo
STABILITY IN UNSTABILITY
SELF-HEALING
TEST AUTOMATION
Анна Чернышева
Lead Test Automation Engineer, EPAM
WEB TESTING
Akita owner
https://github.com/alfa-laboratory/akita
MANUAL

TESTING
SIMPLE
AUTOMATION

TOOLS
AGILE,
FAST
AUTOMATION
CONTINOUS
TESTING
ML, AI
TESTING
БЫСТРЫЙ ЦИКЛ ОБРАТНОЙ СВЯЗИ МЕЖДУ
РАЗРАБОТЧИКАМИ И РЕЗУЛЬТАТАМИ
ТЕСТИРОВАНИЯ
АВТОМАТИЗИРОВАННЫЕ ТЕСТЫ
ПРОСТЫЕ, ЭФФЕКТИВНЫЕ И СТАБИЛЬНЫЕ
РЕДИЗАЙН
ПОТОМУ ЧТО ФРОНТ ТАК РЕШИЛ
<div class="column-control__column column-control__column-padding-tile
column-control__column-mobile-res-100 column-control__column-min-res-100
column-control__column-middle-res-50 column-control__column-max-res-50
column-control__padding-tile-min column-control__padding-tile-middle
column-control__padding-tile-mobile column-control__padding-tile-max">
<div class="column-control__column-par">
<div data-component="BannerBuilder"
id="content_en_homepage-themes_2019_D306_jcr-
content_content-paragraph_column-control-dff9_column-0-content_banner-
builder-8bf1"
class="banner-builder banner-builder__wrapper js-flyer-
component banner-builder__1548877541698">
~ 1500 тестов
~ 40% падений тестов из-за изменения локатора
ТРАТИМ ВРЕМЯ НА ОБНОВЛЕНИЕ ЛОКАТОРОВ,
ВМЕСТО НАПИСАНИЯ НОВЫХ ТЕСТОВ
Хватит это терпеть!
NoSuchElementException
Self Healing Tests - No More Unstable Tests
КАК ЖЕ
ЗАСТАВИТЬ
ТЕСТЫ
ЧИНИТЬ
САМИХ СЕБЯ?
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
CatDog
РАСПОЗНАВАНИЕ ИЗОБРАЖЕНИЙ
НАЖАТА «ДОБАВИТЬ В КОРЗИНУ»
Вырезаем и сохраняем изображение кнопки
НАЖАТА «ДОБАВИТЬ В КОРЗИНУ»
Вырезаем и сохраняем изображение кнопки
НАЖАТА «ДОБАВИТЬ В КОРЗИНУ»
Вырезаем и сохраняем изображение кнопки
НАЖАТА «ДОБАВИТЬ В КОРЗИНУ»
Определяем, где сохраненный фрагмент
находится на экране и нажимаем на нее
PROS & CONS
‣ Простота написания и
поддержки тестов
‣ Запуск тестов на
всевозможных
окружениях
‣ Быстрое обнаружение
изменений на UI
‣ Долго обучать нейронку
‣ Нужен эталон
‣ Ложные срабатывания
https://applitools.com/
ДИНАМИЧЕСКИЕ ЛОКАТОРЫ
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
‣ В режиме реального времени
анализируем DOM страницы,
извлекаем объекты, их
атрибуты и ранжируем
‣ Рейтинг локатора
увеличивается
шаг теста пройден с локатором
вверху списка
‣ Рейтинг текущего локатора
уменьшается и используется локатор
ниже из списка
шаг теста упал с локатором вверху
списка
‣ Просим перепроверить UI
ни один из локаторов не подходит
PROS & CONS
‣ Динамическое
обновление состояния
‣ Простота написания и
поддержки тестов
‣ ML алгоритм надо учить
‣ Только для новых
тестов
‣ Зависимость от
реализации поиска
элемента
ИНСТРУМЕНТЫ НА РЫНКЕ
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
СУЩЕСТВУЮЩИЕ ИНСТРУМЕНТЫ
ЗАСТАВЛЯЮТ ЖИТЬ В ИХ ЭКОСИСТЕМЕ
ЗАДУМАЛИСЬ О НОВОМ ПОДХОДЕ
ИДЕЯ И ВИДЕНЬЕ
‣Для использования на любом этапе развития проекта
‣Без зависимости от фреймворка
‣Замена статических локаторов динамическими
ИДЕЯ И ВИДЕНЬЕ
‣Для использования на любом этапе развития проекта.
‣Без зависимости от фреймворка.
‣Замена статических локаторов динамическими
PoC
Определяет сходства (или различия) между двумя графами
graph edit distance (GED)
Расстояние редактирования между g1 и g2, представляет собой
количество операций редактирования, при которых g1 достигает g2.
Преобразование g1 в g2 с помощью операций
замены, вставки, удаления
Deleted a Deleted div
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
//button[contains(@class,'default-btn')]
<button role="button" type="button" class="button
button_size_m default-btn"><span
class="button__content"><span
class="button__text">Кнопка</span></span></button>
БЫЛО
<button role="button" id="id-id" type="button" class="button
button_size_l"><span class="button__content"><span
class="button__text">Кнопка</span></span></button>
СТАЛО
In node body > div#react-app > div.app.app_theme_alfa-on-white >
div.app.app_theme_alfa-on-white > div.page.page_theme_alfa-on-white >
div.page__content.page__content_offset > div.content.content_theme_alfa-on-white >
div > div > div > div:
    Removed: <button role="button" type="button" class="button button_size_m
button_theme_alfa-on-white default-btn">...</button>:
    body > div#react-app > div.app.app_theme_alfa-on-white > div.app.app_theme_alfa-
on-white > div.page.page_theme_alfa-on-white > div.page__content.page__content_offset
> div.content.content_theme_alfa-on-white > div > div > div:nth-of-type(1) > div
    Added: <span class="checkbox-group checkbox-group_type_normal checkbox-
group_theme_alfa-on-white control-group" role="group" tabindex=«-1»>…</span>
.
.
.
НАХОДИМ РАЗНИЦУ МЕЖДУ ДВУМЯ DOM
СТАНИЦЫ
In node :root:
Modified: <button role="button" id="id-id" type="button" class="button
button_size_mbutton_size_l button_theme_alfa-on-white default-btndata">...</button>:
In node :root:
Removed: <button role="button" type="button" class="button button_size_m
button_theme_alfa-on-white default-btn">...</button>:
    Added: <span class="checkbox-group checkbox-group_type_normal checkbox-
group_theme_alfa-on-white control-group" role="group" tabindex="-1">...</span>:
In node :root:
    Removed: <button role="button" type="button" class="button button_size_m
button_theme_alfa-on-white default-btn">...</button>:
    Added: <span class="input-group input-group_width_available input-
group_theme_alfa-on-white control-group" role="group" tabindex="-1">...</span>:
СРАВНИВАЕМ ADDED ЭЛЕМЕНТЫ С
ИСКОМЫМ
//body/div[@id="react-app"]/div[contains(concat(" ",normalize-space(@class),"
")," app ")][contains(concat(" ",normalize-space(@class)," ")," app_theme_alfa-
on-white ")]/div[contains(concat(" ",normalize-space(@class)," ")," app ")]
[contains(concat(" ",normalize-space(@class)," ")," app_theme_alfa-on-white ")]/
div[contains(concat(" ",normalize-space(@class)," ")," page ")][contains(concat("
",normalize-space(@class)," ")," page_theme_alfa-on-white ")]/
div[contains(concat(" ",normalize-space(@class)," ")," page__content ")]
[contains(concat(" ",normalize-space(@class)," ")," page__content_offset ")]/
div[contains(concat(" ",normalize-space(@class)," ")," content ")]
[contains(concat(" ",normalize-space(@class)," ")," content_theme_alfa-on-white
«)]/div/div/div/div/button
ФОРМИРУЕМ НОВЫЙ ЛОКАТОР
public WebElement findElement(By by) {
WebElement el;
try {
el = super.findElement(by);
} catch (NoSuchElementException ex) {
By newBy = getNewLocator();
el = findElementByNewLocator(newBy);
}
return el;
}
EventDriver extends EventFiringWebDriver
STABILITY IN UNSTABILITY SELF-HEALING  TEST AUTOMATION
СТРАТЕГИЯ
На каждое действие сохраняем состояние DOM
СТРАТЕГИЯ
На каждое действие сохраняем состояние DOM
NoSuchElementException
СТРАТЕГИЯ
На каждое действие сохраняем состояние DOM
Находим разницу между двумя DOM и предлагаем
вариант нового локатора
NoSuchElementException
СТРАТЕГИЯ
На каждое действие сохраняем состояние DOM
Находим разницу между двумя DOM и предлагаем
вариант нового локатора
Сохраняем успешный локатор и предлагаем
использовать его
NoSuchElementException
PROS
‣ Хорошо работает при изменении атрибутов
‣ Нет привязки к конкретной экосистеме
‣ Для проектов на любой стадии разработки
CONS
‣ Привязка к Selenium
‣ Новые локаторы выглядят устрашающе
‣ Высокое потребление памяти
‣ Пока не стабильно при больших изменениях
DOM с глубокой вложенностью
BROWSER PLUGIN
JsonWireProtocol
Response Status Codes
7 NoSuchElement
An element could not be located on the page using the
given search parameters.
POST /session/:sessionId/element
Search for an element on the page,
starting from the document root.
Command Summary
LIFEHACK
//*[@id=«react-app»]/div/div[1]/div/div[2]/div/div/div/
div[1]/div/div/button
//*[@id=«react-app»]/div/div[1]/div/div[2]/div/div/div/
div[1]/div/div
LIFEHACK
Обращение к родителю не найденного элемента
работает в ~70% случаев
//*[@id=«react-app»]/div/div[1]/div/div[2]/div/div/div/
div[1]/div/div/button
//*[@id=«react-app»]/div/div[1]/div/div[2]/div/div/div/
div[1]/div/div
Q&A
facebook.com/anna.chernyshova.79

More Related Content

PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
Stability in unstability self healing test automation - selenium camp
PPT
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
PPT
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
PDF
Angular 2: Всех переиграл
PDF
Layout testing with galen framework selenium camp
Storytelling For The Web: Integrate Storytelling in your Design Process
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
2024 Trend Updates: What Really Works In SEO & Content Marketing
Stability in unstability self healing test automation - selenium camp
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Angular 2: Всех переиграл
Layout testing with galen framework selenium camp
Ad

STABILITY IN UNSTABILITY SELF-HEALING TEST AUTOMATION