привел к более каноничной структуре

This commit is contained in:
Oleja123 2025-03-05 17:43:46 +04:00
parent 18bfc4a26a
commit 26a326ba75
10 changed files with 361 additions and 273 deletions

View File

@ -1,58 +0,0 @@
import pytest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from my_constants import EMAIL, PASSWORD
@pytest.mark.order(1)
@pytest.fixture()
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://luna73.ru/')
time.sleep(2)
yield driver
driver.close()
@pytest.mark.order(2)
@pytest.fixture()
def login(driver):
login_button = driver.find_element(By.CLASS_NAME, 'widget-overlay')
driver.execute_script("arguments[0].scrollIntoView(true);", login_button)
login_button.click()
time.sleep(3)
the_iframe = driver.find_element(By.ID, "kw-iframe")
driver.switch_to.frame(the_iframe)
email_field = driver.find_element(By.NAME, 'email')
password_field = driver.find_element(By.NAME, 'password')
email_field.send_keys(EMAIL)
password_field.send_keys(PASSWORD)
enter_button = driver.find_element(By.CLASS_NAME, 'login-form__button')
enter_button.click()
time.sleep(2)
close_button = driver.find_element(By.CLASS_NAME, 'popup-close-icon')
close_button.click()
time.sleep(2)
driver.switch_to.default_content()
yield driver
@pytest.mark.order(3)
@pytest.fixture()
def open_profile(login):
profile_icon_main = login.find_element(
By.XPATH, "//*[@id='root']/div/div/nav/div/div[1]/div")
login.execute_script(
"arguments[0].scrollIntoView(true);", profile_icon_main)
profile_icon_main.click()
time.sleep(2)
the_iframe_window = login.find_element(By.ID, "kw-iframe")
login.switch_to.frame(the_iframe_window)
login.find_element(By.CLASS_NAME, 'button-back').click()
profile_icon_window = login.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div[1]/button[1]/img")
profile_icon_window.click()
time.sleep(2)
yield login

24
conftest.py Normal file
View File

@ -0,0 +1,24 @@
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.homepage import HomePage
import time
@pytest.mark.order(1)
@pytest.fixture()
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
time.sleep(2)
yield driver
driver.close()
@pytest.mark.order(2)
@pytest.fixture()
def login(driver):
home_page = HomePage(driver)
home_page.open()
home_page.login()
yield home_page

0
pages/box_office.py Normal file
View File

187
pages/homepage.py Normal file
View File

