Python test web application

Python test web application

<i data-lazy-src=

Напишем первый тест, чтобы проверить работоспособность драйвера.

<i data-lazy-src=

В качестве примера ресурса для тестирования возьмем популярный сайт для практики автоматизированного тестирования: https://www.saucedemo.com.

<i data-lazy-src=

3. Поиск элементов

В нашем скрипте присутствует следующая строка:

<i data-lazy-src=

  • Тут мы просто сравниваем текст найденного элемента с ожидаемым значением и выводим в консоль сообщение.

4. Первый тест с поиском и переходом по странице

Рис 11. Результат выполнения теста.

  • Введем логин и пароль пользователя и зайдем на главную страницу.
  • Найдем позицию с названием «Sauce Labs Fleece Jacket».
  • Перейдем на страницу товара и нажмем кнопку добавления в корзину.
  • Перейдем в корзину и проверим что там присутствует 1 позиция с названием «Sauce Labs Fleece Jacket».

7. Распределим логику

Теперь причешем код, распределив логику по методам, как, например, было с wait_of_element_located . Разбивать логику необходимо для написания множества тестов.

import pytest from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver from selenium.webdriver.common.keys import Keys # Функция ожидания элементов def wait_of_element_located(xpath, driver_init): element = WebDriverWait(driver_init, 10).until( EC.presence_of_element_located( (By.XPATH, xpath) ) ) return element # Вынесем инициализцию драйвера в отдельную фикстуру pytest @pytest.fixture def driver_init(): options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-logging"]) driver = webdriver.Chrome(options=options, executable_path=r'C:/Users/…/…/chromedriver.exe') driver.get("https://www.saucedemo.com/") yield driver driver.close() # Вынесем аутентификацию юзера в отдельную функцию def auth_user(user_name, password, driver_init): # Поиск и ожидание элементов и присваивание к переменным. input_username = wait_of_element_located(xpath='//*[@id=\"user-name\"]', driver_init=driver_init) input_password = wait_of_element_located(xpath='//*[@id=\"password\"]', driver_init=driver_init) login_button = wait_of_element_located(xpath='//*[@id=\"login-button\"]', driver_init=driver_init) # Действия с формами input_username.send_keys(user_name) input_password.send_keys(password) login_button.send_keys(Keys.RETURN) def add_item_to_cart(xpath_item, driver_init): # Поиск и ождиание прогрузки ссылки элемента товара магазина и клик по ссылке item_name = wait_of_element_located( xpath=xpath_item, driver_init=driver_init) item_name.click() # Поиск и ожидание кнопки добавления товара и клик по этой кнопке item_add_button = wait_of_element_located( xpath='//*[@id=\"add-to-cart-sauce-labs-fleece-jacket\"]', driver_init=driver_init) item_add_button.click() # Ждем пока товар добавится в корзину, появится span(кол-во позиций в корзине) # Возвращаем True или False в зависимости добавлися товар или нет shop_cart_with_item = wait_of_element_located( xpath='//*[@id=\"shopping_cart_container\"]/a/span', driver_init=driver_init) return shop_cart_with_item def test_add_jacket_to_the_shopcart(driver_init): # Аутентификация пользователя auth_user("standard_user", "secret_sauce", driver_init=driver_init) # Добавление товара в корзину и если товар добавлен переход в корзину add_item_to_cart(xpath_item='//*[@id=\"item_5_title_link\"]/div', driver_init=driver_init).click() # Поиск корзины и клик wait_of_element_located(xpath='//*[@id=\"shopping_cart_container\"]/a', driver_init=driver_init).click() # Поиск ссылки элемента позиции магазина item_name = wait_of_element_located(xpath='//*[@id=\"item_5_title_link\"]/div', driver_init=driver_init) # Поиск описания товара item_description = wait_of_element_located(xpath='//*[@id=\"cart_contents_container\"]/div/div[1]/div[3]/div[2]/div[1]', driver_init=driver_init) assert item_name.text == "Sauce Labs Fleece Jacket" assert item_description.text == "It's not every day that you come across a midweight quarter-zip fleece jacket" \ " capable of handling everything from a relaxing day outdoors to a busy day at " \ "the office." if __name__ == '__main__': test_add_jacket_to_the_shopcart(driver_init=driver_init) 

В этом примере логика поделилась на функциональные компоненты (фикстуры). Теперь аутентификация пользователя будет происходить в отдельной функции, что позволит не производить одни и те же действия и дублировать код при каждом тесте, в котором нужно проходить аутентификацию. В качестве примера использования фикстур сделана инициализация драйвера, что позволит использовать инстанс драйвера во всех тестах, не пересоздавая его. Логика добавления товара в корзину тоже была вынесена в отдельный функциональный компонент для дальнейшего использования.

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

При желании можно и дальше проводить рефакторинг кода.

Рекомендации по архитектуре

  • Очевидно, что в одном файле хранить все вспомогательные функции и тесты неудобно. После добавления еще нескольких тестов даже с распределенной логикой скрипт будет похож на полотно с трудночитаемым кодом. К тому же если вы разрабатываете тесты с коллегами, без конфликтов в коде не обойтись. Для начала нужно разделить проект на модули: в одном будут находиться файлы с тестами, в другом частичная логика, в третьем – ресурсы, в четвертом – утилиты и т.д.
  • Далее следует переходить на разработку автотестов с использованием объектно-ориентированного программирования. Это сэкономит массу времени и поможет в написании сложного и лаконичного кода.
  • Стоит также обратить внимание на паттерны проектирования, особенно на PageObject и PageFactoroy. В эффективном тестировании UI они играют большую роль.
  • Все тестовые данные лучше хранить в неизменяемых классах, константах или в отдельных файлах (json, csv).

Заключение

На этом создание первого автотеста закончено. Некоторые моменты были рассмотрены поверхностно, что дает возможность пытливым умам поглотить информацию из других источников. Удачи!

Источник

Читайте также:  Питон программалау тілі слайд
Оцените статью