示例#1
0
    def type_email(self, email):
        wait_element(self.driver, EMAIL_FIELD_SELECTOR, timeout=DEFAULT_TIMEOUT)
        email_field = self.driver.find_element_by_css_selector(EMAIL_FIELD_SELECTOR)

        email_field.clear()
        email_field.send_keys(email)
        return AuthTest(self.driver)
示例#2
0
    def open_appointments_page(self):

        wait_element(self.driver, DOCTOR_INFO_BUTTON_SELECTOR, DEFAULT_TIMEOUT)
        button = self.driver.find_element_by_css_selector(
            DOCTOR_INFO_BUTTON_SELECTOR)
        button.click()
        wait_url_changed(self.driver, PAGE_URL, 10)
示例#3
0
    def type_password(self, password):
        wait_element(self.driver, PASSWORD_FIELD_SELECTOR, timeout=DEFAULT_TIMEOUT)
        password_field = self.driver.find_element_by_css_selector(PASSWORD_FIELD_SELECTOR)

        password_field.clear()
        password_field.send_keys(password)
        return AuthTest(self.driver)
示例#4
0
文件: bot.py 项目: vanyaadev/wow-bot
 def change_field(text):
     wait_element(self.driver, '//span[@class="editable-clear-x"]', timeout=2)
     click(self.driver, self.driver.find_element_by_class_name('editable-clear-x'))
     random_sleep()
     self.driver.find_element_by_class_name('input-large').send_keys(str(text))
     click(self.driver, self.driver.find_element_by_xpath("//button[@class='btn btn--green editable-submit']"))
     random_sleep(delay=0.5)
示例#5
0
 def open_user_cabinet(self) -> object:
     dropdown = self.driver.find_element_by_css_selector(USER_MENU_DROP_DOWN_SELECTOR)
     dropdown.click()
     wait_element(self.driver, OPEN_CABINET_MENU_ITEM_SELECTOR, DEFAULT_TIMEOUT)
     menu_item = self.driver.find_element_by_css_selector(OPEN_CABINET_MENU_ITEM_SELECTOR)
     menu_item.click()
     return UserCabinetTest(self.driver)
示例#6
0
    def validate_doctors_name(self, name: str):
        wait_element(self.driver, DOCTOR_TITLE_SELECTOR, DEFAULT_TIMEOUT)
        doctor_names = self.driver.find_elements_by_css_selector(
            DOCTOR_TITLE_SELECTOR)
        for title in doctor_names:
            if name not in title.text.lower():
                return False

        return True
示例#7
0
    def extract_citations(self, div_article) -> dict:
        """提取某文章的引用格式
        """
        # 打开引用表格
        btn_citation = div_article.find_element_by_xpath(
            './div/a[@class="gs_or_cit gs_nph"]')
        btn_citation.click()

        # 检索引用表格
        tab_citation = wait_element(self, '//div[@id="gs_citt"]')
        citations = tab_citation.text.split('\n')
        citations = dict(zip(citations[0::1], citations[1::1]))

        # 关闭引用表格
        btn_close = wait_element(self, '//a[@id="gs_cit-x"]')
        btn_close.click()

        return citations
示例#8
0
 def is_login_success(self):
     return wait_for_element_disappeared(self.driver, LOGIN_BUTTON_SELECTOR,
                                         timeout=DEFAULT_TIMEOUT) and \
            wait_element(self.driver, USER_MENU_BTN_SELECTOR, timeout=DEFAULT_TIMEOUT)
示例#9
0
 def _get_form_errors(self):
     wait_element(self.driver, ERROR_SELECTOR, timeout=DEFAULT_TIMEOUT)
     form_errors_elements = self.driver.find_elements_by_css_selector(ERROR_SELECTOR)
     return [x.text for x in form_errors_elements]
