Esempio n. 1
0
 def check_users(self, driver, pages, users_account, stop_test_pages=None):
     """
     Проверка всей информации в бек-офисе о пользователе построчно
     :param driver:
     :param pages:
     :param users_account:
     :return:
     """
     count_page = 0
     for page in range(pages):
         count_page += 1
         ids = driver.find_elements_by_xpath(HNCK.check_back_users.IDS)
         for id in ids:
             id = id.text.encode('utf-8')[4:]
             user = databases.db1.accounting.get_user_by_account_id(id)[0]
             self.check_user_in_db_query(user, users_account)
             user_account = databases.db1.accounting.get_user_account_info_by_id(user["id"])[0]
             count = self.get_info_line(driver, user)
             msg_count = "Найдено %s строк с упоминанием ID %s"
             self.assertEqual(len(count), 1, msg_count % (len(count), user["id"]))
             info_user_back = self.get_info_user_by_line(driver, count[0])
             user_roles = databases.db1.accounting.get_user_role_by_id(user_id=user["id"])
             info_user_db = self.get_info_user_by_db(user, user_account, HPSCM.get_user_role_ui(user_roles))
             msg_check = "Данные из бэк офиса: '%s' не совпали с данными и базы: '%s'"
             self.assertEqual(info_user_back, info_user_db, msg_check % (info_user_back, info_user_db))
         if stop_test_pages == count_page:
             break
         if pages > 1:
             next_pag = HNCK.get_element_navigate(driver, HNCK.click_back_users.PAG_NEXT)
             FrontAuthCheckMethods.click_button(next_pag)
Esempio n. 2
0
 def set_categories(driver, new_category_not=None):
     """
     Задать новые категории для товара
     :param driver:
     :param new_categories_dict:
     :return:
     """
     root_cat_xpath = HelpNavigateCheckMethods.click_my_goods.ROOT_CATEGORY % ""
     obj_categories = driver.find_elements_by_xpath(root_cat_xpath)
     service_log.put("Get all root categories obj.")
     list_root_cat = []
     for obj_cat in obj_categories:
         list_root_cat.append(obj_cat.text.encode("utf-8"))
     service_log.put("Create list root categories='%s'" % list_root_cat)
     list_root_cat.remove(new_category_not)
     try:
         list_root_cat.remove("Выберите категорию")
         list_root_cat.remove("Товары для детей")
         list_root_cat.remove("Торговое оборудование")
     except Exception:
         pass
     service_log.put(
         "Remove old root category='%s' from list root category='%s'" % (new_category_not, list_root_cat)
     )
     new_root = random.choice(list_root_cat)
     new_root_xpath = HelpNavigateCheckMethods.click_my_goods.ROOT_CATEGORY % new_root
     obj_root_cat = HelpNavigateCheckMethods.get_element_navigate(driver, new_root_xpath)
     service_log.put("Get new root category='%s'" % new_root)
     HelpAuthCheckMethods.click_button(obj_root_cat)
     xpath_category = (
         HelpNavigateCheckMethods.click_my_goods.PATH_REQUIRE_FIELDS
         + HelpNavigateCheckMethods.click_my_goods.FIELD_CATEGORY
     )
     HelpGoodMethods.select_category(driver, HelpGoodData.CAT_SUITE[new_root], xpath_category)
     return HelpGoodData.CAT_SUITE[new_root]
Esempio n. 3
0
 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))
Esempio n. 4
0
 def cat_sub_cat(self, driver, name_ui, category_dict, section, section_name):
     """
     Проверка подкатегории у которой родительская категория - категория
     :param driver:
     :param name_ui:
     :param category_dict:
     :param section:
     :param section_name:
     :return:
     """
     # Получаем категории раздела
     category_id_list = self.get_categories_list(section)
     category_tree = self.get_categories_tree(category_dict, category_id_list)
     # Проверка, что из апи пришли категории которые принадлежат секции меню
     for name in name_ui:
         service_log.put("CHECK. Sub-category in category '%s'" % name)
         cat_clk = Navigate.get_element_navigate(driver, self.xpath_category % name, mode=None)
         Auth.click_button(cat_clk)
         category = [cat for cat in category_tree if cat.localizedName == name]
         # Получаем подкатегории из категории раздела
         sub_id_list = self.get_categories_list(category[0])
         sub_tree = self.get_categories_tree(category_dict, sub_id_list)
         sub_name_list = [sub.localizedName for sub in sub_tree]
         # Проверка возвращенных апи и показанных подкатегорий
         obj_ui_sub = self.get_sub_categories(driver)
         name_ui_sub = [obj.text.encode('utf-8') for obj in obj_ui_sub]
         # Получаем названия подкатегорий UI, которых нет в списке подкатегорий полученном из БД
         sub = lambda db, ui: filter(lambda x: x not in db, ui)
         sub_cat = sub(sub_name_list, name_ui_sub)
         err_msg = "В '%s -> %s' содержится подкатегория '%s', которой нет в ответе АПИ: %s"
         self.assertFalse(sub_cat, err_msg % (section_name, name, sub_cat, sub_name_list))
         service_log.put("PASS. Sub-category in category '%s'" % name)
