Сергей Слесарев
Автоматизированное тестирование (Python)
Занятие 09 - Автоматизация ручных тест-кейсов
01.07.2025
Сергей Слесарев
Содержание
Содержание
QA-AT-Python-08-ДЗ - условия
1. Напишите автотест, который проверит, что на странице https://slqa.ru/demo/dt/ заголовок (title) равен "Current Time" а на странице есть фразы "время по Гринвичу" и "время по Москве".
2. (*) Напишите автотест, который проверит, что дата и время по Москве и по Гринвичу на этой странице определяются правильно.
3. (**) Сделайте ДЗ из материалов академии: https://fs.top-academy.ru/api/v1/files/JVxouxm3Z5DE1M9YIcA1ahmbI2Oyrjyg?inline=true
4. (**) Изучите материалы урока академии и ответьте на контрольные вопросы: https://top-academy.site/тпо_at-урок-8-введение-в-selenium/
Задание-1: необходимые команды
Первым делом нам надо импортировать библиотеку selenium:
from selenium import webdriver
Затем отметить функцию как тест и придумать ей имя:
def test_01_check_title():
Затем создать объект класса WebDriver:
driver = webdriver.Chrome()
Затем открыть нужный сайт:
driver.get("https://slqa.ru/demo/dt/")
Задание-1: необходимые команды
Затем выполнить проверку того, что заголовок страницы соответствует строке "Current Time":
assert "Current Time" in driver.title
В заключении завершить работу с драйвером браузера:
driver.quit()
test_01_check_title, задания
Вот полный код теста:
from selenium import webdriver
def test_01_check_title():
driver = webdriver.Chrome()
driver.get("https://slqa.ru/demo/dt/")
assert "Current Time" in driver.title
driver.quit()
Задание-1: в этом автотесте есть несколько недостатков. Найдите их.
Задание-2: попробуйте исправить эти недостатки.
Недостаток-1: проверка вхождения
Недостаток-1 заключается в том, что в автотесте осуществляется проверка вхождения строки "Current Time" в текст заголовка driver.title, а не точное сравнение:
assert "Current Time" in driver.title
Вместо этого надо написать:
assert "Current Time" == driver.title
Для проверки запустите автотест на страницах https://slqa.ru/demo/dt/ и https://slqa.ru/demo/dt/dt_v02.php. Вторая страница не соответствует требованиям.
На следующем слайде - код исправленного автотеста.
Я добавил time.sleep(10) в демонстративных целях, чтобы страница сразу же не закрывалась. В реальных автотестах не надо такую команду добавлять.
Недостаток-1: проверка вхождения
import time
from selenium import webdriver
def test_01_check_title():
driver = webdriver.Chrome()
driver.get("https://slqa.ru/demo/dt/")
assert "Current Time" == driver.title
time.sleep(10)
driver.quit()
Недостаток-2: не отлавливаем ошибки
Когда мы выполняем тест со страницей https://slqa.ru/demo/dt/dt_v02.php, то мы можем наглядно убедиться, что все команды после появления ошибки не выполняются (time.sleep не работает). Для того, чтобы команды гарантированно выполнялись, можно использовать конструкцию:
try:
# Тут код, в котором может возникнуть ошибка
finally:
# Тут код, который гарантированно выполнится
Недостаток-2: не отлавливаем ошибки
import time
from selenium import webdriver
def test_01_check_title():
driver = webdriver.Chrome()
try:
driver.get("https://slqa.ru/demo/dt/dt_v02.php")
assert "Current Time" == driver.title
finally:
time.sleep(10)
driver.quit()
Недостаток-3: нет проверки текста
Задание не доделано. Не выполнено следующая проверка текста на странице:
на странице есть фразы "время по Гринвичу" и "время по Москве"
1. Находим элемент body (вся страница целиком):
element = driver.find_element(By.TAG_NAME, "body")
2. Получаем текст этого элемента (весь текст страницы):
page_text = element.text
3. Проверяем, что в тексте страницы есть нужное:
assert "время по Гринвичу" in page_text
Недостаток-3: нет проверки текста
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_02_check_all():
driver = webdriver.Chrome()
try:
driver.get("https://slqa.ru/demo/dt/")
element = driver.find_element(By.TAG_NAME, "body")
page_text = element.text
assert "Current Time" == driver.title
assert "время по Гринвичу" in page_text
assert "время по Москве" in page_text
finally:
time.sleep(10)
driver.quit()
Недостаток-4: автотест падает при 1 ошибке
Если на странице есть несколько проверок и первая из них проваливается, то тест останавливает свою работу и не выполняет следующие проверки.
Варианты исправления:
Вариант-1: оставить тест-кейс как есть, но заменить assert-ы на "мягкие проверки". Сейчас мы не будем рассматривать этот вариант - у нас будет одно из занятий посвящено различным типам проверок.
Вариант-2: делать "атомарные" проверки, т.е. такие, которые соответствуют правилу "один тест-кейс - одна проверка".
Задание 2 (*). Подсказка
Если кто-то пытался сделать задание 2 (со звёздочкой), то вот подсказка, как его сделать. Если будете делать и не получится - напишите в чате.
from datetime import datetime, timedelta
from time import gmtime, strftime
def test_time_example():
gmt_time = gmtime()
gmt_time_str = strftime("%Y-%m-%d, %H:%M:%S", gmt_time)
print("\nВремя по Гринвичу:", gmt_time_str)
# Преобразуем в московское время: UTC + 3 часа
moscow_time = datetime.strptime(gmt_time_str, "%Y-%m-%d, %H:%M:%S") + timedelta(hours=3)
moscow_time_str = moscow_time.strftime("%Y-%m-%d, %H:%M:%S")
print("Московское время:", moscow_time_str)
Дополнительные правила по ДЗ
Это больше всего поможет подготовиться к следующему занятию, т.к. мы начём занятия с разбора этого ДЗ.
Повторение предыдущих правил.
Мы же с вами уже практически коллеги, а в большинстве IT-компаний принято ко всем, даже к генеральному директору, обращаться на "ты".
На каждом занятии я буду предполагать, что вы попрактиковались в темах, рассмотренных на предыдущем занятии. Без выполнения д.з. вам будет сразу же трудно на следующем же занятии, а через несколько занятий вы серьёзно отстанете.
Иначе вы рискуете вообще не понять следующее занятие. В конце курса это будет не так серьёзно - темы станут более независимые, но первые несколько занятий идут строго последовательно.
Класс WebDriver
Класс WebDriver в библиотеке Selenium на языке Python — это основной класс, используемый для взаимодействия с браузером. Он предоставляет методы и атрибуты для управления окном браузера, открытия страниц, поиска элементов, выполнения действий и т.д.
Создание:
from selenium import webdriver
driver = webdriver.Chrome()
или
driver = webdriver.Firefox()
Рассказать подробней
Класс WebDriver
Поля:
.title — возвращает заголовок текущей страницы.
.current_url — возвращает текущий URL (т.е. адрес).
.page_source — возвращает HTML-код текущей страницы.
Методы:
.get(url) — открывает указанную веб-страницу.
.quit() — закрывает все окна браузера и завершает сеанс.
.find_element(by, value) — находит первый элемент по заданному локатору (например, ID, CSS-селектор, XPath).
Класс WebElement
Класс WebElement в библиотеке Selenium (Python) представляет собой объект, соответствующий элементу на веб-странице.
После того как вы нашли элемент с помощью метода .find_element(), вы получаете объект типа WebElement, с которым можно взаимодействовать.
Создание:
element = driver.find_element(By.TAG_NAME, "h1")
Класс WebElement
Поля:
Методы:
Алгоритм работы
Задания
Материалы академии
https://top-academy.site/тпо_at-урок-7-введение-в-selenium-и-основы-pytest/ - ТПО_AT Урок 9. Практика: от тест-кейса к авто-тесту
Домашнее задание
Вопросы и комментарии
AT-Python-09-ДЗ
Задание-1: Автоматизируйте такой тест-кейс:
Ожидаемый результат: Заголовок (title) страницы равен "Рублёвый перевод: расчёт комиссии"
Ожидаемый результат: Комиссия равна 10
Обратите внимание, что на этой странице для значения комиссии есть специальный элемент.
Задание-2 (*): Прочитайте материалы академии: https://top-academy.site/тпо_at-урок-7-введение-в-selenium-и-основы-pytest/ - ТПО_AT Урок 9. Практика: от тест-кейса к авто-тесту
Задание-3 (*): Напишите ручные тест-кейсы для страницы "Рублёвый перевод: расчёт комиссии". В любом формате: от простого текста (как в задании-1), до проекта в TestIT; также можно в Google.таблицах или Google.документах.
Задание-4 (*): Адаптируйте эти ручные тест-кейсы для автоматизации (см. материалы академии в задании-2).
Задание-5 (*): Напишите по этим тест-кейсам автотесты.