示例#10
0
文件: bot.py 项目: vanyaadev/wow-bot
    def change_order(self, order: Order):
        logging.info(f'[{dt.datetime.now().isoformat()}] Changing order #{order.listing_number}')

        if order.region.lower() == 'eu':
            self.driver.get('https://www.g2g.com/sell/manage?service=1&game=2522&type=0')
        else:
            self.driver.get('https://www.g2g.com/sell/manage?service=1&game=2299')

        try:
            tr = self.driver.find_element_by_id(f'c2c_{order.listing_number}')
        except:
            logging.info(f'[{dt.datetime.now().isoformat()}] Order #{order.listing_number} not changed! Reason: not found')
            return

        def change_field(text):
            wait_element(self.driver, '//span[@class="editable-clear-x"]', timeout=2)
            click(self.driver, self.driver.find_element_by_class_name('editable-clear-x'))
            random_sleep()
            self.driver.find_element_by_class_name('input-large').send_keys(str(text))
            click(self.driver, self.driver.find_element_by_xpath("//button[@class='btn btn--green editable-submit']"))
            random_sleep(delay=0.5)

        try:
            class_name = ['g2g_actual_quantity', 'g2g_minimum_quantity', 'g2g_products_price']
            value = [str(order.stock), str(order.min_unit_per_order), str(order.price)]

            for i in range(len(class_name)):
                wait_element(self.driver, f'//a[contains(@class, "{class_name[i]}")]', timeout=2)
                field_to_write = tr.find_element_by_class_name(class_name[i])
                if field_to_write.text.strip() != value[i]:
                    click(self.driver, field_to_write)
                    random_sleep(delay=0.1)
                    change_field(value[i])

                    field_name = class_name[i][4:]
                    logging.info(
                        f'[{dt.datetime.now().isoformat()}] ' +
                        f'Order #{order.listing_number} Field "{field_name}" changed to {value[i]}')

            # CHANGE ONLINE / OFFLINE HOURS

            selection_classes = ['g2g_online_hr', 'g2g_offline_hr']
            selection_values = [str(order.online_hrs), str(order.offline_hrs)]

            for i in range(len(selection_classes)):
                wait_element(self.driver, f'//a[contains(@class, "{class_name[i]}")]', timeout=2)
                field_to_write = tr.find_element_by_class_name(selection_classes[i])
                if field_to_write.text.strip() != selection_values[i]:
                    click(self.driver, field_to_write)
                    random_sleep(delay=0.1)

                    selection = Select(self.driver.find_element_by_class_name('input-large'))
                    selection.select_by_visible_text(selection_values[i])
                    click(self.driver, self.driver.find_element_by_xpath("//button[@class='btn btn--green editable-submit']"))
                    random_sleep(delay=0.5)

                    field_name = selection_classes[i][4:]
                    logging.info(
                        f'[{dt.datetime.now().isoformat()}] ' +
                        f'Order #{order.listing_number} Field "{field_name}" changed to {selection_values[i]}')

        except:
            logging.info(f'[{dt.datetime.now().isoformat()}] Order #{order.listing_number} not changed! Error: ' +
                         str(sys.exc_info()[0]))
            return

        time.sleep(1)
        logging.info(f'[{dt.datetime.now().isoformat()}] Order #{order.listing_number} successfully changed')
示例#11
0
 def are_doctors_found(self) -> bool:
     wait_element(self.driver, DOCTOR_CARD_SELECTOR, DEFAULT_TIMEOUT)
     doctor_cards = self.driver.find_elements_by_css_selector(
         DOCTOR_CARD_SELECTOR)
     return len(doctor_cards) > 0
示例#12
0
 def check_if_appointment_success(self):
     return wait_element(self.driver, SUCCESS_MESSAGE_SELECTOR, DEFAULT_ELEMENT_TIMEOUT)
示例#13
0
 def open_login_popup(self):
     wait_element(self.driver, LOGIN_BUTTON_SELECTOR, timeout=DEFAULT_TIMEOUT)
     button_click(self.driver, LOGIN_BUTTON_SELECTOR, DEFAULT_TIMEOUT)
     return AuthTest(self.driver)
示例#14
0
 def is_free_slot_chosen(self) -> bool:
     return wait_element(self.driver, MAKE_APPOINTMENT_BUTTON_SELECTOR, DEFAULT_ELEMENT_TIMEOUT)
示例#15
0
 def choose_free_timeslot(self) -> object:
     wait_element(self.driver, FREE_SLOT_BUTTON_SELECTOR, DEFAULT_ELEMENT_TIMEOUT)
     free_slot = self.driver.find_element_by_css_selector(FREE_SLOT_BUTTON_SELECTOR)
     # click radio button
     self.driver.execute_script("arguments[0].click();", free_slot)
     return AppointmentTest(self.driver)
示例#16
0
 def has_appointments(self):
     wait_element(self.driver, APPOINTMENT_ITEM_SELECTOR, DEFAULT_TIMEOUT)
     appointments = self.driver.find_elements_by_css_selector(APPOINTMENT_ITEM_SELECTOR)
     return len(appointments) > 0