Esempio n. 5
0
 def test_click_home(self):
     """
     Title: Я могу находясь на любой странице сайта перейти на главную кликнув на "домик" в главном меню.
     """
     parameters = {
         '404': '',
         'section': str(self.section.categoryId),
         'category': str(self.category.categoryId),
         'sub-category': str(self.sub_category.categoryId),
         'shop': AccountingMethods.get_default_user_id('seller'),
     }
     url = lambda sm, p, ps: sm[p] if ps[p] is '' else sm[p] % ps[p]
     for param in parameters:
         service_log.put("Checking...['%s']" % param)
         base_url = self.driver.current_url
         source = self.driver.page_source
         url_page = url(self.SITE_MAP, param, parameters)
         self.get_page(self.driver, url_page)
         source_new = self.driver.page_source
         self.assertNotEqual(source, source_new, "Переход по url='%s' не произошел" % url)
         btn_home = self.get_element_navigate(self.driver, self.click_main.MAIN_MENU_HOME)
         HelpAuthCheckMethods.click_button(btn_home, sleep=3)
         current_url = self.driver.current_url
         source_home = self.driver.page_source
         self.assertEqual(base_url, current_url, "Переход на главную не произошел")
         self.assertNotEqual(source_home, source_new, "Переход на главную не произошел")
         service_log.put("PASS...['%s']" % param)
Esempio n. 6
0
 def check_find_part_name(self, driver, part_name, sleep=2):
     count_contacts_old = self.get_count_contacts(driver)
     self.find_user_by_name(driver, part_name, sleep)
     count_contacts_new = self.get_count_contacts(driver)
     self.assertGreater(count_contacts_old, count_contacts_new, "После ввода части имени количество контактов "
                                                                "уменьшилось")
     user = Navigate.get_element_navigate(driver, Navigate.click_user_contact.LAST_USER)
     HelpAuthCheckMethods.click_button(user)
Esempio n. 7
0
 def delete_first_user_in_cl(driver, fav_user):
     """
     Удалить первого пользователя из списка контактов
     :param driver:
     :return:
     """
     #Navigate.get_page(driver, Navigate.path_user_contact.URL_FAVORITES_USERS)
     usr = Navigate.get_element_navigate(driver, Navigate.check_user_contact.USER_CARD_BY_ID % fav_user["id"])
     HelpAuthCheckMethods.click_button(usr)
     Navigate.get_element_navigate(driver, Navigate.check_user_contact.ACTIVE_USER_CARD_BY_ID % fav_user["id"])
     btn_delete = Navigate.get_element_navigate(driver, Navigate.click_user_contact.BTN_DELETE, sleep=0.1)
     HelpAuthCheckMethods.click_button(btn_delete, sleep=1)
     Navigate.get_element_navigate(driver, Navigate.check_user_contact.MSG_DELETE_USR % fav_user["display_name"])
Esempio n. 8
0
 def set_email(driver, email):
     """
     Вводим емайл и сохраняем
     :param email:
     :return:
     """
     input_email = HNCM.get_element_navigate(driver, HNCM.input_settings.EMAIL_ABSTRACT)
     input_email.click()
     ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).key_down(Keys.DELETE).\
         key_up(Keys.DELETE).perform()
     input_email.send_keys(email)
     submit_btn = HNCM.get_element_navigate(driver, HNCM.path_settings.PATH_COMMON_INFO +
                                            HNCM.click_settings.SAVE_BUTTON)
     HelpAuthCheckMethods.click_button(submit_btn, sleep=3)
Esempio n. 9
0
 def click_in_contact(driver, user_id):
     """ Нажимаем кнопку в контакты.
     :param driver: ссылка на драйвер
     :param user_id: идентификатор пользователя
     :return: type(bool)
     """
     result = False
     try:
         Navigate.get_page(driver, Navigate.path_buyer.URL_BUYER % user_id)
         in_contact = Navigate.click_user_contact.IN_CONTACT_USER
         btn = Navigate.get_element_navigate(driver, in_contact, sleep=0.1, mode=None)
         HelpAuthCheckMethods.click_button(btn, sleep=0.1)
         result = True
     except Exception:
         result = False
     return result
