🏠 Домашнее задание
Разбор ДЗ из лекции. Summary session 3 — это занятие с разбором домашнего задания урока 05. Ниже представлено исходное задание и пошаговое решение с объяснением логики. Это не LMS-задание на сдачу, а учебный разбор.
⚡ Суть ДЗ
Написать автотест для https://itcareerhub.de/ru:
- Проверить видимость: логотип, ссылки навигации, кнопки языка (ru/de)
- Кликнуть по иконке телефона и проверить текст всплывающего блока
# test_itcareerhub.py
class TestITCareerHub:
@pytest.fixture(autouse=True)
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://itcareerhub.de/ru")
yield
self.driver.quit()
Задание из лекции (разбор ДЗ 3)
Часть 1: Проверка элементов на главной странице
Написать автотест на Python + pytest, который открывает https://itcareerhub.de/ru и проверяет, что отображаются:
- Логотип ITCareerHub
- Ссылка «Программы»
- Ссылка «Способы оплаты»
- Ссылка «Новости»
- Ссылка «О нас»
- Ссылка «Отзывы»
- Кнопки переключения языка (ru и de)
Часть 2: Клик по иконке телефона
- Кликнуть по иконке с телефонной трубкой
- Проверить, что текст «Если вы не дозвонились, заполните форму на сайте. Мы свяжемся с вами» отображается
Подготовка окружения
# PowerShell — создать проект и окружение
mkdir autoqa-homework
cd autoqa-homework
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install selenium pytest
Selenium 4 включает Selenium Manager, который сам найдёт и скачает нужный ChromeDriver. Устанавливать webdriver-manager отдельно не нужно.
Пошаговое решение
Шаг 1: Создать файл теста
# test_itcareerhub.py
Шаг 2: Импорты и фикстура
# test_itcareerhub.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestITCareerHub:
@pytest.fixture(scope="function", autouse=True)
def setup_and_teardown(self):
self.driver = webdriver.Chrome()
self.driver.get("https://itcareerhub.de/ru")
yield
self.driver.quit()
Логика: фикстура
autouse=True означает, что она применяется ко всем тестам класса автоматически — не нужно передавать в аргументы каждого теста.
Шаг 3: Тест проверки видимости элементов
# test_itcareerhub.py (продолжение)
def test_elements_displayed(self):
# Логотип: ищем картинку с alt="ITCareerHub"
assert self.driver.find_element(
By.CSS_SELECTOR, "img[alt='ITCareerHub']"
).is_displayed()
# Ссылки навигации — по точному тексту ссылки
assert self.driver.find_element(
By.LINK_TEXT, "Программы"
).is_displayed()
assert self.driver.find_element(
By.LINK_TEXT, "Способы оплаты"
).is_displayed()
assert self.driver.find_element(
By.LINK_TEXT, "Новости"
).is_displayed()
assert self.driver.find_element(
By.LINK_TEXT, "О нас"
).is_displayed()
assert self.driver.find_element(
By.LINK_TEXT, "Отзывы"
).is_displayed()
# Кнопки языка: ищем по атрибуту lang
assert self.driver.find_element(
By.CSS_SELECTOR, "button[lang='ru']"
).is_displayed()
assert self.driver.find_element(
By.CSS_SELECTOR, "button[lang='de']"
).is_displayed()
Логика локаторов:
- Логотип:
img[alt='...']— CSS-атрибут alt, уникален для картинки - Ссылки:
By.LINK_TEXT— поиск по точному тексту ссылки, надёжно для навигации - Кнопки языка:
button[lang='ru']— атрибут lang, стабильный селектор
Шаг 4: Тест клика по иконке телефона
# test_itcareerhub.py (продолжение)
def test_click_phone_icon_and_check_text(self):
# Находим иконку телефона по классу и кликаем
phone_icon = self.driver.find_element(
By.CSS_SELECTOR, ".phone-icon"
)
phone_icon.click()
# Проверяем, что текст появился в source страницы
assert "Если вы не дозвонились, заполните форму на сайте. Мы свяжемся с вами" \
in self.driver.page_source
Логика:
page_source возвращает весь HTML страницы. Это простой способ проверить, что текст присутствует — даже если элемент не полностью видим. Для точной проверки видимости лучше использовать find_element + is_displayed().
Полное решение
# test_itcareerhub.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestITCareerHub:
@pytest.fixture(scope="function", autouse=True)
def setup_and_teardown(self):
self.driver = webdriver.Chrome()
self.driver.get("https://itcareerhub.de/ru")
yield
self.driver.quit()
def test_elements_displayed(self):
assert self.driver.find_element(
By.CSS_SELECTOR, "img[alt='ITCareerHub']"
).is_displayed()
assert self.driver.find_element(By.LINK_TEXT, "Программы").is_displayed()
assert self.driver.find_element(By.LINK_TEXT, "Способы оплаты").is_displayed()
assert self.driver.find_element(By.LINK_TEXT, "Новости").is_displayed()
assert self.driver.find_element(By.LINK_TEXT, "О нас").is_displayed()
assert self.driver.find_element(By.LINK_TEXT, "Отзывы").is_displayed()
assert self.driver.find_element(
By.CSS_SELECTOR, "button[lang='ru']"
).is_displayed()
assert self.driver.find_element(
By.CSS_SELECTOR, "button[lang='de']"
).is_displayed()
def test_click_phone_icon_and_check_text(self):
phone_icon = self.driver.find_element(By.CSS_SELECTOR, ".phone-icon")
phone_icon.click()
assert (
"Если вы не дозвонились, заполните форму на сайте. Мы свяжемся с вами"
in self.driver.page_source
)
Запуск и проверка в VS Code
Запуск из терминала
# PowerShell — из папки проекта, с активированным venv
pytest test_itcareerhub.py -v
Запуск через F5 (launch.json)
# .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "pytest current file",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": ["${file}", "-v"],
"justMyCode": false
}
]
}
Ожидаемый результат
test_itcareerhub.py::TestITCareerHub::test_elements_displayed PASSED
test_itcareerhub.py::TestITCareerHub::test_click_phone_icon_and_check_text PASSED
2 passed in X.XXs
Связь с теорией и примерами
- CSS-селекторы —
img[alt=...],button[lang=...],.phone-icon - find_element() — поиск всех элементов в тесте
- is_displayed() — проверка видимости каждого элемента
- Урок 05: Локаторы — подробная теория