🏠 Домашнее задание

← К оглавлению урока

Разбор ДЗ из лекции. 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: Клик по иконке телефона

  1. Кликнуть по иконке с телефонной трубкой
  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

Связь с теорией и примерами