Esempio n. 10
0
 def delete_user_in_contacts(driver, link_db, user_id):
     """
     Удалить пользователей из списка контактов
     :param driver:
     :param count:
     :return:
     """
     Navigate.get_page(driver, Navigate.path_user_contact.URL_FAVORITES_USERS)
     fav_users_list = link_db.accounting.get_fav_user_by_user_id(user_id)
     l = lambda l: list() if l is None else l
     count = len(l(fav_users_list))
     while count != 0:
         btn_user = Navigate.get_element_navigate(driver, Navigate.click_user_contact.LAST_USER, sleep=1)
         HelpAuthCheckMethods.click_button(btn_user, sleep=0.1)
         btn_delete = Navigate.get_element_navigate(driver, Navigate.click_user_contact.BTN_DELETE, sleep=0.1)
         HelpAuthCheckMethods.click_button(btn_delete, sleep=1)
         fav_users_list = link_db.accounting.get_fav_user_by_user_id(user_id)
         count = len(l(fav_users_list))
Esempio n. 11
0
 def check_main_menu_sub_category(self, driver, section_tree, category_dict):
     """ Проверка подкатегорий в меню категории раздела
     """
     for section in section_tree:
         section_name = section.localizedName
         service_log.put("CHECK. Section '%s'" % section_name)
         # Кликаем на раздел, чтобы открыть меню раздела
         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)
         # Получить объекты категорий меню
         cat_iu_list = self.get_categories(driver)
         name_ui_list = [category.text.encode('utf-8') for category in cat_iu_list]
         # Берем максимум 6 категорий отображаемых в меню
         name_ui = name_ui_list[:6]
         p = lambda d, n, cd, se, sn: self.sub_cat(d, cd, se, sn) if n == list() else self.cat_sub_cat(d, n, cd, se, sn)
         p(driver, name_ui, category_dict, section, section_name)
         service_log.put("PASS. Section '%s'" % section_name)
Esempio n. 12
0
    def back_auth(role, obj_login, obj_pass, obj_submit, link_db):
        """
        Авторизация в бэк-офисе
        :param role:
        :param obj_login:
        :param obj_pass:
        :param obj_submit:
        :return:
        """
        # Настройка окружения и вспомогательные параметры
        default_user_id = AccountingMethods.get_default_user_id(role=role)
        user = link_db.accounting.get_user_by_account_id(default_user_id)[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)

        # Вводим данные на авторизацию
        FrontAuthCheckMethods.send_phone(phone_object=obj_login, phone_number=user["phone"][1:])
        FrontAuthCheckMethods.send_password(password_object=obj_pass, password_number=default_new_passwd)
        # Нажатие на кнопку авторизации
        FrontAuthCheckMethods.submit_button(obj_submit)
        return user
Esempio n. 13
0
 def change_status(driver, status, wait=50):
     """
     зменить статус пользхователя заблокировать/разблокировать
     :param driver:
     :param status:
     :return:
     """
     success = False
     service_log.put("User status is %s. Begin change status." % status)
     if status == 'ENABLED':
         HNCK.get_element_navigate(driver, HNCK.check_back_users.MODAL_BODY, mode=None)
         disabled = HNCK.get_element_navigate(driver, HNCK.check_back_users.MODAL_DISABLED_BTN, mode=None)
         cancel = HNCK.get_element_navigate(driver, HNCK.check_back_users.MODAL_CANCEL_BTN, mode=None)
         FrontAuthCheckMethods.click_button(disabled)
         do_time = time.time()
         while time.time() - do_time < wait:
             try:
                 driver.find_element_by_xpath(HNCK.check_back_users.DISABLED_SUCCESS)
                 success = True
                 break
             except Exception:
                 pass
         assert success is not False, "Не получено сообщение о успешном изменении статуса"
     service_log.put("User status is changed.")
