def good_state_pagination(self, driver, count, db_link, goods_on_page=40, e_msg=''): """ Проверка что товары только в статусе accepted, belived :param driver: :param count: :param goods_on_page: :param e_msg: :return: """ current_page = 1 all_pages = int(math.ceil(int(count) / (goods_on_page + 0.0))) remaining_pages = all_pages - current_page count_on_pages = 0 obj_s = '' while remaining_pages >= 0: str_ids = self.get_good_ids(driver) self.assertNotEqual(obj_s, str_ids, "Переход на след. страницу не произошел, товары совпадают") goods = db_link.warehouse.get_wares_by_id_and_moderation_state(str_ids, '1,2') next_page = current_page + 1 if remaining_pages != 0: self.assertEqual(goods_on_page, len(goods), e_msg) Navigate.element_click(driver, Navigate.click_search.PAG_PAGE % next_page) else: self.assertEqual(count-count_on_pages, len(goods), e_msg) count_on_pages += len(goods) obj_s = str_ids current_page += 1 remaining_pages -= 1 self.assertEqual(count, count_on_pages, e_msg)
def user_state_pagination(self, driver, count, db_link, users_on_page=40, e_msg=''): """ Проверка что пользователи только активные продавцы :param driver: :param count: :param goods_on_page: :param e_msg: :return: """ current_page = 1 all_pages = int(math.ceil(int(count) / (users_on_page + 0.0))) remaining_pages = all_pages - current_page count_on_pages = 0 obj_s = '' while remaining_pages >= 0: str_ids = self.get_user_ids(driver) self.assertNotEqual(obj_s, str_ids, "Переход на след. страницу не произошел, пользователи совпадают") users = db_link.accounting.get_users_by_id_and_permissions(str_ids, '2,6', '3,4,7,8') next_page = current_page + 1 if remaining_pages != 0: self.assertEqual(users_on_page, len(users), e_msg) Navigate.element_click(driver, Navigate.click_search.PAG_PAGE % next_page) else: self.assertEqual(count-count_on_pages, len(users), e_msg) count_on_pages += len(users) obj_s = str_ids current_page += 1 remaining_pages -= 1 self.assertEqual(count, count_on_pages, e_msg)
def test_authorization_by_phone_correct(self, type_password="******"): """ Title: Я могу войти в систему введя корректный телефон и пароль Description: Проверка: * Наличие профиля пользователя * Имя в профиле совпадает с именем пользователя * Аватар пользователя совпадает с аватаром пользователя * Номер телефона совпадает с номером телефона пользователя """ service_log.run(self) # Устанавливаем новый пароль для пользователя default_new_passwd = AccountingMethods.get_default_password() hash_res_new = generate_sha256(default_new_passwd, self.user["salt"]) databases.db1.accounting.update_user_password(self.user["id"], hash_res_new) # Переходим на страницу авторизации self.go_authorization_page(self.driver) # Проверка страница авторизации self.check_page_authorization(self.driver) obj_phone, obj_password, obj_submit_button = self.get_data_authorization(self.driver) changed_passwd = self.get_password(type_passwd=type_password, source_passwd=default_new_passwd) changed_phone = self.get_phone(type_phone=self.type_phone, source_phone=self.user["phone"]) # Вводим данные на авторизацию self.send_password(password_object=obj_password, password_number=changed_passwd) self.send_phone(phone_object=obj_phone, phone_number=changed_phone) # Нажатие на кнопку авторизации Navigate.element_click(self.driver, obj_submit_button, change_page_url=True) # Проверка виджета профиля self.user_profile_menu(self.driver, self.user)
def pagination(self, driver, count, section_xpath, items_in_page=40, e_msg=''): """ Проверка пагинации :param driver: :param count: :param section_xpath: :param e_msg: :return: """ current_page = 1 all_pages = int(math.ceil(int(count) / (items_in_page + 0.0))) remaining_pages = all_pages - current_page if remaining_pages == 0: Navigate.element_is_none(driver, Navigate.click_search.PAG_PAGE % current_page) obj_on_page = Navigate.elements_is_present(driver, section_xpath) on_page = len(obj_on_page) self.assertEqual(count, on_page, e_msg) elif remaining_pages >= 1: count_on_pages = 0 while remaining_pages >= 0: obj_on_page = Navigate.elements_is_present(driver, section_xpath) on_page = len(obj_on_page) next_page = current_page + 1 if remaining_pages != 0: self.assertEqual(items_in_page, on_page, e_msg) Navigate.element_click(driver, Navigate.click_search.PAG_PAGE % next_page) else: self.assertEqual(count-count_on_pages, on_page, e_msg) count_on_pages += on_page current_page += 1 remaining_pages -= 1 self.assertEqual(count, count_on_pages, e_msg) else: self.assertGreaterEqual(remaining_pages, 0, "Кол-во оставшихся страниц [%s] отрицательно" % remaining_pages)
def go_main(driver, phone=None, email=None, passwd=None, flag_auth=True, flag_api=True): """ Универсальный переход на главную страницу. :param driver: ссылка на драйвер :param phone: номер телефона :param email: электронная почта :param passwd: пароль :param flag_auth: флаг авторизации """ from support.utils.variables import EVariable env_base_url = EVariable.front_base.url.strip() # авторизоваться через API if flag_auth: service_log.put("To authorization via API") if flag_api: if email is None and phone is not None: HelpAuthMethods.set_authorization_by_phone(driver, phone, passwd) elif email is not None and phone is None: # TODO pass else: msg_error = "Not correct params." service_log.error(msg_error) assert AssertionError(msg_error) else: if email is None and phone is not None: HelpNavigateCheckMethods.get_page(driver, HelpNavigateCheckMethods.path_auth.PATH_AUTH) obj_phone, obj_password, obj_submit_button = HelpAuthCheckMethods.get_data_authorization(driver) # Вводим данные на авторизацию l = lambda e, p:e if p is None else p HelpAuthCheckMethods.send_phone(phone_object=obj_phone, phone_number=l(email, phone)) HelpAuthCheckMethods.send_password(password_object=obj_password, password_number=passwd) # Нажатие на кнопку авторизации HelpNavigateCheckMethods.element_click(driver, obj_submit_button, change_page_url=True) time.sleep(HelpNavigateCheckMethods.time_sleep) elif email is not None and phone is None: # TODO pass else: msg_error = "Not correct params." service_log.error(msg_error) assert AssertionError(msg_error) service_log.put("To authorization via API - success.") service_log.put("Get page: %s" % env_base_url) do_get_work = time.time() driver.get(env_base_url) work_get_time = HelpNavigateCheckMethods.work_time(do_get_work) service_log.put("Onload event time: [%s]" % work_get_time) HelpNavigateCheckMethods.progress(driver) work_load_time = HelpNavigateCheckMethods.work_time(do_get_work) service_log.put("Page received: %s" % env_base_url) service_log.put("Page received time: %s" % work_load_time) time.sleep(3)
def do_login(driver, sleep=2): """ Авторизоваться нажав на кнопку с текущей страницы. :param driver: ссылка на драйвер :param sleep: ожидание """ # time.sleep(sleep) reg_log_btn = HelpNavigateCheckMethods.get_element_navigate(driver, HelpAuthData.click_main.BUTTON_REG_AN_LOGIN) HelpAuthCheckMethods.click_button(reg_log_btn) login_button = HelpNavigateCheckMethods.get_element_navigate(driver, HelpAuthData.click_main.BUTTON_LOGIN) login_button.is_displayed() login_button.is_enabled() HelpNavigateCheckMethods.element_click(driver, login_button)
def reading_unread_messages_after_reg(driver, new_messages): """ Прочитать(протыкать) все непрочитанные сообщения(диалоги с пользователями) :param driver: :return: """ dialogs = Navigate.elements_is_present(driver, Navigate.click_chat.ALL_UNREAD_MESSAGES) for dialog in dialogs: body_msg = Navigate.element_is_present(driver, Navigate.check_chat.LAST_MSG) Navigate.element_is_present(driver, Navigate.check_main.COUNT_NEW_MSG % (new_messages-1), wait=20) Navigate.element_click(driver, dialog, change_page_url=True) body_msg_new = Navigate.get_element_navigate(driver, Navigate.check_chat.LAST_MSG) assert body_msg != body_msg_new, "Тело нового диалога не появилось, переход на новый диалог не произошел" msg = Navigate.get_element_navigate(driver, Navigate.check_main.ABSTRACT_MSG) msg = msg.text.encode('utf-8') return msg
def search_by_no_good(self, driver, good, count_goods, e_msg=''): """ Метод проверяет отсутствие товара в результатах поиска с использованием пагинации :param driver: :param good: """ fail = False page = 1 all_pages = int(math.ceil(int(count_goods) / 40.0)) while all_pages >= 1: try: self.good_card_short(driver, good) fail = True break except Exception: all_pages -= 1 if all_pages >= 1: page += 1 Navigate.element_click(driver, Navigate.click_search.PAG_PAGE % page) self.assertFalse(fail, e_msg)
def user_profile_menu(self, driver, user): """ Проверка выпадающего меню пользователя в хедере :param driver: :param user: :return: """ if (user['gender'] == 'MALE' or user['gender'] is None) and user['avatar_id'] is None: avatar_id = self.NO_AVA_MALE elif user['gender'] == 'FEMALE' and user['avatar_id'] is None: avatar_id = self.NO_AVA_FEMALE else: avatar_id = user['avatar_id'] Navigate.element_click(driver, Navigate.click_main.MENU_PROFILE_NAME % user['display_name'], change_page_url=False) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_AVATAR % avatar_id) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_MY_STORE) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_FAVORITES) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_CONTACTS) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_SETTINGS) Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_EXIT)
def go_authorization_page(driver, env_base_url=MainClass.ENV_BASE_URL, sleep=2): """ Авторизоваться через главную страницу. :param driver: ссылка на драйвер :param env_base_url: адрес главной страницы :param sleep: ожидание пока страница прогрузиться """ service_log.put("Get page: %s" % env_base_url) do_get_work = time.time() driver.get(env_base_url) work_get_time = HelpNavigateCheckMethods.work_time(do_get_work) service_log.put("Onload event time: [%s]" % work_get_time) HelpNavigateCheckMethods.progress(driver) work_load_time = HelpNavigateCheckMethods.work_time(do_get_work) service_log.put("Page received: %s" % env_base_url) service_log.put("Page received time: %s" % work_load_time) reg_log_btn = HelpNavigateCheckMethods.get_element_navigate(driver, HelpAuthData.click_main.BUTTON_REG_AN_LOGIN) HelpAuthCheckMethods.click_button(reg_log_btn) login_button = HelpNavigateCheckMethods.get_element_navigate(driver, HelpAuthData.click_main.BUTTON_LOGIN, mode=None) login_button.is_displayed() login_button.is_enabled() HelpNavigateCheckMethods.element_click(driver, login_button)
def search_by_no_user(self, driver, user, count_users, e_msg=''): """ Метод проверяет отсутствие пользователя в результатах поиска с использованием пагинации :param driver: :param user: """ fail = False page = 1 all_pages = int(math.ceil(int(count_users) / 40.0)) while all_pages >= 1: try: Navigate.element_is_present(driver, Navigate.click_search.LINK_SELLER_AVATAR % user["id"], wait=2) Navigate.element_is_present(driver, Navigate.click_search.SELLER_NAME_WITH_ID % (user['id'], user["display_name"]) ) fail = True break except Exception: all_pages -= 1 if all_pages >= 1: page += 1 Navigate.element_click(driver, Navigate.click_search.PAG_PAGE % page) self.assertFalse(fail, e_msg)
def test_authorization_by_phone(self, name_user='******'): """ Title: Авторизация пользователя по номеру телефона со статичными данными. """ user = users[name_user] service_log.run(self) # Переходим на страницу авторизации self.go_authorization_page(self.driver) #self.click_to_phone(self.driver) # Проверка страница авторизации self.check_page_authorization(self.driver) # Вводим данные на авторизацию obj_phone, obj_password, obj_submit_button = self.get_data_authorization(self.driver) self.send_phone(phone_object=obj_phone, phone_number=user["phone"]) self.send_password(password_object=obj_password, password_number=user["passwd"]) # Нажатие на кнопку авторизации HelpNavigateCheckMethods.element_click(self.driver, obj_submit_button, change_page_url=True) # Проверка виджета профиля self.check_menu_profile_widget_total(self.driver, user["name"])
def test_restorePassword_by_phone_correct(self): """ Title: Я могу восстановить пароль, введя свой номер телефона, на который зарегистрирован аккаунт Description: 1. Ввести корректный зарегистрированный номер моб. телефона в нажать "Выслать пароль" * отображается уведомление об отправке пароля на моб. телефон по смс * поле "Моб. телефон" становится недоступнынм для редактирования * пропадает кнопка "Выслать пароль" * появляется кнопка "Войти" * есть текст "Пароль отправлен на указанный номер. Введите его в течение 5 минут" * есть кнопка "Не приходит пароль?" * в БД для пользователя записывается новый пароль, состоящий из 5и чисел (хеш пароля). Он отличается от изначального. * на введенный моб. телефон приходит сгенерированный пароль, состоящий из 5и чисел. Он отличается от изначального. * статус пользователя и другие данные (кроме пароля) не меняется 2. Ввести полученный пароль и нажать "Войти": * Происходит успешный вход в систему под учетной записью, для которой восстанавливали пароль. * Проверить что под ней можно снова войти после логаута из системы """ service_log.run(self) self.go_authorization_page(self.driver) self.go_restore_page(self.driver) self.click_to_phone(self.driver) phone, sent_passwd_button = self.get_data_restore(self.driver) user = databases.db1.accounting.get_for_restore()[0] AccountingMethods.save_user_password(user_id=user["id"], hash_passwd=user["code_value"], salt=user["salt"]) # вводим номер телефона phone.send_keys(user["phone"][1:]) self.click_button(sent_passwd_button) self.check_password_is_sent(self.driver) pass_input = self.get_pass_input(self.driver) submit_button = self.get_login(self.driver) self.check_form_sent_passwd(self.get_form_note(self.driver)) data = databases.db1.accounting.get_sms(phone=user["phone"])[0] self.check_sms_status(data) user_new_info = databases.db1.accounting.get_data_accounts_by_user_id_and_status(user["id"])[0] msg_error1 = "ОШИБКА: Хеши паролей совпадают. Пароль не изменился" self.assertNotEqual(user["code_value"], user_new_info["code_value"], msg_error1) # сравниваем хеш нового и старого пароля msg_error2 = "ОШИБКА: Соль паролей совпадает. Пароль не изменился" self.assertNotEqual(user["salt"], user_new_info["salt"], msg_error2) # сравниваем соль нового и старого пароля newPass = data["message"][-5:] new_pass_hash = generate_sha256(newPass, user_new_info["salt"]) msg_error3 = "ОШИБКА: Новый хеш пароля из базы не совпадает с сгенерированным хешом. " \ "Возможно из логов получен неверный пароль." self.assertEqual(user_new_info["code_value"], new_pass_hash, msg_error3) pass_input.send_keys(newPass) Navigate.element_click(self.driver, submit_button, change_page_url=True) self.set_text_xpath_by_menu(user["display_name"])
def search_user(driver, user, sleep=2): Navigate.element_is_present(driver, Navigate.input_main.SEARCH).send_keys(user.decode('utf-8')) Navigate.element_click(driver, Navigate.click_main.BTN_SEARCH) time.sleep(sleep) Navigate.element_click(driver, Navigate.click_search.USER_MENU) time.sleep(sleep)
def test_registration_by_phone_correct(self): """ Title: Я могу зарегистрироваться по номеру телефона Description: 1. Заполнить первый этап регистрации, указав имя и корректный мобильный номер и нажав "Выслать пароль" * кнопка "Выслать пароль" исчезает со страницы * выбор способа регистрации (по email \ телефону) исчезает * поле "Моб. телефон" и "Имя Пользователя" становится недоступнынм для редактирования * появляется поле "Пароль" * появляется кнопка "Зарегистрироваться" * появляется кнопка "Не приходит пароль" * отображается текст "Пароль отправлен на указанный номер. Введите его в течение 5 минут" * на введенный моб. телефон приходит сгенерированный пароль, состоящий из 5и чисел. Проверить, что в базу так же записан хеш пароля. * в базу сохранен новый пользователь. Статус пользователя: "Ждет активации" 3. Нажать кнопку "Зарегистрироваться" * Произошел вход в систему под созданной учетной записью, в профиле (справа-сверху) корректно отображается имя пользователя в соответствии с созданным * на странице настроек профиля корректно отображается информация в соответствии с введеным при регистрации * В БД проверить, что создалась запись с заполненными в соответствии с созданным полями и проверить что данная запись имеет правильную роль * Проверить наличие иконки двух сообщений в мессенджере. """ service_log.run(self) type_user_name = 'VALID' telephone = str(random.randrange(1000000000, 7007777777, 1)) # Переходим на страницу авторизации и далее на страницу регистрации self.go_authorization_page(self.driver) self.go_registration_page(self.driver) self.click_to_phone(self.driver) obj_phone, obj_username, obj_submit_button = self.get_data_registration(self.driver) # Вводим имя пользователя, номер телефона и регистрируемся user_name = self.get_user_name(type_user_name) obj_username.send_keys(user_name) obj_phone.send_keys(telephone) self.click_button(obj_submit_button) # проверемя сообщение об успешной высылке пароля на регистрацию self.check_form_sent_passwd(self.get_form_note_passwd(self.driver)) # Находим пользователя по номеру телефона, проверемям что пароль, соль, телефон соответствуют требованиям info_user = databases.db1.accounting.get_data_user_by_phone('7' + telephone) self.check_correct_writing_phone_salt_passwd(info_user) info_user = info_user[0] # телефон пользователя уникален, берём единственную запись, что бы не таскать список # Запоминаем исходный пароль пользователя и генерируем новый AccountingMethods.save_user_password(info_user["id"], info_user["code_value"], info_user["salt"]) # генерируем новый пароль и подменяем на него default_new_passwd = AccountingMethods.get_default_password(4) hash_res_new = generate_sha256(default_new_passwd, info_user["salt"]) databases.db1.accounting.update_user_password(info_user["id"], hash_res_new) databases.db1.accounting.update_user_salt(info_user["id"], info_user["salt"]) # вводим пароль self.write_passwd_and_click_button(default_new_passwd) # восстанавливаем пароль и указываем тип аккаунта = продавец self.check_page_registration_after_add_passwd(user_id=info_user["id"], name=user_name, phone=telephone) Navigate.element_click(self.driver, self.get_reg_submit_not_disable(self.driver), change_page_url=True) self.check_count_roles_and_status(user_id=info_user["id"], count_roles=2, roles='1,2') # проверка, что зарегистрированный юзер залогинен self.check_menu_profile_widget_total(self.driver, info_user["display_name"]) self.check_menu_profile_widget_my_shop(self.driver) self.user_profile_menu(self.driver, info_user)
def test_registration_by_phone_correct_user_wait_for_registration(self): """ Title: Я могу зарегистрироваться по номеру телефона, если мой пользователь не окончил регистрацию в прошлый раз (WAIT_FOR_REGISTRATION) """ service_log.run(self) type_user_name = 'VALID' telephone = str(random.randrange(1000000000, 7577777777, 1)) # Переходим на страницу авторизации и далее на страницу регистрации self.get_page(self.driver, self.path_reg.URL_REG) self.click_to_phone(self.driver) obj_phone, obj_username, obj_submit_button = self.get_data_registration(self.driver) # Вводим имя пользователя, номер телефона и регистрируемся user_name = self.get_user_name(type_user_name) obj_username.send_keys(user_name) obj_phone.send_keys(telephone) self.click_button(obj_submit_button) # проверемя сообщение об успешной высылке пароля на регистрацию self.check_form_sent_passwd(self.get_form_note_passwd(self.driver)) # Находим пользователя по номеру телефона, проверемям что пароль, соль, телефон соответствуют требованиям info_user = databases.db1.accounting.get_data_user_by_phone('7' + telephone) self.check_correct_writing_phone_salt_passwd(info_user) info_user = info_user[0] # телефон пользователя уникален, берём единственную запись, что бы не таскать список # Запоминаем исходный пароль пользователя и генерируем новый AccountingMethods.save_user_password(info_user["id"], info_user["code_value"], info_user["salt"]) # генерируем новый пароль и подменяем на него default_new_passwd = AccountingMethods.get_default_password(4) hash_res_new = generate_sha256(default_new_passwd, info_user["salt"]) databases.db1.accounting.update_user_password(info_user["id"], hash_res_new) databases.db1.accounting.update_user_salt(info_user["id"], info_user["salt"]) # вводим пароль self.write_passwd_and_click_button(default_new_passwd) # восстанавливаем пароль и указываем тип аккаунта = покупатель self.check_page_registration_after_add_passwd(user_id=info_user["id"], name=user_name, phone=telephone) # Зарегистрировали пользователя, статус пользователя = WAIT_FOR_REGISTRATION # Регестрируем пользователя с тем же номером телефона # Переходим на страницу авторизации и далее на страницу регистрации self.get_page(self.driver, self.path_reg.URL_REG) self.click_to_phone(self.driver) obj_phone, obj_username, obj_submit_button = self.get_data_registration(self.driver) # Вводим имя пользователя, номер телефона и регистрируемся user_name = self.get_user_name(type_user_name) obj_username.send_keys(user_name) obj_phone.send_keys(telephone) self.click_button(obj_submit_button) # проверемя сообщение об успешной высылке пароля на регистрацию self.check_form_sent_passwd(self.get_form_note_passwd(self.driver)) # Находим пользователя по номеру телефона, проверемям что пароль, соль, телефон соответствуют требованиям info_user = databases.db1.accounting.get_data_user_by_phone('7' + telephone) self.check_correct_writing_phone_salt_passwd(info_user) info_user = info_user[0] # телефон пользователя уникален, берём единственную запись, что бы не таскать список # Запоминаем исходный пароль пользователя и генерируем новый AccountingMethods.save_user_password(info_user["id"], info_user["code_value"], info_user["salt"]) # генерируем новый пароль и подменяем на него default_new_passwd = AccountingMethods.get_default_password(4) hash_res_new = generate_sha256(default_new_passwd, info_user["salt"]) databases.db1.accounting.update_user_password(info_user["id"], hash_res_new) databases.db1.accounting.update_user_salt(info_user["id"], info_user["salt"]) # вводим пароль self.write_passwd_and_click_button(default_new_passwd) # восстанавливаем пароль и указываем тип аккаунта = покупатель self.check_page_registration_after_add_passwd(user_id=info_user["id"], name=user_name, phone=telephone) # Нажимаем создать аккаунт Navigate.element_click(self.driver, self.get_reg_submit_not_disable(self.driver)) self.check_count_roles_and_status(user_id=info_user["id"], count_roles=2, roles='1,2') # проверка, что зарегистрированный юзер залогинен self.check_profile_widget(self.driver) self.user_profile_menu(self.driver, info_user)