示例#17
0
文件: bot.py 项目: vanyaadev/wow-bot
    def add_order(self, order: Order, price: float):
        logging.info(f'[{dt.datetime.now().isoformat()}] Add order: [{order}] with price {price}')

        self.driver.get('https://www.g2g.com/sell/index')

        try:
            trade_selection = Select(self.driver.find_element_by_xpath('//select[@id="service"]'))
            trade_selection.select_by_value('1')

            wait_element(self.driver, '//select[@id="game"]')
            random_sleep(delay=0.3)

            game_selection = Select(self.driver.find_element_by_xpath('//select[@id="game"]'))
            game_selection.select_by_visible_text(
                f'World Of Warcraft ({order.region.upper()})'
            )

            wait_element(self.driver, "//h3[contains(text(), 'Product Details')]")
            random_sleep(delay=0.3)
            # ------------------------------------------------------------------------------------------

            server_selection = Select(self.driver.find_element_by_xpath("//select[@id='server']"))
            server_selection.select_by_visible_text(order.server)
            random_sleep()

            faction_selection = Select(self.driver.find_element_by_xpath("//select[@id='faction']"))
            faction_selection.select_by_visible_text(order.faction)
            random_sleep()

            self.driver.find_element_by_id('C2cProductsListing_products_description').send_keys(order.description)

            currency_selection = Select(self.driver.find_element_by_xpath(
                "//select[contains(@id, 'products_base_currency')]"))
            currency_selection.select_by_value(order.currency.upper())
            random_sleep()

            self.driver.find_element_by_xpath("//input[@id='C2cProductsListing_products_price']") \
                .send_keys(str(price))
            random_sleep()

            self.driver.find_element_by_xpath("//input[@id='C2cProductsListing_forecast_quantity']") \
                .send_keys(str(order.stock))
            random_sleep()

            self.driver.find_element_by_xpath("//input[@id='C2cProductsListing_minimum_quantity']") \
                .send_keys(str(order.min_unit_per_order))
            random_sleep()

            delivery_widget = self.driver.find_element_by_class_name('create__action-delivery')
            for span in delivery_widget.find_elements_by_class_name('create__action-duration'):
                if span.text.lower() in order.delivery_option.lower():
                    click(self.driver, span.find_element_by_tag_name('input'))
                    random_sleep(delay=-0.05)

            online_hrs_selection = Select(self.driver.find_element_by_xpath(
                "//select[@id='C2cProductsListing_online_hr']"
            ))
            online_hrs_selection.select_by_value(str(order.online_hrs))
            random_sleep()

            offline_hrs_selection = Select(self.driver.find_element_by_xpath(
                "//select[@id='C2cProductsListing_offline_hr']"
            ))
            offline_hrs_selection.select_by_value(str(order.offline_hrs))
            random_sleep()

            click(self.driver, self.driver.find_element_by_xpath("//button[contains(text(), 'Submit')]"))

        except Exception as e:
            logging.info(f'[{dt.datetime.now().isoformat()}] Error adding order: ' + str(e))
示例#18
0
文件: bot.py 项目: vanyaadev/wow-bot
    def parse_messages(self):
        logging.info(f'[{dt.datetime.now().isoformat()}] Parse messages started')

        self.driver.get('https://chat.g2g.com/')
        time.sleep(1)
        wait_element(self.driver, "//input[@placeholder='Search']", timeout=30)

        usernames = list(map(lambda _div: _div.text.strip(),
                             self.driver.find_elements_by_class_name('e0e0377cd4a6e9dcec5b509beb659b00')))

        # FIRST PARSING
        if self.chat_messages == dict():
            usernames = iter(usernames)
            for div in self.driver.find_elements_by_class_name('_4f2b5b47720b4ebd54a6176cbe380a22'):
                self.chat_messages[next(usernames)] = [div.text.strip()]

            return

        try:
            for chat_number in range(3):
                try:
                    username = usernames[chat_number]
                    if username not in self.chat_messages:
                        self.chat_messages[username] = ['']

                    click(self.driver,
                          self.driver.find_elements_by_class_name('ff2c5f905d92eebf09f923b4a8bd3870')[chat_number])

                    try:
                        wait_element(self.driver, "//div[@message-id]", timeout=20)
                    except TimeoutError:  # No messages
                        continue
                    time.sleep(2)

                    new_messages = list(map(lambda span: span.text.strip(),
                                            self.driver.find_elements_by_xpath("//div[@message-id]")))

                    if new_messages[-1].split('\n')[0] == self.chat_messages[username][-1].split('\n')[0]:
                        continue

                    new_messages_start_index = len(new_messages) - 1

                    while new_messages_start_index > 0:
                        if new_messages[new_messages_start_index].split('\n')[0] == \
                                self.chat_messages[username][-1].splt('\n')[0]:
                            break
                        new_messages_start_index -= 1
                    new_messages = new_messages[new_messages_start_index:]

                    msg_to_send = username + '\n' + '\n\n'.join([
                        '\n'.join(nm.split('\n')[::-1]) for nm in new_messages
                    ])

                    self.chat_messages[username].extend(new_messages)

                    self.telegram_bot.send_msg(msg_to_send)

                except Exception as e:
                    logging.info(f'[{dt.datetime.now().isoformat()}] Error parsing chat '
                                 + usernames[chat_number] + ': ' + str(e))
        except Exception as e:
            logging.info(f'[{dt.datetime.now().isoformat()}] Error parsing chats: ' + str(e))