
Григорьева ЛР / ПИ8
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
Н.Н. Григорьева |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №8 |
ТЕСТИРОВАНИЕ НА ОСНОВЕ ПАТТЕРНА PAGE OBJECT |
по курсу: ПРОГРАММНАЯ ИНЖЕНЕРИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2024
Цель работы:
Получение практических навыков по тестированию веб-элементов на основе паттерна Page Object.
Для достижения поставленной цели требуется решить следующие задачи:
1. Изучить особенности тестирования с использованием паттерна Page Object.
2. Реализовать проект по автоматизированному тестированию поисковой
веб-системы по релевантности выполнения уникального запроса.
3. Реализовать индивидуальный проект по автоматизированному тестированию на учебном ресурсе с использованием модели Page Object.
3. Зафиксировать результаты тестирования в отчете.
Ход работы:
В Pycharm создан новый проект, настроено программное окружение (Рисунок 1).
Рисунок 1 – Файлы проекта
Разработан и выполнен тест на основе паттерна Page Object для проверки результатов поиска по запросу “spotify” (Рисунок 2, 3). Исходный код представлен в листингах 1 – 3.
Рисунок 2 – Запрос в DuckDuckGo
Рисунок 3 – Выполнение теста в IDE
Листинг 1 – search.py
# Импорт необходимх библиотек from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # Создание класса страницы поиска class DuckDuckGoSearchPage: # Переменные для страницы поиска и поля ввода URL = 'https://www.duckduckgo.com' SEARCH_INPUT = (By.ID, "searchbox_input") def __init__(self, browser): self.browser = browser # Функция для загрузки страницы поиска def load(self): self.browser.get(self.URL) # Функция для выполнения поиска def search(self, phrase): search_input = (self.browser.find_element(*self.SEARCH_INPUT)) search_input.send_keys(phrase + Keys.RETURN)
Листинг 2 – result.py
# Импорт необходимых библиотек from selenium.webdriver.common.by import By # Создание класса страницы с результатами поиска class DuckDuckGoResultPage: # Переменные для результатов поиска и формы поиска SEARCH_RESULTS = (By.CSS_SELECTOR, "li[data-layout='organic']") SEARCH_INPUT = (By.ID, 'search_form_input') # Метод для получения информации о методе поиска ссылок, содержащих пользовательский запрос @classmethod def PHRASE_RESULTS(cls, phrase): xpath = f"//li[@data-layout='organic']//a[contains(@href, '{phrase}')]" return (By.XPATH, xpath) # Конструктор класса def __init__(self, browser): self.browser = browser # Метод для подсчета результатов поиска def search_results_count(self): search_results = self.browser.find_elements(*self.SEARCH_RESULTS) return len(search_results) # Метод для подсчета результатов поиска содержащих фразу def phrase_result_count(self, phrase): phrase_results = self.browser.find_elements(*self.PHRASE_RESULTS(phrase)) return len(phrase_results) # Метод для нахождения значения поиска def search_input_value(self): search_input = self.browser.find_element(*self.SEARCH_INPUT) return search_input.get_attribute('value')
Листинг 3 – autotest.py
# Импорт необходимых библиотек import pytest from pages.result import DuckDuckGoResultPage from pages.search import DuckDuckGoSearchPage from selenium.webdriver import Chrome # Создание экземпляра браузера @pytest.fixture def browser(): driver = Chrome() driver.implicitly_wait(10) yield driver driver.quit() # Функция выполнения тестового сценария def test_basic_duckduckgo_search(browser): # Фраза для поискового запроса PHRASE = 'spotify' # Выполнение поиска search_page = DuckDuckGoSearchPage(browser) search_page.load() search_page.search(PHRASE) # Проверка, что результаты появились result_page = DuckDuckGoResultPage(browser) assert result_page.search_results_count() > 0 assert result_page.phrase_result_count(PHRASE) > 0 assert result_page.search_input_value() == PHRASE
Согласно варианту 15 (Рисунок 4) разработан и выполнен тест наличия предметных карточек на веб-странице на основе паттерна Page Object. Код представлен в листингах 4 и 5.
Рисунок 4 – Распределение вариантов
Рисунок 5 – Выполнение теста в IDE
Рисунок 6 – Страница 15 варианта
Листинг 4 – nuts_web.py
from selenium.webdriver.common.by import By class NutsPage: URL = 'https://qa-test-selectors.netlify.app' VARIANT = 15 HEADING = "Миндаль" TITLE_TEXT = "Фисташки" def __init__(self, browser): self.browser = browser def load(self): self.browser.get(self.URL) def find_variant(self): # Выбор кнопки с 15 вариантом, как 14 элемента из списка всех кнопок страницы button = self.browser.find_elements(By.TAG_NAME, 'button')[self.VARIANT - 1] # Выбор кнопки с 15 вариантом, по XPATH button = self.browser.find_element(By.XPATH, f'//button[@class="variant__btn"][text()="{self.VARIANT}"]') # Выбор кнопки с 15 вариантом, по CSS-селектору button = self.browser.find_element(By.CSS_SELECTOR, f'.variant__btn:nth-child({self.VARIANT})') # Нажатие на кнопку с вариантом button.click() def hazelnut_css_elements_count(self): # Поиск элементов с CSS селектором #hazelnut hazelnut_css_elements = self.browser.find_elements(By.CSS_SELECTOR, '#hazelnut') return len(hazelnut_css_elements) def walnut_css_elements_count(self): # Поиск элементов с CSS селектором #walnut walnut_css_elements = self.browser.find_elements(By.CSS_SELECTOR, '#walnut') return len(walnut_css_elements) def phistachios_css_elements_count(self): # Поиск элементов с CSS селектором #phistachios phistachios_css_elements = self.browser.find_elements(By.CSS_SELECTOR, '#phistachios') return len(phistachios_css_elements) def nuts_elements_count(self): # Поиск элементов с data-type="nuts" nuts_elements = self.browser.find_elements(By.XPATH, '//*[@data-type="nuts"]') return len(nuts_elements) def cashew_elements_count(self): # Поиск элементов с id="birch" cashew_elements = self.browser.find_elements(By.ID, 'cashew') return len(cashew_elements) def hazelnut_elements_count(self): # Поиск элементов с class="hazelnut" hazelnut_elements = self.browser.find_elements(By.CLASS_NAME, 'hazelnutNut') return len(hazelnut_elements) def peanut_elements_count(self): # Поиск элементов с name="peanut-nut" peanut_elements = self.browser.find_elements(By.NAME, 'peanut-nut') return len(peanut_elements) def heading_images_count(self): # Поиск изображений с heading="Миндаль" heading_images = self.browser.find_elements(By.XPATH, f'//img[@heading="{self.HEADING}"]') return len(heading_images) def title_elements_count(self): # Поиск элементов с title="Фисташки" title_elements = self.browser.find_elements(By.XPATH, f'//h1[text()="{self.TITLE_TEXT}"]') return len(title_elements)
Листинг 5 – nuts_test_web.py
import pytest from pages.nuts_web import NutsPage from selenium.webdriver import Chrome # Реализация фикстуры @pytest.fixture def browser(): driver = Chrome() driver.implicitly_wait(30) yield driver driver.quit() # Функция по проверке осуществления перехода на страницу с вариантом def test_nuts_page(browser): nuts_page = NutsPage(browser) nuts_page.load() nuts_page.find_variant() # Реализация проверок с помощью PyTest assert nuts_page.hazelnut_css_elements_count() > 0 assert nuts_page.walnut_css_elements_count() > 0 assert nuts_page.phistachios_css_elements_count() > 0 assert nuts_page.nuts_elements_count() > 0 assert nuts_page.cashew_elements_count() > 0 assert nuts_page.hazelnut_elements_count() > 0 assert nuts_page.peanut_elements_count() > 0 assert nuts_page.heading_images_count() > 0 assert nuts_page.title_elements_count() > 0
Вывод:
В ходе выполнения лабораторной работы были освоены навыки тестирования на основе паттерна Page Object. Разработаны и успешно выполнены тест для проверки выполнения поискового запроса в DuckDuckGo и тест для проверки наличия шести предметных карточек на учебном ресурсе.
Список используемых источников:
Официальный портал проекта Selenium. URL: https://www.selenium.dev/ (дата обращения 12.05.2024).
Документация по Page Object URL: https://www.selenium.dev/documentation/test_practices/encouraged/page_objec t_models/ (дата обращения 12.05.2024).
Документация по Selenium Webdriver. URL: https://w3c.github.io/webdriver/ (дата обращения 12.05.2024).