Selenium Flashcards

1
Q

Что такое Selenium и зачем его используют

A
  1. Инструмент для автоматизации шагов пользователя в браузере
  2. SeleniumHQ - придумали язык запросов для взаимодействия с браузерами и он был стандартизирован - webdriver protocol. java\python -> webdriver protocol.
  3. На текущий момент SeleniumHQ пишет библиотеки для языков программирования. А разработчики браузеров - драйвера для своих браузеров.

Клиент: клиентские библиотеки (java\python…)
Бэкэнд: драйвер браузера

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое драйвер браузера?

A

Программная библиотека которая позволяет взаимодействовать с браузером.

Драйвер - как драйвер принтера

не имеющая пользовательского интерфейса программная библиотека, которая позволяет различным программам взаимодействовать с браузером, управлять его поведением, получать от браузера данные и заставлять браузер выполнять команды.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие виды локаторов страницы есть?

A
  • CSS selector
  • XPath selector
  • Link text selector
  • Partial link text selector
  • Tag name

ID - в коде реализован через CSS селектор

Локатором является пара: стратегия локатора и значение стратегии локатора

Типы селекторов: только css и xpath

Официальная документация стандарта w3c: https://w3c.github.io/webdriver/#locator-strategies

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Преимущества и недостатки локаторов

  • CSS selector
  • XPath selector
  • Link text selector
  • Partial link text selector
  • Tag name
A
  • CSS selector:
    • Нативные для браузера - поэтому поиск по ним более быстрый (чем по xpath)
    • Намного более лаконичны, кратки и читаемы. Используют более простой, менее громоздкий синтаксис
    • Стимулирует команду делать продукт более тестируемым
  • XPath selector:
    • Более громоздкий
    • Делает то, что не может css: поиск по дереву, поднятие вверх по дереву, нахождение соседних элементов и может искать по тексту

Более читабельные:
* Link text selector (xpath)
* Partial link text selector (xpath)
* Tag name (css)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое Selenium Waits?

A
  • Явные - ждёт выполнение условия. Используется для каждого конкретного элемента.
    • expected_conditions
    • можно сделать неявными скрыв в функции
  • Неявные ожидания - устанавливаются один раз, но ждут только до появления элемента в DOM (еще возможно не видим на странице)

Нельзя использовать вместе согласно официальной документации.
В большинстве случаев используют явные ожидания.

Fluent wait - webdriverwait играет роль fluent wait т.к. язык динамический, т.к. тип не определен - можно передать туда все что угодно вместо драйвера

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какие exceptions может оставить Selenium?

A

Много. Все запоминать не рекомендуется.

Самые известные:
* StaleElementReferenceException - устаревший элемент (нет на странице)
* NoSuchElementException

Что делать: ничего не выполнять без вейтов.

Все наследуется от WebDriverException и они все передаются в вейтах

ignored_exceptions=(WebDriverException,)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Как вычитать данные из динамической вебтаблицы

A

Необходимо сначала определить количество колонок и столбцов в данный момент с помощью xPath и тэгов <td>, <tr>, а затем обращаться к определённой ячейке или итеративно получить данные из всех ячеек.

Как с обычной таблицей через wait

def cell(row_number, column_number):
    def find_cell(driver):
        return table.find_elements(By.TAG_NAME, 'tr')[
		row_number - 1
		].find_elements(By.TAG_NAME, 'td')[column_number -1]
    return find_cell

cell = wait.unitl(cell(2, 1))
cell.click()
cell.find_element(By.TAG_NAME, 'input').send_keys('text')

w/ lambda

def cell(row_number, column_number):
    return lambda driver: table.find_elements(By.TAG_NAME, 'tr')[
		row_number - 1
		].find_elements(By.TAG_NAME, 'td')[column_number -1]

https://www.loom.com/share/774416dc80a94b6aa4cab80a2e6287a9

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое Selenium Grid?

A