Esempio n. 14
0
 def test_go_to_section(self):
     """
     Title: Я могу перейти на страницу выбранного Раздела, кликнув на "Все разделы" в выпадающем меню выбранного раздела
     Description:
         * Проверить, xто я нахожусь на странице соответствующего раздела
     """
     for section in self.section_tree:
         if section.localizedName == "Торговое оборудование":
             continue
         # Кликаем на раздел, чтобы открыть меню раздела
         xpath_section = self.xpath_section % section.localizedName
         section_clk_menu = self.get_element_navigate(self.driver, xpath_section, mode=None)
         HelpAuthCheckMethods.click_button(section_clk_menu)
         # кликаем на ссылку в меню раздела "Все разделы"
         all_cat_btn = self.get_element_navigate(self.driver, self.click_main.ALL_CATEGORIES, mode=None)
         page_source = self.driver.page_source
         HelpAuthCheckMethods.click_button(all_cat_btn)
         url_ui = self.driver.current_url.encode('utf-8')
         page_source_new = self.driver.page_source
         url_need = self.ENV_BASE_URL + self.path_category.URL_PATH_ROOT_CATEGORY % section.categoryId
         err_msg_1 = "Переход не произошел, полученный урл: %s не совпадает с целевым: %s"
         self.assertEqual(url_ui, url_need, err_msg_1 % (url_ui, url_need))
         err_msg_2 = "Тело страницы не измненилось, переход в раздел '%s' не произошел"
         self.assertNotEqual(page_source, page_source_new, err_msg_2 % section.localizedName)
Esempio n. 15
0
 def test_go_to_final_category(self):
     """
     Title: Я могу перейти на страницу выбранной Подкатегории, кликнув на название подкатегории в выпадающем меню
     выбранного раздела и выбранной категории (...)
     Description:
         * Проверить, что я нахожусь на странице соответствующей подкатегории в пункте "Все товары"
     """
     for section in self.section_tree:
         # Получить список категорий у которых есть подкатегории
         cat_id_list = self.get_categories_list(section)
         cat_tree = self.get_categories_tree(self.category_dict, cat_id_list)
         # Кликаем на раздел, чтобы открыть меню раздела
         xpath_section = self.xpath_section % section.localizedName
         section_clk_menu = self.get_element_navigate(self.driver, xpath_section, mode=None)
         HelpAuthCheckMethods.click_button(section_clk_menu)
         name_ui = section.localizedName
         category_in_sub = section
         # Для раздела Тороговое оборудования используется логика без переходв категорию, т.к. у него их нет
         if section.localizedName != "Торговое оборудование":
             # Получить объекты категорий меню
             cat_iu_list = self.get_categories(self.driver)
             name_ui_list = [category.text.encode('utf-8') for category in cat_iu_list]
             # Берем максимум 6 категорий отображаемых в меню
             names_ui = name_ui_list[:6]
             # кликаем на первую категорию
             name_ui = names_ui[0]
             xpath_category = self.xpath_category % name_ui
             cat_btn = self.get_element_navigate(self.driver, xpath_category, mode=None)
             HelpAuthCheckMethods.click_button(cat_btn)
             category_db = [item for item in cat_tree if item.localizedName == name_ui]
             category_in_sub = category_db[0]
         # Проверка возвращенных апи и показанных подкатегорий
         obj_ui_sub = self.get_sub_categories(self.driver)
         names_ui_sub = [obj.text.encode('utf-8') for obj in obj_ui_sub]
         # имя подкатегории
         name_ui_sub = names_ui_sub[0]
         sub_cat_id_list = self.get_categories_list(category_in_sub)
         sub_cat_tree = self.get_categories_tree(self.category_dict, sub_cat_id_list)
         sub_category_db = [item for item in sub_cat_tree if item.localizedName == name_ui_sub]
         sub_category_id = sub_category_db[0].categoryId
         xpath_sub_cat = self.click_main.MAIN_MENU_SUB_CATEGORY_BY_NAME % name_ui_sub
         # кликаем на ссылку подкатегориив меню категории
         sub_cat_btn = self.get_element_navigate(self.driver, xpath_sub_cat, mode=None)
         page_source = self.driver.page_source
         HelpAuthCheckMethods.click_button(sub_cat_btn)
         self.get_element_navigate(self.driver, self.check_catalog.ACTIVE_TREE_CATEGORY % name_ui_sub)
         self.get_element_navigate(self.driver, self.check_catalog.PARENT_CAT_IN_SUB_CAT_LISTING % name_ui)
         url_ui = self.driver.current_url.encode('utf-8')
         page_source_new = self.driver.page_source
         url_need = self.ENV_BASE_URL + self.path_category.URL_PATH_ROOT_CATEGORY % sub_category_id
         err_msg_1 = "Переход не произошел, полученный урл: %s не совпадает с целевым: %s"
         self.assertEqual(url_ui, url_need, err_msg_1 % (url_ui, url_need))
         err_msg_2 = "Тело страницы не измненилось, переход на подкатегорию: '%s' не произошел"
         self.assertNotEqual(page_source, page_source_new, err_msg_2 % name_ui_sub)