@ -0,0 +1,187 @@
import time
from selenium.webdriver.common.by import By
from my_constants import EMAIL, PASSWORD
class HomePage:
def __init__(self, driver):
self.__driver = driver
def open(self):
self.__driver.get('https://luna73.ru/')
time.sleep(2)
self.__header = self.__driver.find_elements(
By.CLASS_NAME, 'menu__item')
def get_header(self):
return self.__header
def __click_feedback(self):
feedback_button = self.__driver.find_element(
By.XPATH, "//*[@id='root']/div/div/nav/div/div[2]/button")
self.__driver.execute_script(
"arguments[0].scrollIntoView(true);", feedback_button)
feedback_button.click()
time.sleep(2)
def send_non_empty_feedback(self):
self.__click_feedback()
textarea = self.__driver.find_element(By.CLASS_NAME, 'textarea')
textarea.send_keys('a')
send_button = self.__driver.find_element(
By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div/div[3]/button')
send_button.click()
time.sleep(2)
def login(self):
login_button = self.__driver.find_element(
By.CLASS_NAME, 'widget-overlay')
self.__driver.execute_script(
"arguments[0].scrollIntoView(true);", login_button)
login_button.click()
time.sleep(3)
the_iframe = self.__driver.find_element(By.ID, "kw-iframe")
self.__driver.switch_to.frame(the_iframe)
email_field = self.__driver.find_element(By.NAME, 'email')
password_field = self.__driver.find_element(By.NAME, 'password')
email_field.send_keys(EMAIL)
password_field.send_keys(PASSWORD)
enter_button = self.__driver.find_element(
By.CLASS_NAME, 'login-form__button')
enter_button.click()
time.sleep(2)
close_button = self.__driver.find_element(
By.CLASS_NAME, 'popup-close-icon')
close_button.click()
time.sleep(2)
self.__driver.switch_to.default_content()
self.__logged = True
def get_driver(self):
return self.__driver
def open_box_office(self):
if not self.__logged:
self.login()
profile_icon_main = self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div/nav/div/div[1]/div")
self.get_driver().execute_script(
"arguments[0].scrollIntoView(true);", profile_icon_main)
profile_icon_main.click()
time.sleep(2)
the_iframe_window = self.get_driver().find_element(By.ID, "kw-iframe")
self.get_driver().switch_to.frame(the_iframe_window)
self.click_back()
time.sleep(2)
def click_profile(self):
profile_icon_window = self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div[1]/button[1]/img")
profile_icon_window.click()
time.sleep(2)
def get_profile_items_len(self):
self.open_box_office()
self.click_profile()
menu = [i.text for i in self.get_driver().find_elements(
By.CLASS_NAME, 'account-menu__item')]
menu.pop()
self.click_profile()
return len(menu)
def click_back(self):
self.get_driver().find_element(
By.XPATH, "//div[@class='button-back']/*/*").click()
time.sleep(2)
def get_current_profile_page(self):
return self.get_driver().find_element(
By.CLASS_NAME, 'overlay-header__info-text').get_attribute("textContent")
def get_profile_item(self, ind):
return self.get_driver().find_element(
By.XPATH, f"/html/body/div[2]/nav/a[{ind}]")
def set_default(self):
self.get_driver().switch_to.default_content()
def get_profile_fields(self):
return self.get_driver().find_elements(By.XPATH, "//*[@class='profile-form__field']//input")[:-1]
def check_profile_error(self, ind):
return not self.get_driver().find_element(
By.XPATH, f"//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/div[{ind + 1}]/div[3]").is_displayed()
def click_change_email(self):
self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/a[1]").click()
time.sleep(1)
def send_wrong_email(self):
self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[3]/div[2]/input").send_keys('a')
def check_email_error(self):
return not self.get_driver().find_element(
By.XPATH, f"//div[@class='input__error']").is_displayed()
def change_password_click(self):
change_password = self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/a[2]")
self.get_driver().execute_script(
"arguments[0].scrollIntoView(true);", change_password)
change_password.click()
time.sleep(1)
def get_password_fields(self):
return [self.get_driver().find_element(By.NAME, 'old_password'),
self.get_driver().find_element(By.NAME, 'password'),
self.get_driver().find_element(By.NAME, 'repeat_password')]
def check_old_new_password_error(self):
return not self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[3]/div[2]/div[2]").is_displayed()
def check_wrong_repeat_password_error(self):
return not self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[4]/div[2]/div[2]").is_displayed()
def check_wrong_old_password_error(self):
return not self.get_driver().find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[2]/div[2]/div[2]").is_displayed()
def check_warnings_error(self):
return not len(self.get_driver().find_elements(
By.XPATH, "//div[@class='input__error']")) == 1
def click_change_password(self):
self.get_driver().find_element(By.CLASS_NAME, 'login-form__button').click()
time.sleep(1)
def open_session(self):
self.get_driver().find_element(By.XPATH, "//*[@id='root']/div/div/div/div[2]/div/a[1]/div[2]/div[2]/div/div[1]").click()
time.sleep(3)
the_iframe = self.get_driver().find_element(By.ID, "kw-iframe")
self.get_driver().switch_to.frame(the_iframe)
def open_film(self):
film_name = self.get_driver().find_element(By.CLASS_NAME, 'hall-schema-popup__title').text
self.get_driver().find_element(By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div/canvas").click()
time.sleep(1)
return film_name
def click_buy(self):
self.get_driver().find_element(By.XPATH, "//button[@type='button']").click()
time.sleep(2)
def click_continue(self):
self.get_driver().find_element(By.XPATH, "//button[text()='Продолжить']").click()
time.sleep(2)
def make_payment(self):
self.get_driver().find_element(By.XPATH, "//span[text()='Оплатить через СБП']").click()
time.sleep(2)
def check_payment_shows(self):
return self.get_driver().find_element(By.XPATH, "//*[text()='Отсканируйте и оплатите в приложении банка.']").is_displayed()

View File

@ -0,0 +1,27 @@
from selenium.webdriver.common.by import By
from pages.homepage import HomePage
import time
def test_header_len(driver):
home_page = HomePage(driver)
home_page.open()
assert len(home_page.get_header()) > 0
def test_header_navigation(driver):
home_page = HomePage(driver)
home_page.open()
header = home_page.get_header()
for menu_item in header:
driver.execute_script("arguments[0].scrollIntoView(true);", menu_item)
menu_item.click()
assert menu_item.is_enabled()
def test_feedback(login):
home_page = login
home_page.send_non_empty_feedback()
success_img = home_page.get_driver().find_element(
By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div/div[2]/div/img')
assert success_img is not None

111
test/test_profile_module.py Normal file
View File

@ -0,0 +1,111 @@
from selenium.webdriver.common.by import By
from my_constants import EMAIL, PASSWORD
import time
def password_step(home_page):
home_page.change_password_click()
time.sleep(1)
def password_back_step(home_page):
home_page.click_back()
time.sleep(1)
def old_new_password(home_page):
old_password, password, repeat_password = home_page.get_password_fields()
old_password.send_keys(PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert not home_page.check_old_new_password_error()
time.sleep(1)
def wrong_repeat_password(home_page):
old_password, password, repeat_password = home_page.get_password_fields()
old_password.send_keys(2 * PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD)
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert not home_page.check_wrong_repeat_password_error()
time.sleep(1)
def wrong_old_password(home_page):
old_password, password, repeat_password = home_page.get_password_fields()
old_password.send_keys(2 * PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'a')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'a')
time.sleep(1)
home_page.click_change_password()
assert not home_page.check_wrong_old_password_error()
time.sleep(1)
def check_warnings(home_page):
old_password, password, repeat_password = home_page.get_password_fields()
old_password.send_keys(PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert not home_page.check_warnings_error()
time.sleep(1)
def test_navigation(login):
home_page = login
len_menu = home_page.get_profile_items_len()
for ind in range(len_menu):
home_page.click_profile()
element = home_page.get_profile_item(ind + 1)
to_check1 = element.text
element.click()
time.sleep(2)
to_check2 = home_page.get_current_profile_page()
assert to_check1 == to_check2
home_page.click_back()
time.sleep(2)
home_page.set_default()
def test_profile_changes(login):
home_page = login
home_page.open_box_office()
home_page.click_profile()
home_page.get_profile_item(2).click()
time.sleep(2)
fields = home_page.get_profile_fields()
for i in range(len(fields)):
fields[i].clear()
fields[i].send_keys('a')
time.sleep(1)
assert home_page.check_profile_error(i) == False
home_page.click_change_email()
time.sleep(1)
home_page.send_wrong_email()
assert not home_page.check_email_error()
home_page.click_back()
time.sleep(1)
password_step(home_page)
old_new_password(home_page)
password_back_step(home_page)
password_step(home_page)
wrong_repeat_password(home_page)
password_back_step(home_page)
password_step(home_page)
wrong_old_password(home_page)
password_back_step(home_page)
password_step(home_page)
check_warnings(home_page)
password_back_step(home_page)
time.sleep(2)

12
test/test_reservation.py Normal file
View File

@ -0,0 +1,12 @@
from selenium.webdriver.common.by import By
import time
def test_reservation(login):
home_page = login
home_page.open_session()
film_name = home_page.open_film()
home_page.click_buy()
home_page.click_continue()
home_page.make_payment()
assert home_page.check_payment_shows() == True

View File

@ -1,37 +0,0 @@
from common_fixtures import driver, login
from selenium.webdriver.common.by import By
import time
def test_header_len(driver):
header = driver.find_elements(By.CLASS_NAME, 'menu__item')
assert len(header) > 0
def test_header_navigation(driver):
header = driver.find_elements(By.CLASS_NAME, 'menu__item')
is_error = False
for menu_item in header:
driver.execute_script("arguments[0].scrollIntoView(true);", menu_item)
menu_item.click()
if not menu_item.is_enabled():
is_error = True
break
assert is_error == False
def test_feedback(login):
feedback_button = login.find_element(
By.XPATH, "//*[@id='root']/div/div/nav/div/div[2]/button")
login.execute_script("arguments[0].scrollIntoView(true);", feedback_button)
feedback_button.click()
time.sleep(2)
textarea = login.find_element(By.CLASS_NAME, 'textarea')
textarea.send_keys('a')
send_button = login.find_element(
By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div/div[3]/button')
send_button.click()
time.sleep(2)
success_img = login.find_element(
By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div/div[2]/div/img')
assert success_img is not None

View File

@ -1,157 +0,0 @@
from common_fixtures import driver, login, open_profile
from selenium.webdriver.common.by import By
from my_constants import EMAIL, PASSWORD
import time
def switcher(driver, ind):
driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div[1]/button[1]/img").click()
element = driver.find_element(
By.XPATH, f"/html/body/div[2]/nav/a[{ind}]")
to_check1 = element.text
element.click()
time.sleep(2)
to_check2 = driver.find_element(
By.CLASS_NAME, 'overlay-header__info-text').get_attribute("textContent")
res = (to_check1 == to_check2)
driver.find_element(
By.CSS_SELECTOR, '#root > div > div.app-page > div.auth-popup > div > div.overlay-order.overlay-sidebar-enter-done > div.overlay-header > button.popup-close-icon > svg > path').click()
time.sleep(2)
return res
def get_password_fields(driver):
return [driver.find_element(By.NAME, 'old_password'),
driver.find_element(By.NAME, 'password'),
driver.find_element(By.NAME, 'repeat_password')]
def password_step(driver):
change_password = driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/a[2]")
driver.execute_script(
"arguments[0].scrollIntoView(true);", change_password)
change_password.click()
time.sleep(1)
def password_back_step(driver):
driver.find_element(
By.CSS_SELECTOR, '#root > div > div.app-page > div.auth-popup > div > div.overlay-order.overlay-sidebar-enter-done > div.overlay-header > div.button-back > svg').click()
time.sleep(1)
def old_new_password(driver):
old_password, password, repeat_password = get_password_fields(driver)
old_password.send_keys(PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[3]/div[2]/div[2]").is_displayed()
time.sleep(1)
def wrong_repeat_password(driver):
old_password, password, repeat_password = get_password_fields(driver)
old_password.send_keys(2 * PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD)
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[4]/div[2]/div[2]").is_displayed()
time.sleep(1)
def wrong_old_password(driver):
old_password, password, repeat_password = get_password_fields(driver)
old_password.send_keys(2 * PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'a')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'a')
time.sleep(1)
driver.find_element(By.CLASS_NAME, 'login-form__button').click()
time.sleep(1)
assert driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[2]/div[2]/div[2]").is_displayed()
time.sleep(1)
def check_warnings(driver):
old_password, password, repeat_password = get_password_fields(driver)
old_password.send_keys(PASSWORD)
time.sleep(1)
password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
repeat_password.send_keys(2 * PASSWORD + 'а')
time.sleep(1)
assert len(driver.find_elements(
By.XPATH, "//div[@class='input__error']")) == 1
time.sleep(1)
def test_navigation(open_profile):
login = open_profile
profile_icon_window = login.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div[1]/button[1]/img")
login = open_profile
menu_len = len(login.find_elements(By.CLASS_NAME, 'account-menu__item'))
profile_icon_window.click()
time.sleep(2)
res = True
for ind in range(menu_len - 1):
res = res and switcher(
login, ind + 1)
time.sleep(2)
login.switch_to.default_content()
assert res == True
def test_profile_changes(open_profile):
driver = open_profile
profile_icon_window = driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div[1]/button[1]/img")
time.sleep(2)
driver.find_element(By.XPATH, "/html/body/div[2]/nav/a[2]").click()
time.sleep(1)
fields = []
fields.append(driver.find_element(By.NAME, "first_name"))
fields.append(driver.find_element(By.NAME, "last_name"))
fields.append(driver.find_element(By.NAME, "middle_name"))
fields.append(driver.find_element(By.NAME, 'birthdate'))
fields.append(driver.find_element(By.NAME, 'phone'))
time.sleep(1)
for i in range(len(fields)):
fields[i].clear()
fields[i].send_keys('a')
assert driver.find_element(
By.XPATH, f"//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/div[{i + 1}]/div[3]").is_displayed()
driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/div/form/a[1]").click()
time.sleep(1)
driver.find_element(
By.XPATH, "//*[@id='root']/div/div[1]/div[2]/div/div[2]/div[2]/div/form/div[3]/div[2]/input").send_keys('a')
assert driver.find_element(By.CLASS_NAME, 'disabled').is_enabled()
driver.find_element(
By.CSS_SELECTOR, '#root > div > div.app-page > div.auth-popup > div > div.overlay-order.overlay-sidebar-enter-done > div.overlay-header > div.button-back > svg').click()
time.sleep(1)
password_step(driver)
old_new_password(driver)
password_back_step(driver)
password_step(driver)
wrong_repeat_password(driver)
password_back_step(driver)
password_step(driver)
wrong_old_password(driver)
password_back_step(driver)
password_step(driver)
check_warnings(driver)
password_back_step(driver)
time.sleep(2)

View File

@ -1,21 +0,0 @@
from common_fixtures import login, driver
from selenium.webdriver.common.by import By
import time
def test_reservation(login):
driver = login
driver.find_element(By.XPATH, "//*[@id='root']/div/div/div/div[2]/div/a[1]/div[2]/div[2]/div/div[1]").click()
time.sleep(3)
the_iframe = driver.find_element(By.ID, "kw-iframe")
driver.switch_to.frame(the_iframe)
film_name = driver.find_element(By.CLASS_NAME, 'hall-schema-popup__title').text
driver.find_element(By.XPATH, "//*[@id='root']/div/div[1]/div[1]/div/div/div[4]/div[2]/div/div/canvas").click()
time.sleep(1)
driver.find_element(By.XPATH, "//button[@type='button']").click()
time.sleep(1)
driver.find_element(By.XPATH, "//button[text()='Продолжить']").click()
time.sleep(2)
driver.find_element(By.XPATH, "//span[text()='Оплатить через СБП']").click()
time.sleep(2)
assert driver.find_element(By.XPATH, "//*[text()='Отсканируйте и оплатите в приложении банка.']").is_displayed()