Кластер, состоящий из нескольких Selenium-серверов. Предназначен для организации распределённой сети, позволяющей параллельно запускать много браузеров на большом количестве машин. Имеется выделенный сервер, который носит название «хаб» или «коммутатор», а остальные сервера называются «ноды» или «узлы».

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое Selenoid?

A

Параллельный запуск браузеров в докер контейнерах

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Отличия Selenium Grid от Selenoid?

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как запустить тесты параллельно?

A

pytest-xdist автоматически распределяет тестовые сценарии между потоками для параллельного выполнения.

pytest -n 2 - где 2 это количество потоков
pytest tests/ -n auto

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какие способы cliсk и send keys есть в Selenium?

A

driver.find_element
1. обычный webelement.click()
2. js driver.execute_script(‘arguments[0]’, webelement)
3. ActionChains(driver).
* double_click
* context_click
* click and hold

webelement.send_keys(‘foobar’)
webelement.send_keys(Keys.ENTER)
webelement.send_keys(‘foobar’ + Keys.ENTER)
send_keys - парсит строку текста на буквы и каждую букву посылает по отдельности. Для ввода текста полностью используется js

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Что такое Appium?

A

Реализация selenium webdriver протокола и драйверов для мобильных устройств. Частично расширенный.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Концепция дизайна Appium

A

Appium — HTTP-сервер, написанный на платформе Node.js, который управляет сессиями iOS и Android, используя проводной протокол WebSON JSON. Следовательно, перед инициализацией сервера Appium Node.js должен быть предварительно установлен в системе.
Когда Appium загружен и установлен, на нашем компьютере настраивается сервер, который предоставляет REST API.
Он получает запрос на подключение и команду от клиента и выполняет эту команду на мобильных устройствах (Android / iOS)
Он отвечает HTTP-ответами. Опять же, чтобы выполнить этот запрос, он использует платформы автоматизации мобильных тестов для управления пользовательским интерфейсом приложений.
Ограничения:

  • Инструменты Apple для iOS (инструменты доступны только в Xcode 3.0 или более позднейверсии с OS X v10.5 и более поздней версии)
  • Google UIAutomator для Android API уровня 16 или выше
  • Selendroid для Android API уровня 15 или ниже
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Назовите два способа автоматизации капчи.

A
  1. Боты с поддержкой оптического распознавания символов (OCR) - в этом подходе КАПЧА решается автоматически с помощью бота.
  2. Услуги по решению капчи реальными людьми - в сервисе есть сотрудники, которые постоянно доступны онлайн для решения капчи. Когда вы отправляете свою КАПЧУ, компания пересылает ее работникам, которые ее решают, и отправляет обратно решения.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Как найти поврежденные ссылки в Selenium WebDriver?

A
  1. Собрать все ссылки на веб-странице на основе тега <a> (ссылки).
  2. Сделать запрос к ссылке и проверить статус код через response
  3. Повторить это для всех захваченных ссылок.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Какую технику следует применить, если «нет ни frame id, ни frame name»?

A

CSS или XPath

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Расскажите, как вы будете строить и внедрять стратегию автоматизации тестирования.

A
  1. https://youtu.be/Q9Q-JhgogTM
  2. https://habr.com/ru/articles/275171/

3 варианта стратегий, характерных для самого начала развёртывания автоматизации.

1. Стратегия «Let’s try»

Применяется в том случае, когда АТ ни на проекте, ни в компании по сути никогда не было, и планируется осторожный старт с умеренным выделением ресурсов.

Имеет смысл применять в случае, когда:

  • Отсутствуют точные цели автоматизации (покрыть 40% кода конкретного модуля к определённой дате, уменьшение расходов на ручное тестирование и т.д.).
  • АТ на проекте ранее никогда не применялась.
  • У тестировщиков отсутствует (или очень мал) опыт АТ.
  • Выделенные ресурсы умеренны или низки.

Описание стратегии:

  • Больше внимания уделять подготовительным этапам тестирования (составление тест-планов, тест-кейсов и т.д.).
  • Больше внимания уделять инструментам, которые можно использовать как помощь в ручном тестировании.
  • Больше экспериментировать с технологиями и методологиями АТ. Никто не ждёт срочных результатов и можно экспериментировать.
  • Работать с проектом, начиная с верхнего уровня, в начале не углубляясь в автоматизацию конкретных модулей.

