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)
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)
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)
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)
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)
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
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
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)
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]
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')
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
def check_if_appointment_success(self): return wait_element(self.driver, SUCCESS_MESSAGE_SELECTOR, DEFAULT_ELEMENT_TIMEOUT)
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)
def is_free_slot_chosen(self) -> bool: return wait_element(self.driver, MAKE_APPOINTMENT_BUTTON_SELECTOR, DEFAULT_ELEMENT_TIMEOUT)
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)
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
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))
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))