Esempio n. 16
0
 def test_go_to_category_all_goods(self):
     """
     Title: Я могу перейти на страницу выбранной Категории.Все товары, кликнув на "Все категории" в выпадающем меню
     выбранного раздела
     Description:
         * Проверить, что я нахожусь на странице соответствующей категории в пункте "Все товары"
     """
     for section in self.section_tree:
         # Получить список категорий у которых есть подкатегории
         cat_id_list = self.get_categories_list(section)
         cat_tree = self.get_categories_tree(self.category_dict, cat_id_list)
         # Кликаем на раздел, чтобы открыть меню раздела
         xpath_section = self.xpath_section % section.localizedName
         section_clk_menu = self.get_element_navigate(self.driver, xpath_section, mode=None)
         HelpAuthCheckMethods.click_button(section_clk_menu)
         name_ui = section.localizedName
         category_id = section.categoryId
         # Для раздела Тороговое оборудования используется логика без переходв категорию, т.к. у него их нет
         if section.localizedName != "Торговое оборудование":
             # Получить объекты категорий меню
             cat_iu_list = self.get_categories(self.driver)
             name_ui_list = [category.text.encode('utf-8') for category in cat_iu_list]
             # Берем максимум 6 категорий отображаемых в меню
             names_ui = name_ui_list[:6]
             # кликаем на первую категорию
             name_ui = names_ui[0]
             xpath_category = self.xpath_category % name_ui
             cat_btn = self.get_element_navigate(self.driver, xpath_category, mode=None)
             HelpAuthCheckMethods.click_button(cat_btn)
             category_db = [item for item in cat_tree if item.localizedName == name_ui]
             category_id = category_db[0].categoryId
         # кликаем на ссылку в меню атегории "Все категории"
         all_sub_cat_btn = self.get_element_navigate(self.driver, self.click_main.ALL_SUB_CATEGORIES, mode=None)
         page_source = self.driver.page_source
         HelpAuthCheckMethods.click_button(all_sub_cat_btn)
         self.get_element_navigate(self.driver, self.check_catalog.ACTIVE_TREE_CATEGORY % 'Все товары')
         self.get_element_navigate(self.driver, self.check_catalog.PARENT_CAT_IN_SUB_CAT_LISTING % name_ui)
         url_ui = self.driver.current_url.encode('utf-8')
         page_source_new = self.driver.page_source
         url_need = self.ENV_BASE_URL + self.path_category.URL_ALL_IN_CATEGORY % category_id
         err_msg_1 = "Переход не произошел, полученный урл: %s не совпадает с целевым: %s"
         self.assertEqual(url_ui, url_need, err_msg_1 % (url_ui, url_need))
         err_msg_2 = "Тело страницы не измненилось, переход на все подкатегории категории: '%s' не произошел"
         self.assertNotEqual(page_source, page_source_new, err_msg_2 % name_ui)
Esempio n. 17
0
 def click_reg_and_auth(driver):
     """ Нажать на кнопку Зарегистрироваться и войти.
     :param driver: ссылка на драйвер
     """
     btn = Navigate.get_element_navigate(driver, Navigate.click_main.BUTTON_REG_AND_LOGIN)
     Front.click_button(btn)
Esempio n. 18
0
 def check_find_full_name(self, driver, user, sleep=2):
     self.find_user_by_name(driver, user["display_name"], sleep)
     user = Navigate.get_element_navigate(driver, Navigate.check_user_contact.USER_CARD_BY_ID % user["id"])
     HelpAuthCheckMethods.click_button(user)
Esempio n. 19
0
 def click_tab_login(driver):
     """ Перейти на Вход.
     :param driver: ссылка на драйвер
     """
     btn = Navigate.get_element_navigate(driver, Navigate.click_reg.TAB_LOGIN)
     Front.click_button(btn)
Esempio n. 20
0
 def click_tab_reg(driver):
     """ Перейти на Регистрацию
     :param driver: ссылка на драйвер
     """
     btn = Navigate.get_element_navigate(driver, Navigate.click_auth.TAB_REG)
     Front.click_button(btn)
Esempio n. 21
0
 def auth_click_switch_email(driver):
     """ Перейти на авторизацию с помощью email
     :param driver: ссылка на драйвер
     """
     btn = Navigate.get_element_navigate(driver, Navigate.click_auth.SWITCH_EMAIL)
     Front.click_button(btn)
Esempio n. 22
0
 def auth_click_switch_phone(driver):
     """ Перейти на авторизацию с помощью телефона
     :param driver:  ссылка на драйвер
     """
     btn = Navigate.get_element_navigate(driver, Navigate.click_auth.SWITCH_PHONE)
     Front.click_button(btn)