2. Стратегия «Here the target»

Особенностью стратегии служит ориентирование на конкретный результат. Выбирается/определяется цель нового этапа АТ, и задачи ориентируются на достижения данного результата.

Имеет смысл применять в случае, когда:

  • Когда на проекте уже проведена предварительная работа, имеется какой-то бэкграунд в виде тест-планов, тест-кейсов, автотестов предыдущего этапа АТ.
  • Есть конкретная цель АТ (не глобальная — 80% автотестов за полгода, а скорее 50% автотестов конкретного модуля за месяц)
  • Для выполнения конкретной цели выбраны конкретные инструменты, оптимально если у специалистов имеется некий технический бэкграунд по работе с инструментами.

Описание стратегии:

  • Поступательная стратегия, чем-то напоминающая Agile методологии разработки. Движение вперёд этапами. Покрытие автотестами модуля за модулем, до полного выполнения мета задач вида (80% за полгода).
  • На каждый этап выставляется новая цель (вероятнее всего продолжающая последнюю выполненную цель, но не обязательно), и выбираются инструменты для реализация данной цели.
  • Глубокая фокусировка на конкретной цели, написание тест-кейсов, автотестов, не для всего проекта, а исключительно под конкретную задачу.

1.3 Стратегия «Operation Uranum»

По сути, стратегия — постоянная и методичная работа над АТ по выставляемым раз в 2-3 недели приоритетам. Оптимально — наличие постоянно работающего именно над автоматизацией человека, не особенно отвлекающегося на сторонние задачи.

Имеет смысл применять в случае, когда:

  • Отсутствуют конкретные цели, есть лишь общее пожелание «чтоб всё было хорошо». Если «Here the target» напоминает по принципу работы Agile, то данная стратегия близка по духу к методологии Waterfall.
  • Есть ресурс в виде хотя бы одного постоянно действующего на проекте человека, плотно занятого задачей автоматизации.
  • Нет чётко выраженных целей АТ, однако есть пожелания (приоритеты), которые можно выставить на достаточно продолжительный период времени (данные модули более важны, нежели те, больше ошибок традиционно в бэкэнде/фронтэнде, потому большие усилия стоит направить на него).

Описание стратегии:

  • Идея стратегии описана выше, постоянная и методичная работа с учётом выставленных приоритетов.
  • В начале нужен упор в базовую часть, поскольку так или иначе в рамках данной стратегии автоматизируется весь проект, без полной фокусировки на конкретных модулях.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Как взаимодействуют клиентская библиотека Selenium, драйвер браузера и сам браузер?

A

Клиентская библиотека Selenium отправляет команды драйверу браузера по стандартизированному протоколу, который в свою очередь управляет браузером, выполняя действия на веб-странице. Результаты выполнения команд возвращаются обратно через драйвер браузера клиентской библиотеке Selenium.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Для чего используют browser capabilities

A

Для хранения данных о браузере и его версии

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Для чего используют browser arguments?

A
  • отключение уведомлений
  • блокировка изображений
  • изменение языка ui
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Для чего используют browser options?

A
  • размер окна браузера
  • настройка таймаутов
  • стратегия загрузки страницы
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Для чего используют browser options, capabilities, arguments?

A

Options:

  • размер окна браузера
  • настройка таймаутов
  • стратегия загрузки страницы

Arguments:

  • отключение уведомлений
  • блокировка изображений
  • изменение языка ui

Capabilities

  • Для хранения данных о браузере и его версии
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Что такое iframe и как с ним работать в Selenium?

A

iframe - для встраивания другого HTML-документа в текущий.

Сторонние виджеты, встроенные видео или реклама.

Фрейм (Frame/iFrame) — самостоятельный документ, который отображается в отдельном окне браузера и представляет собой полностью законченную HTML-страницу. Простыми словами, фрейм — разделитель браузерных окон на отдельные области.

Способы переключаться на iframe:

