From 26a326ba758d5db7a285587dbb95722c05dca87b Mon Sep 17 00:00:00 2001 From: Oleja123 Date: Wed, 5 Mar 2025 17:43:46 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=BB=20=D0=BA?= =?UTF-8?q?=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D0=BA=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common_fixtures.py | 58 ---------- conftest.py | 24 ++++ pages/box_office.py | 0 pages/homepage.py | 187 ++++++++++++++++++++++++++++++++ test/test_information_module.py | 27 +++++ test/test_profile_module.py | 111 +++++++++++++++++++ test/test_reservation.py | 12 ++ test_information_module.py | 37 ------- test_profile_module.py | 157 --------------------------- test_reservation.py | 21 ---- 10 files changed, 361 insertions(+), 273 deletions(-) delete mode 100644 common_fixtures.py create mode 100644 conftest.py create mode 100644 pages/box_office.py create mode 100644 pages/homepage.py create mode 100644 test/test_information_module.py create mode 100644 test/test_profile_module.py create mode 100644 test/test_reservation.py delete mode 100644 test_information_module.py delete mode 100644 test_profile_module.py delete mode 100644 test_reservation.py diff --git a/common_fixtures.py b/common_fixtures.py deleted file mode 100644 index 034b125..0000000 --- a/common_fixtures.py +++ /dev/null @@ -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 diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..b87225b --- /dev/null +++ b/conftest.py @@ -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 \ No newline at end of file diff --git a/pages/box_office.py b/pages/box_office.py new file mode 100644 index 0000000..e69de29 diff --git a/pages/homepage.py b/pages/homepage.py new file mode 100644 index 0000000..95011e6 --- /dev/null +++ b/pages/homepage.py @@ -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() \ No newline at end of file diff --git a/test/test_information_module.py b/test/test_information_module.py new file mode 100644 index 0000000..fd90bdb --- /dev/null +++ b/test/test_information_module.py @@ -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 diff --git a/test/test_profile_module.py b/test/test_profile_module.py new file mode 100644 index 0000000..2041e98 --- /dev/null +++ b/test/test_profile_module.py @@ -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) diff --git a/test/test_reservation.py b/test/test_reservation.py new file mode 100644 index 0000000..04fea30 --- /dev/null +++ b/test/test_reservation.py @@ -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 \ No newline at end of file diff --git a/test_information_module.py b/test_information_module.py deleted file mode 100644 index 46f9e7b..0000000 --- a/test_information_module.py +++ /dev/null @@ -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 diff --git a/test_profile_module.py b/test_profile_module.py deleted file mode 100644 index 2ba6fd6..0000000 --- a/test_profile_module.py +++ /dev/null @@ -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) diff --git a/test_reservation.py b/test_reservation.py deleted file mode 100644 index 3c9d420..0000000 --- a/test_reservation.py +++ /dev/null @@ -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() \ No newline at end of file