Не понимаю, как прикрутить PyTest

Сам код работает, однако не понимаю, как это возможно реализовать с Pytest, буду благодарен за любую подсказку

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Chrome()
browser.implicitly_wait(5)


login_link = 'http://example-site.com/auth'
browser.get(login_link)

xpath_login = '/html/body/div/div/main/div/div/div/div[2]/form/div[1]/div/div[1]/div[1]/input'
xpath_password = '/html/body/div/div/main/div/div/div/div[2]/form/div[2]/div/div[1]/div[1]/input'
button = '/html/body/div/div/main/div/div/div/div[3]/button/span'

browser.find_element_by_xpath(xpath_login).send_keys('user')
browser.find_element_by_xpath(xpath_password).send_keys('password')
browser.find_element_by_xpath(button).click()

time.sleep(2)
correct_link = 'example-site.com/'
testing_link = browser.current_url
assert correct_link == testing_link, "Incorrect login"

Ответы (1 шт):

Автор решения: insolor

Для начала просто нужно обернуть тестирующий код в тестовую функцию (название функции должно начинаться с test, чтобы pytest понимал, что эту функцию нужно запускать как тест):

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait


def test():
    browser = webdriver.Chrome()
    browser.implicitly_wait(5)

    login_link = 'http://example-site.com/auth'
    browser.get(login_link)

    xpath_login = '/html/body/div/div/main/div/div/div/div[2]/form/div[1]/div/div[1]/div[1]/input'
    xpath_password = '/html/body/div/div/main/div/div/div/div[2]/form/div[2]/div/div[1]/div[1]/input'
    button = '/html/body/div/div/main/div/div/div/div[3]/button/span'

    browser.find_element_by_xpath(xpath_login).send_keys('user')
    browser.find_element_by_xpath(xpath_password).send_keys('password')
    browser.find_element_by_xpath(button).click()

    time.sleep(2)
    correct_link = 'example-site.com/'
    testing_link = browser.current_url
    assert correct_link == testing_link, "Incorrect login"

Название файла также желательно чтобы начиналось с test, тогда при запуске pytest из командной строки в директории с этим файлом сразу запустятся все тесты из этого файла. Ну или запускать файл тестов как pytest имя_файла.py.

Если тестов несколько, то желательно вынести инициализацию в фикстуру, пример:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

import pytest


# Браузер будет инициализироваться только один раз для всех тестов в данном модуле
@pytest.fixture(scope="module")
def browser():
    browser = webdriver.Chrome()
    browser.implicitly_wait(5)
    return browser


# browser тут показывает, что тест зависит от фикстуры browser (которая объявлена выше)
def test(browser):
    login_link = 'http://example-site.com/auth'
    browser.get(login_link)

    xpath_login = '/html/body/div/div/main/div/div/div/div[2]/form/div[1]/div/div[1]/div[1]/input'
    xpath_password = '/html/body/div/div/main/div/div/div/div[2]/form/div[2]/div/div[1]/div[1]/input'
    button = '/html/body/div/div/main/div/div/div/div[3]/button/span'

    browser.find_element_by_xpath(xpath_login).send_keys('user')
    browser.find_element_by_xpath(xpath_password).send_keys('password')
    browser.find_element_by_xpath(button).click()

    time.sleep(2)
    correct_link = 'example-site.com/'
    testing_link = browser.current_url
    assert correct_link == testing_link, "Incorrect login"

Дальше, тест можно сделать параметризованным, например, чтобы проверить вход на нескольких сайтах с разными именами пользователя и паролями:

@pytest.mark.parametrize("login_link, user, password, correct_link", [
    ('http://example-site.com/auth', 'user', 'password', 'example-site.com/'),
    ('http://example-site2.com/auth', 'user1', 'passwordd', 'example-site2.com/'),
])
def test(browser, login_link, user, password, correct_link):
    browser.get(login_link)

    xpath_login = '/html/body/div/div/main/div/div/div/div[2]/form/div[1]/div/div[1]/div[1]/input'
    xpath_password = '/html/body/div/div/main/div/div/div/div[2]/form/div[2]/div/div[1]/div[1]/input'
    button = '/html/body/div/div/main/div/div/div/div[3]/button/span'

    browser.find_element_by_xpath(xpath_login).send_keys(user)
    browser.find_element_by_xpath(xpath_password).send_keys(password)
    browser.find_element_by_xpath(button).click()

    time.sleep(2)
    testing_link = browser.current_url
    assert correct_link == testing_link, "Incorrect login"

Ну и так далее, постепенно можно расширять функциональность вашего теста.

→ Ссылка