По индексу driver.switchTo().frame(i);
По имени или идентификатору driver.switchTo().frame(“a077aa5e”);
По веб-элементу driver.switchTo().frame(driver.findElement(By.cssSelector(“#modal>iframe”));

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Как обрабатывать браузерные сообщения (alerts)?

A
  1. driver.switch_to.alert - этот метод позволяет переключиться на активное браузерное сообщение.
  2. alert.text - с помощью этого метода можно получить текст сообщения.
  3. alert.accept() - метод для подтверждения (нажатия на кнопку “OK”) браузерного сообщения.
  4. alert.dismiss() - метод для отклонения (нажатия на кнопку “Cancel”) браузерного сообщения.
  5. alert.send_keys(text) - метод для ввода текста в поле браузерного сообщения (только для prompt).

В selene:
browser.driver().switch_to.alert.accept()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Что такое Electron-based applications?Как использовать Selenium и Appium для их тестирования?

A

Electron - фреймворк разработки кроссплатформенных приложений на основе web (html, css, js)

27
Q

Типы команд Selenium

A
  • Действия – функциональное действие над тестируемым веб-приложением в браузере. Например, заполнение полей, нажатие на кнопку и т.п.
  • Проверки – выполнение проверок на тестируемой странице. Например, проверка того, что определенное поле формы имеет указанное значение, или проверка заголовка окна.
  • Ожидания – организация того как, сколько и какого события будет дожидаться Selenium (ожидания загрузки страницы, ajax и т.д.).
28
Q

Как написать метод isElementPresent

A

driver.findElement(By.*).isDisplayed()

29
Q

Selenium - найти элемент

A

driver.find_element(By.CSS_SELECTOR)

По ID: driver.find_element_by_id("testing_form")
По классу CSS: driver.find_element_by_class_name(" form-control ")
По XPath: driver.find_element_by_xpath("//input[@name='email']")
Пот тэгу: driver.find_element_by_tag_name("input")
По тексту ссылки: driver.find_element_by_link_text('Start Free Testing')

selene - browser.element()

30
Q

Selenium - найти коллекцию элементов

A

driver.find_elements(By.CSS_SELECTOR)

selene - browser.all()

31
Q

Открыть сайт

Selenium

A

driver.get(absolute_url)
browser.open(absolute_or_relative_url)

32
Q

Фикстура

A

Декоратор pytest запускающий код до и после теста. Используется для:
1. Конфигурации браузера и драйвера
2. Сохранения логов, скриншотов, html
3. Закрытия браузера

Все что не требует teardown (после yeild) - должно быть функцией\методом

@pytest.fixture(autouse=True)

33
Q

Анатомия теста

A
  • Arrange
  • Act
  • Assert
  • Cleanup
  • Предусловия
    • Логин
  • Тест
    • Положить товар в корзину
    • Проверить наличие товара в корзине
  • Постусловия
    • Удаление тестовых данных
    • Скриншот браузера
    • Собрать логи браузера

Постусловия выполняются независимо от успешности теста

  1. Arrange
  2. Act
  3. Assert
  4. Cleanup

Arrange is where we prepare everything for our test. This means pretty much everything except for the “act”. It’s lining up the dominoes so that the act can do its thing in one, state-changing step. This can mean preparing objects, starting/killing services, entering records into a database, or even things like defining a URL to query, generating some credentials for a user that doesn’t exist yet, or just waiting for some process to finish.

Act is the singular, state-changing action that kicks off the behavior we want to test. This behavior is what carries out the changing of the state of the system under test (SUT), and it’s the resulting changed state that we can look at to make a judgement about the behavior. This typically takes the form of a function/method call.

Assert is where we look at that resulting state and check if it looks how we’d expect after the dust has settled. It’s where we gather evidence to say the behavior does or does not align with what we expect. The assert in our test is where we take that measurement/observation and apply our judgement to it. If something should be green, we’d say assert thing == “green”.

Cleanup is where the test picks up after itself, so other tests aren’t being accidentally influenced by it.

At its core, the test is ultimately the act and assert steps, with the arrange step only providing the context. Behavior exists between act and assert.

https://docs.pytest.org/en/stable/explanation/anatomy.html#test-anatomy

34
Q

Conftest.py

A
  1. Лежит в папке с тестами
  2. Запускается перед тестами
  3. Содержит фикстуры
  4. Используется для конфигурирования тестов
35
Q

Проверка количества элементов

Selenium

A

Через len() коллекции. Обязательно с вейтом

webelements = driver.find_elements(*to_locator(selector))
        actual_value = len(webelements)
        if actual_value != value:
            raise AssertionError(f'Number of elements is not {value}\nActual value = {actual_value}')
        else:
            return webelements
36
Q

О выборе языка и фреймворка

A

> Кто нибудь использовал selene на большом проекте как основной инструмент для автоматизации?

> Он сильно уступает в удобстве selenide+ java?

Вопрос в такой форме не совсем коректный, нельзя сравнивать без контекста. Нельзя сравнивать какой то там астон мартин с тойотой. Ибо не знаем где надо ездить (траса, город, бездорожье, гоночный трек), какие задачи стоят перед автомобилем.

Язык и фреймворк всегда надо подбирать под проект, и размер проекта это только один из критериев, при том не факт що самый важный.

Поскольку контекст не озвучен, то могу просто поделиться следующими тезисами выведенными из моего опыта:

  • java как язык программирования именно для автоматизации (а не разработки) - самое ограниченное и неудобное из всего что только можно придумать. Если на проекте уже используется на бекенде хотя бы или на мобильном фронте котлин - то лучше взять его.
  • javascript = гибкий мощный и сложноватый для большинства - но лучший выбор если библиотека в связке с ним (плейврайт, сайпрес, и т.д.) - подходит под задачи автоматизации, поддержку нужных девайсов и так далее
    • потому что ближе всего к фронтенду и проще всего построить настоящий QA где девы берут участие в автоматизации тестирования
  • python, ruby - простые легкие во многом приятные языки, с# посложней но иногда еще мощней - всех их лучше выбирать, если js не подходит а бекенд написан на одном из этих языков (тогда такой и выбираем). Джаву выбираем по этой же и только по этой причине, а не потому что она популярней и в ней есть селенид.
  • если проект очень большой, состоит из множества компонентов, и разных команд за них ответственных, и за E2E тестирование отвечает отдельная команда, и всегда будет отвечать, то тогда пофиг на чем ей автоматизировать эти E2E тесты, и можно взять что-то максимально простое для такой команды, и в большинстве случаев - это именно python.

Соответственно, python + selene “удобней чего бы то ни было в том числе и java + selenide” в случаях:

  • когда на бекенде питон, а js не подошел
  • когда надо писать E2E тесты силами отдельно выделенной команды, которая всегда такой “выделенной” и “отделенной от других” и останется
37
Q

Правила хороших локаторов

A
  1. Точность (находит то, что нужно)
  2. Уникальность (не находит то, что не нужно)
  3. Хороший локатор должен быть устойчив к изменениям.
  4. Хороший локатор должен быть понятным.
  5. Хороший локатор должен существовать
    ___
  • Хороший локатор должен быть устойчив к изменениям
    • Это, пожалуй, самое главное. Если после небольшого изменения тестируемого приложения все тесты приходится переделывать – это просто катастрофа.
    • Есть изменения, которые изначально заложены в приложение и могут определяться его настройками – локализация, расположение блоков на странице (например, включить/отключить рекламные блоки), “шкурки” (skins) и прочее. Локаторы нужно сразу проектировать так, чтобы они работали с разными вариантами настроек.
    • Есть изменения, которые случатся в будущем. Тут заранее подготовиться на 100% нельзя, но можно хотя бы постараться предугадать, с чем эти изменения будут связаны. Например, если сейчас пока приложение одноязычное, но есть планы выхода на новые рынки – вероятно, добавятся разные локализации, поэтому поиск элементов по тексту перестанет работать. Если дизайнер скажет, что кнопки нужно сделать не прямоугольными, а закруглёнными – поменяются стили и вёрстка кнопок, поэтому полагаться при поиске на конкретный стиль рискованно, лучше выбрать какие-то более стабильные признаки.
      Конечно, при массированном изменении тестируемого приложения противостоять изменениям в тестах не удастся, но это вполне ожидаемо. Но незначительные изменения не должны приводить к разрушению тестов.
  • Хороший локатор должен быть понятным.
    • Когда вы разрабатываете тесты, вы помните структуру страницы и можете легко представить, что найдётся по тому или иному локатору. Но через несколько месяцев память будет уже не так свежа, и глядя на запутанный локатор будет уже не так легко догадаться, что он ищет или хотя бы что он должен искать.
    • Конечно, можно добавить комментарии и пояснения. Но лучше всё таки стремиться к выразительности и понятности самих локаторов. Они должны быть простыми и осмысленными. Тогда читать и понимать старые тесты будет легко и приятно.
  • Хороший локатор должен быть.
    • Увы, иногда хороший локатор вообще не удаётся построить. Вёрстка страницы плывёт, свойства элементов постоянно меняются. Если пытаться написать простой локатор – он оказывается неустойчивым, уже на следующий он не работает. В попытках повысить устойчивость повышаем сложность локаторов – но уже не через месяц, а через неделю становится непонятно, что они ищут, потому что прочитать локатор длиной в две строчки вообще невозможно.
    • И тогда у тестировщика опускаются руки, он говорит “приложение невозможно автоматизировать” и уходит.
    • Это неправильно. Нужно бороться за свои права.
    • Идите к разработчикам и договаривайтесь о повышении тестопригодности приложения. Вообще-то они хорошие люди, просто они думали о своих проблемах и не думали о ваших. Если вы не расскажете им о том, что вам нужно от приложения – как они узнают?

https://barancev.github.io/good-locators/

38
Q

Можно ли делать get_attribute для получения значения из поля?

A

Иногда можно. Но в основном это говнокод и мы всегда в тестах должны знать - что мы получим в конце.

39
Q

Selene - клик через js

A

browser.element().with_(click_by_js=True)

40
Q

Загрузка изображений

A

browser.element("#uploadPicture").set_value(...)

41
Q

Абсолютны путь к папке с изображениями

A

Оптимальное:

import os
import resources

RES_DIR = os.path.abspath(os.path.join(os.path.dirname(resources.\_\_file\_\_), "images"))

Соедняем с файлом изображения:

browser.element("#uploadPicture").set_value(os.path.join(RES_DIR, img_name))

Короткая альтернатива:

from pathlib import Path

browser.element("#uploadPicture").set_value(str(Path(resources.\_\_file).joinpath('resources/foto.jpg').absolute())

Старое:

import os
import tests

CURRENT_FILE = os.path.abspath(tests.\_\_file\_\_)
CURRENT_DIR = os.path.dirname(CURRENT_FILE)
RES_DIR = os.path.join(CURRENT_DIR, os.path.pardir, "resources/images")
42
Q

Объединение абсолютного пути папки с именем изображения

A

os.path.abspath(os.path.join(RES_DIR, "tom-byrom.jpg"))

43
Q

Ассерты

A

browser.element().should(have.text('...'))

44
Q

Ожидающе проверить наличие элемента и вернуть True\False

A

browser.element().wait_until(have.title'TodoMvc')

45
Q

Сразу проверить наличие элемента и вернуть True\False

A

browser.element().matching(have.title'title')

46
Q

Могут ли быть ветвления и циклы в тестах?

A

В тестах ветвлений и циклов быть не может. Они должны быть максимально простыми - KISS

Но если требуется (иногда всплывающее окно) - то надо спрятать ветвление в функцию (аналогично с циклом)

47
Q

Как поймать в дебаге выпадающие списки и другие элементы, к которым просто доступ не получить?

A

На вкладке sources в devtools ввести:

setTimeout(()=>{debugger},3000)

Или
Chrome:
* break on
* subtree modificaton,
* attribute modifications,
* node removal

48
Q

Установка всех requirements

A

pip install -r .\requirements.txt

49
Q

ActionChains

A

actions = ActionChains(browser.driver)
actions.key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()

Аналог без ActionChains:

browser.element().type(Keys.COMMAND + 'a' + Keys.NULL)

  • Но Keys.COMMAND - остаётся зажат
  • Т.е. может произойти ctrl+v и в таком духе если отправить текст с этой буквой
  • Keys.Null - отжимает все клавиши
browser.element('#new-todo').type(
        Keys.COMMAND + 'a' + Keys.NULL + 'this task will overwrite original'
    )
50
Q

Обычные фикстуры

A
@pytest.fixture()
def driver():
    pass

@pytest.fixture()
def config():
    pass

@pytest.fixture()
def firefox(driver, config):
    return ""
51
Q

Работа с кликами

A
  1. Находим элемент и пробуем кликнуть
  2. Если не получается, то находим родителя и смотрим похож ли он на контейнер полноценный (его оболочка)
  3. Поднимаеся через xpath и кликаем по нему
    1. Если есть читаемый атрибут, то кликаем сразу по нему
  4. В более сложных случаях приходится искать: (./preceding-sibling::* или ./following-sibling::*) - элементы рядом
  5. В еще более служных происходит подъем на родителя, потом к сиблингу, потом у сиблинга взять дочерний элемент

обычно логика такая, находишь нужный элемент - пробуешь на нем кликнуть через browser.element(selector).click()

Не получается? -
Смотришь внутри какого элемента твой элемент находится - если родитель похож на прям вот осмысленного родителя контейнера этого элемента, типа “его оболочка” - пробуешь на нем кликнуть “поднявшись с помощью икспас на один уровень выше от найденного тобой элемента” - browser.element(selector).element(‘..’).click()

может быть у родителя есть тоже хороший атрибут читабельный, тогда можно будет упростить до browser.element(parent_selector).click()

в более сложных случаях, придется искать не parent (.. – в икспас) а сиблингов (./preceding-sibling::* или ./following-sibling::*) , то есть тех элементов что рядышком… в еще более сложных, может придется подняться на перента, потом от него к сиблингу перейти, и потом у сиблинга взять ребенка 🙂
это как раз и есть те случаи когда икспас решает

52
Q

Установка значения элементу в selene

A

browser.element().set_value('...') - очищает значение и устанавливает значение.

Не всегда срабатывает.

  • Альтернатива - просто type
  • Альтернатива - ctrl+A + ‘text’
53
Q

Как выбирать тесты для автоматизации?

A

UI auto - critical path
1. Уточняем основные цепочки действий, которые пользователи выполняют каждый день.
2. Узнаём какие из них имеют самый большой приоритет.
3. Автоматизируем happy path
4. На каждый happy path - обычно есть несколько причин, почему он ломается
5. Только один из них покрывается тестом селениума
6. Остальные негативные варианты покрываются API тестами

  • Порядок рендеринга и различные детали фронта - лучше всего покрываются frontend unit тестами
    1. Это должны делать разработчики
    2. Если они это не делают - то им надо помогать
    3. Выучить немного фронтенд и писать фронтовые юнит тесты - меньше боли, чем задалбываться с тысячами селениумовских тестов, которые даже с парралелизацией ждать пол ночи. Потом они падают и мы ищем и разбираемся в причинах
54
Q

Для чего нужен декоратор @dataclass?

A
class User:
    name: str
    age: int
    status: str
    items: list[str]

    def \_\_init\_\_(self, name, age, status, items):
        self.name = name
        self.age = age
        self.status = status
        self.items = items

    def \_\_eq\_\_(self, other): # позволяет сравнивать объекты
        return (self.name == other.name
                and self.age == other.age
                and self.status == other.status
                and self.items == other.items)

Dataclass позволяет не прописывать __init__ и __eq__. Он это делает за нас:

from dataclasses import dataclass

@dataclass # декоратор
class User:
    name: str
    age: int
    status: str
    items: list[str]
55
Q

Проверка таблицы в модальном окне

A
browser.element('.modal-content').element('.table').all('tr').all('td').should( ... )
56
Q

Выбрать селектор который исключает другой селектор (например день в календаре в текущем месяце - исключить дни из других месяцев)

A

browser.element(‘selector:not(selector)’).click

browser.element(f'react-datepicker_day--0{01}:not(.react-datepicker_day--outside-month)').click()
57
Q

Где хранить открытие страницы? В тесте или в фикстуре

A

Зависит от контекста. В большинстве случаев должно храниться в тесте как явный pre-condition

Тест должен быть явным и простым. То что происходит - должно быть видно - для упрощения поддержки

58
Q

Selene - проверить, перекрываются ли элементы чем-то другим

A

browser.config.wait_for_no_overlap_found_by_js = True

59
Q

Причины, почему делая действие над каким-то элементом не проходит

A
  1. Либо мы это делаем не по тому элементу, по которому нужно
    1. Возможно есть скрытые элементы или клоны
    2. В этом случае можно сделать browser.all(...).element_by(be.visible).click()
  2. Элемент не готов к действию
60
Q

Варианты оформления шагов в Allure

A

with allure.step('step_description') - Используется в современном мире.

Код почти не переиспользуется. Т.к. современные тесты это гибриды UI+API.

Например - создается максимально полный issue. Подверждается его создание через API. Затем все остальные issue создаются через API.

Декоратор @allure.step - Раньше при сложных UI (самописные, без фреймворков) использовался этот вариант.

Очень удобно, когда надо переиспользовать код.

В сорвеменном мире используется часто в банках.

61
Q

Как проектируются современные UI автотесты?

A

Комбинация UI + API

  1. Создаётся самый жирный E2E тест учитывающий все параметры
  2. А затем все остальные проверки делаются через API
62
Q

В Page Object как инкапсулируются шаги? Подбробно или большими блоками?

A
  1. Зависит от цели
  2. Если бизнес шаг - отправить форму и зарегистрировать пользователя, то происходит разделение на
    1. Открыть страницу
    2. Заполнить страницу
    3. Отправить
  3. Если бизнес шаги это - заполнить имя, заполнить фамилию, телефон и т.д. - то они все оформляются как отдельные шаги
63
Q

Технические детали, типа определения пути папке с изображениями и склеивание с именем изображения - что с ними делать?

A
  1. Выносим в функцию
  2. Функцию переносим в корневой пакет (demoqa_ui_tests) в папку с подходящим именем, например resources
  3. Импортируем сам модуль и обращаемся к функции через имя модуля resources.path(img_name)
64
Q

Правила построения локаторов

A
  1. Используйте то, что не подвержено изменениям
    1. Меняется верстка - не ссылаемся на нее
    2. Меняются адреса серверов - не используем их
  2. Семантические признаки
    1. Использовать семантические (смысловые) признаки, а не синтаксические
  3. Проверяйте уникальность
  4. Использовать якоря (2-3 зацепки это обычно предел):
    1. .product a
    2. #box-most-popular .product a
    3. #site-menu-li
  5. Используйте комбинации (использование нескольких частей создающих уникальность)
    1. #box-most-popular .product a (уникальный элемент и внутри него менее уникальный
    2. #footer a[href*=privacy-policy)
    3. select[name=zone_code]
    4. li[id^=select2-country_code][id$=US]
    5. a[href*=user_edit]:not([href$='user_id=1'])
  6. Избегайте избыточности
    1. Должно быть минимально необходимое количество признаков
  7. “Где-то в” или “прямо в”
    1. Элемент находится где-то внутри или прямо внутри блока
      1. Где-то внутри:
        1. #box-most-popular .product a
        2. site-menu li
      2. Прямо внутри:
        1. #site-menu > ul > li
  8. Не ищите по тексту
    1. Можно использовать только в самом крайнем случае (из-за интернациональности)
  9. Не используйте номера
    1. Порядковые номера это всегда плохо
    2. Нужно использовать семантические признаки
  10. Общайтесь с разработчиками