def get_user_card_web_status(driver, web_status_xpath, user_info, online_status='В сети'): if user_info["online_status"] == 'ONLINE': p = Navigate.get_element_navigate(driver, web_status_xpath % online_status) else: p = Navigate.get_element_navigate(driver, web_status_xpath % HelpUserCardMethods.need_time(user_info['last_activity_timestamp'])) return p
def test_as_visitor_to_chat(self, number_good=1, test_data=HelpNavigateCheckMethods.CATALOG_TO_GOOD): #TODO: обновить """ Title: Я, как Гость, при нажатии на "Связаться с продавцом" увижу страницу Авторизации """ self.driver.delete_all_cookies() self.driver.refresh() HelpNavigateCheckMethods.progress(self.driver) self.go_main(self.driver, flag_auth=False) # Выбираем товар и сохраняем его имя service_log.put("Выбираем товар и сохраняем его имя") good_name = self.get_name(self.get_element_navigate(self.driver, test_data["start_xpath_good"] % number_good)) # Переход на страницу товара service_log.put("Переход на страницу товара") self.check_navigate_in_good_page(self.driver, test_data, number_good) # Жмем кнопку service_log.put("Жмем кнопку Связаться с продавцом") btn_to_call = self.get_element_navigate(self.driver, self.click_good.BTN_CALL_SELLER) btn_to_call.click() obj_send = self.get_element_navigate(self.driver, self.click_good.BTN_SEND) self.click_button(obj_send) # Проверяем, что перекинуло на авторизацию service_log.put("Проверяем, что перекинуло на авторизацию") #self.click_to_phone(self.driver) self.check_page_authorization(self.driver)
def set_user_to_contacts(driver, link_db, current_count, need_count=20, mode='all'): """ Наполнить список контактов пользователями :param driver: :return: """ user_added = list() count_add_users = 0 fail = 0 service_log.put("Start filling the contact list") diff_count = need_count-current_count if diff_count <= 0: service_log.put("Contact list is full!") else: users_list = HelpUserContactsMethods.add_users_strategy(link_db, mode) random.shuffle(users_list) for user in users_list: result = HelpUserContactsMethods.click_in_contact(driver, user["account_details_id"]) if result is True: count_add_users += 1 user_added.append(user["account_details_id"]) service_log.put("Add user='******' to contact list" % user["account_details_id"]) else: fail += 1 assert fail == 50, "Пользователи не добавляются." if diff_count == count_add_users: service_log.put("End filling the contact list") Navigate.get_page(driver, Navigate.path_user_contact.URL_FAVORITES_USERS) break return user_added
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 good_card_short(driver, good): """ Метод получает объект короткая карточка товара по заданным данным :param good: данные товара :return: """ main_picture = good["content"][u'pictures'][u'value'][0].encode('utf-8') title = good["content"][u'title'][u'value'].encode('utf-8') min_stock = good["content"][u'min_stock'][u'value'] try: price = str(good["content"][u'price'][u'value'][u'significand']) if 3 < len(price) < 7: price = price[:-3] + " " + price[-3:] # здесь в кавычках неразрывные пробелы elif len(price) >= 7: price = price[:-6] + " " + price[-6:-3] + " " + price[-3:] except Exception: price = "---" g_card = { "card": Navigate.element_is_present(driver, Navigate.click_search.GOOD_CARD_BY_ID % good["ware_id"]), "picture": Navigate.element_is_present(driver, Navigate.click_search.GOOD_PICTURE % (good["ware_id"], main_picture)), "title": Navigate.element_is_present(driver, Navigate.click_search.GOOD_TITLE % (good["ware_id"], title)), "price": Navigate.element_is_present(driver, Navigate.click_search.GOOD_PRICE % (good["ware_id"], price)), "min_stock": Navigate.element_is_present(driver, Navigate.click_search.GOOD_MIN_STOCK % (good["ware_id"], min_stock)), } service_log.put("Короткая карточка товара найдена. Id: %s" % good["ware_id"]) return g_card
def test_authorization_by_phone_incorrect_user_disabled(self, type_password="******"): """ Title: Я не могу войти в систему по телефону, если мой пользователь в статусе DISABLED (пользователь Заблокирован) Description: * Отображается соответствующее сообщение """ service_log.run(self) status = "DISABLED" user = databases.db1.accounting.get_not_enabled_user(status=status)[0] AccountingMethods.save_user_password(user_id=user["id"], hash_passwd=user["code_value"]) # Устанавливаем новый пароль для пользователя default_new_passwd = AccountingMethods.get_default_password() hash_res_new = generate_sha256(default_new_passwd, user["salt"]) databases.db1.accounting.update_user_password(user["id"], hash_res_new) # Переходим на страницу авторизации self.go_authorization_page(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=user["phone"]) # Вводим данные на авторизацию self.send_password(password_object=obj_password, password_number=changed_passwd) self.send_phone(phone_object=obj_phone, phone_number=changed_phone) # Нажатие на кнопку авторизации self.submit_button(obj_submit_button) # Проверка блокировки пользователя Navigate.get_element_navigate(self.driver, self.check_auth.ERR_CHECK_DISABLED) Navigate.go_to_main_page(self.driver) self.check_header_widget_visitor(self.driver)
def check_main_menu_category(self, driver, section_tree, category_dict): """ Проверка категорий и их картинок в меню раздела """ for section in section_tree: section_name = section.localizedName if section_name == 'Торговое оборудование': continue # Кликаем на раздел, чтобы открыть меню раздела section_clk_menu = Navigate.get_element_navigate(driver, self.xpath_section % section_name, mode=None) Auth.click_button(section_clk_menu) # Проверка, что раздел стал открытым Navigate.get_element_navigate(driver, self.xpath_section_menu % section_name, mode=None) # Проверка, что открылось меню раздела Navigate.get_element_navigate(driver, Navigate.check_main.SECTION_MENU, mode=None) # Получаем категории раздела category_id_list = self.get_categories_list(section) category_tree = self.get_categories_tree(category_dict, category_id_list) cat_name_list = [category.localizedName for category in category_tree] # Получить объекты категорий меню cat_iu_list = self.get_categories(driver) name_ui_list = [category.text.encode('utf-8') for category in cat_iu_list] # Проверка количества возвращенных апи и показанных категорий count_ui_cat = len(cat_iu_list) count_db_cat = len(category_tree) err_msg = "Количество разделов в главном меню='%d' больше с количества разделов из БД='%d'" self.assertLessEqual(count_ui_cat, count_db_cat, err_msg % (count_ui_cat, count_db_cat)) sub = lambda db, ui: filter(lambda x: x not in db, ui) # Берем максимум 6 категорий отображаемых в меню name_ui = name_ui_list[:6] sub_cat = sub(cat_name_list, name_ui) err_msg = "В разделе '%s' содержится категория '%s', которой нет в ответе АПИ: %s" self.assertFalse(sub_cat, err_msg % (section_name, sub_cat, cat_name_list))
def check_incorrect_passwd_or_phone(self, driver): """ Проверяем форму при вводе не корректного пароля. :param driver: ссылка на драйвер """ self.check_error(driver) HelpNavigateCheckMethods.element_is_present(driver, self.set_text_xpath_error(self.TEXT_CHECK_PHONE_OR_PASS))
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 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 check_page_restore_password(self, driver): """ TestRail: C-548 Валидации полей формы Восстановления пароля: Негативные http://test-rails.oorraa.pro/index.php?/cases/view/548 :param driver: ссылка на дравер """ list_check1 = [self.check_restore.TITLE_RESTORE_PAGE, #self.check_restore.HEADER, self.check_restore.LOGO, self.check_restore.FORM_RESTORE, self.check_restore.FORM_PHONE, #self.check_restore.BLC_RIGHT, #self.check_restore.TITLE_RIGHT, #self.check_restore.TITLE_BLC, #self.check_restore.BTN_REGISTRATION, self.check_restore.FOOTER, self.check_restore.INPUT_PHONE, self.check_restore.BTN_RESTORE ] list_check2 = ["//input[@class='search__input']", # проверка отсутствия поиска "//ul[@class='cat__list']", # проверка отсутствия 6 рутовых категорий "//nav[@class='cat']", # проверка отсутствия Каталог товаров ] # Первый список проверки for index in list_check1: self.assertIsNotNone(driver.find_element_by_xpath(index)) # Второй список проверки for index in list_check2: HelpNavigateCheckMethods.element_is_none(driver, index) # проверка что можно вводить только российские номера self.assertEqual(driver.find_element_by_xpath(self.FORM_PHONE_CODE).text, u'+7')
def check_page_authorization(self, driver): """ TestRail: C-27 Внешний вид страницы Авторизации (wide) http://test-rails.oorraa.pro/index.php?/cases/view/27 :param driver: ссылка на дравер """ list_check1 = [#self.check_auth.TITLE_AUTH_PAGE, #self.check_auth.HEADER, # проверка header. self.check_auth.LOGO, # проверка логотипа. self.check_auth.FORM_AUTH, # проверка формы авторизации self.check_auth.FORM_PHONE, # проверка формы Моб.телефон self.check_auth.FORM_PASS, # проверка формы Пароль self.check_auth.BTN_RESTORE, # проверка кнопки Забыли пароль #self.check_auth.BLC_RIGHT, # блок справа "Впервые на УУРРАА? Регистрация" #self.check_auth.TITLE_RIGHT, # проверка загловка 'Впервые на УУРРАА?' #self.check_auth.TITLE_BLC, # загловк 'Впервые на УУРРАА?' self.check_auth.BTN_REGISTRATION, # проверка кнопки Регистрация self.check_auth.FOOTER, # проверка подвала self.check_auth.INPUT_PHONE, self.check_auth.INPUT_PASS, self.check_auth.BTN_LOGIN ] list_check2 = ["//input[@class='search__input']", # проверка отсутствия поиска "//ul[@class='cat__list']", # проверка отсутствия 6 рутовых категорий "//nav[@class='cat']", # проверка отсутствия Каталог товаров ] # Первый список проверки for index in list_check1: self.assertIsNotNone(HelpNavigateCheckMethods.get_element_navigate(driver, index)) # Второй список проверки for index in list_check2: HelpNavigateCheckMethods.element_is_none(driver, index)
def is_user_logged(self, driver, user): """ Проверка, что пользователь залогинен. Корректность имени пользователя в хедере :param user: :return: """ Navigate.element_is_present(driver, Navigate.click_main.MENU_PROFILE_NAME % user['display_name'])
def get_user_store_photo_in_cont(driver, path, photo_xpath, logo_id): if logo_id is None: p = Navigate.get_element_navigate(driver, path + Navigate.check_user_contact.US_LOGO_STUB, sleep=0.1, mode=None) else: p = Navigate.get_element_navigate(driver, path + photo_xpath % logo_id, sleep=0.1, mode=None) return p
def get_user_store_name(driver, path, name_xpath, name): if name is None: p = Navigate.get_element_navigate(driver, path + Navigate.check_user_contact.US_WITHOUT_NAME, sleep=0.1, mode=None) else: Navigate.get_element_navigate(driver, path + Navigate.check_user_contact.US_LABEL_NAME, sleep=0.1, mode=None) p = Navigate.get_element_navigate(driver, path + name_xpath % name, sleep=0.1, mode=None) return p
def check_instruction_not_receiver_passwd(self, driver): """ Проверка текста со списком инструкций, если пароль не пришел. :param driver: ссылка на драйвер """ HelpNavigateCheckMethods.element_is_present(driver, self.CHECK_OBJ_INSTRUCT_NOT_PASSWD % self.CHECK_INSTRUCT_NOT_PASSWD) for index in self.LIST_INSTRUCT_NOT_PASSWD: HelpNavigateCheckMethods.element_is_present(driver, self.OBJ_NOT_RECEIVER_PASSWD % index)
def get_data_restore(driver): """ Получить данные страницы восстановления пароля. :param driver: ссылка на драйвер :return: телефон, пароль, кнопка "Войти" """ phone = HelpNavigateCheckMethods.element_is_present(driver, "//input[@name='phone' and @placeholder='(800) 000-00-00']") sent_pass_button = HelpNavigateCheckMethods.element_is_present(driver, "//span[text()='Выслать пароль']") # кнопка Выслать пароль return phone, sent_pass_button
def check_form_create_user(self, driver): """ Проверка формы Создание пользователя в бэк-офисе :param driver: :return: """ for title in self.USER_FORM_TITLES: HNCK.get_element_navigate(driver, HNCK.check_back_users.NAME_FIELDS % title)
def check_no_add_contact_btn(self, driver): f = False try: Navigate.get_element_navigate(driver, Navigate.click_user_contact.BTN_ADD_CONTACT, mode=None, sleep=0.1) f = True except Exception: pass self.assertFalse(f, "Появилась кнопка добавить пользователя")
def get_sub_categories(driver): """ Получить под-категории из категории раздела :param driver: :return: """ Navigate.get_element_navigate(driver, Navigate.check_main.MAIN_MENU_SUB_CATEGORY, mode=None) return driver.find_elements_by_xpath(Navigate.check_main.MAIN_MENU_SUB_CATEGORY_ABSTRACT)
def check_not_need_phone(self, driver): """ Проверка отсутствия окна ошибки "введите телефон". :param driver: ссылка на драйвер """ tx = None try: HelpNavigateCheckMethods.element_is_present(driver, self.set_text_xpath_error(self.TEXT_NEED_PHONE_EMAIL)) except Exception, tx: pass
def get_back_page(driver, env_back_url=MainClass.ENV_BASE_BACK_URL, path_back=''): """ Перход на страницу бек-офиса по path :param driver: :param env_back_url: :param path_back: :return: """ HNCK.get_page(driver=driver, path_url=path_back, env_base_url=env_back_url)
def check_text_message(self, driver, dialog, message): """ Проверить текстовое сообщение :param messages: :return: """ service_log.put("Checking Text-message") text = message[u'text'][u'text'].encode('utf-8') Navigate.element_is_present(driver, Navigate.check_chat.TEXT_MSG % (dialog, text))
def check_picture_message(self, driver, dialog, message): """ Проверить сообщение-картинка :param messages: :return: """ service_log.put("Checking Picture-message") picture_id = message[u'pictureId'].encode('utf-8') Navigate.element_is_present(driver, Navigate.check_chat.MSG_PICTURE % (dialog, picture_id))
def get_page_with_param(driver, url_path, param): """ Выполнить переход на страницу по урлу с параметром (например подставить идентификатор магазина) :param driver: :param url_path: :param param: :return: """ url = url_path + param Navigate.get_page(driver, url)
def get_back_auth_data(driver): """ Получение форм и кнопки войти на странице авторизации бэк-офиса :param driver: :return: """ obj_login = HNCK.get_element_navigate(driver, HNCK.input_back_auth.FORM_LOGIN) obj_pass = HNCK.get_element_navigate(driver, HNCK.input_back_auth.FORM_PASS) obj_submit = HNCK.get_element_navigate(driver, HNCK.click_back_auth.BTN_SUBMIT) return obj_login, obj_pass, obj_submit
def test_smoke_user_settings(self): """ Title: Тест сценарий изменений настроек пользователя. Description: 1) Авторизоваться пользователем 2) Перейти на страницу "Настройки" - Проверить, что отображаемые данные = тому что в базе (включая аватар) - Проверить, что Имя и Аватар отображаемом в виджете "Профиль пользователя" = тому что в базе 3) Изменить Имя пользователя и пол - Проверить что изменения отображаются и в базе и в интерфейсе 4) Изменить аватар (старый удалить) - Проверить, что отображается заглушка фото (в настройках и в профиле продавца) 5) Изменить аватар (добавить новый) - Проверить, что отображается новая фото (в настройках и в профиле продавца) """ # 1) Авторизоваться Пользователем через e-mail и проверить успешность операции. self.go_to_main_page(self.driver) self.click_reg_and_auth(self.driver) self.click_tab_login(self.driver) auth_form = self.get_auth_email_form(self.driver) auth_form["email_input"].send_keys(self.user['email']) auth_form["password_input"].send_keys(self.default_passwd) self.click_button(auth_form["login_btn"]) # Перейти на страницу "Настройки" self.get_page(self.driver, self.path_settings.PATH_PROFILE_SETTINGS) profile = self.get_user_profile_form(self.driver, self.user) gender = self.get_gender_user2(self.driver, self.user["gender"]) # Изменить Имя пользователя и пол self.clear_input_row(self.driver, profile["name_input"]) new_name = common_utils.random_string() profile["name_input"].send_keys(new_name) gender_ui = self.set_gender(gender, self.user["gender"]) self.click_button(profile["save_btn"]) # Проверяем, что изменения вступили в силу, как в БД, так и в интерфейсе criteria = "gender='%s' and display_name='%s' and id=%s" % (gender_ui, new_name, self.user["id"]) user_updated = databases.db1.accounting.get_user_by_criteria_only(criteria)[0] self.driver.refresh() Navigate.progress(self.driver) self.get_user_profile_form(self.driver, user_updated) self.get_gender_user(self.driver, user_updated["gender"]) # Изменить аватар (старый удалить) btn_avatar = self.get_delete_avatar_button(self.driver) # TODO: У пользователя уже должен быть аватар! btn_avatar.click() # Изменить аватар (добавить новый) img_path = self.IMG_AVATAR[0] add_img_btn = self.get_element_navigate(self.driver, self.click_my_goods.ADD_AVATAR) add_img_btn.click() self.add_photo(img_path) self.assertIsNotNone(self.get_delete_avatar_button(self.driver))
def get_sent_success_btn(driver): """ Получить объекты кнопок На страницу товара и В чат Проверка сообщения об успешной отправке :param driver: :return: """ Navigate.get_element_navigate(driver, Navigate.check_good.MSG_SENT_SUCCESS, mode=None) btn_to_good = Navigate.get_element_navigate(driver, Navigate.click_good.BTN_TO_CARD_GOOD, mode=None) btn_to_chat = Navigate.get_element_navigate(driver, Navigate.click_good.BTN_TO_CHAT, mode=None) return btn_to_good, btn_to_chat
def get_all_fields(driver): """ Получить все input объекты формы обратной связи :return: """ obj = dict() obj['name'] = HNCM.get_element_navigate(driver, HNCM.input_contacts.NAME) obj['phone'] = HNCM.get_element_navigate(driver, HNCM.input_contacts.PHONE) obj['email'] = HNCM.get_element_navigate(driver, HNCM.input_contacts.EMAIL) obj['message'] = HNCM.get_element_navigate(driver, HNCM.input_contacts.MESSAGE) return obj
def check_card_user_in_search_contact(self, driver, user): path_fg = Navigate.check_user_contact.USER_IN_SEARCH service_log.put("Start checking user card in search contact by user_id='%s'" % user["id"]) Navigate.get_element_navigate(driver, path_fg, mode=None, e_msg="Не найдена карточка пользователя в поисковй выдаче") self.get_user_card_photo_in_cont(driver, path_fg, Navigate.check_user_contact.FU_USER_PHOTO_IN_SEARCH, user["avatar_id"]) HelpUserCardCheckMethods.get_user_card_name(driver, path_fg + Navigate.check_user_contact.FU_USER_NAME, user["display_name"]) HelpUserCardCheckMethods.get_user_card_on_off_line(driver, path_fg + Navigate.check_user_contact.FU_USER_STATUS, user) service_log.put("Success checking user card in search contact by user_id='%s'" % user["id"])