Advertisement
Guest User

Untitled

a guest
Jul 4th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.56 KB | None | 0 0
  1. from typing import re
  2.  
  3. import selenium.common.exceptions as seleniumExceptions
  4. from selenium import webdriver
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.common.keys import Keys
  7. from selenium.webdriver.support import expected_conditions as EC
  8. from selenium.webdriver.support.ui import WebDriverWait  # available since 2.4.0
  9.  
  10.  
  11. class TMS:
  12.     def __init__(self, address):
  13.         self.driver = webdriver.Chrome()
  14.         self.driver.get(address)
  15.  
  16.     def get_web_driver(self):
  17.         return self.driver
  18.  
  19.     def close(self):
  20.         self.driver.close()
  21.  
  22.     def login(self):
  23.         login = input('Login: ')
  24.         password = input('Password: ')
  25.         self.__login__(login, password)
  26.  
  27.     def __login__(self, login, password):
  28.         login_field, pass_field = self.__get_login_fields__()
  29.         login_field.send_keys(login)
  30.         pass_field.send_keys(password)
  31.         pass_field.send_keys(Keys.ENTER)
  32.  
  33.     def __get_login_fields__(self):
  34.         form = self.driver.find_element_by_xpath("//form[1]")
  35.         username = form.find_element_by_xpath("//input[@name='login']")
  36.         password = form.find_element_by_xpath("//input[@name='password']")
  37.         return username, password
  38.  
  39.  
  40. class TMSSelector:
  41.  
  42.     def __init__(self, tms):
  43.         self.__tms__ = tms
  44.         self.__kill_popout__()
  45.         self.__init_buttons__()
  46.  
  47.     def __init_buttons__(self):
  48.         clients_button_xpath = "//button[text()='{0}']".format('Zmień klienta i aplikację')
  49.         self.__clients_button__ = self.__tms__.get_web_driver().find_element_by_xpath(clients_button_xpath)
  50.         self.__init_menu_buttons__()
  51.  
  52.     def __init_menu_buttons__(self):
  53.         self.__wait_for_menu__()
  54.         self.__side_menu__ = TMSSideMenu(self.__tms__.get_web_driver())
  55.  
  56.     def __kill_popout__(self):
  57.         popout = ClientWindow(self.get_popout_window_by_header('Klienci i Aplikacje'))
  58.         popout.cancel()
  59.  
  60.     def get_popout_window_by_header(self, header):
  61.         WebDriverWait(self.__tms__.get_web_driver(), 10).until(EC.text_to_be_present_in_element((By.CLASS_NAME, "x-window-header-text"), header))
  62.         return self.__tms__.get_web_driver().find_element_by_css_selector(".x-window.x-resizable-pinned")
  63.  
  64.     def choose_new_client(self, client):
  65.         client_window = ClientWindow(self.__open_new_client_window__())
  66.         try:
  67.             client_window.select_client(client)
  68.         except seleniumExceptions.NoSuchElementException as e:
  69.             client_window.cancel()
  70.             raise e
  71.         client_window.submit()
  72.         self.__wait_for_client_change__(client)
  73.  
  74.     def add_new_device(self, params):
  75.         device_window = DeviceWindow(self.__open_new_device_window__())
  76.         try:
  77.             device_window.fill_fields(params)
  78.         except Exception as e:
  79.             device_window.cancel()
  80.             raise e
  81.         device_window.submit()
  82.  
  83.     def __open_new_client_window__(self):
  84.         self.__clients_button__.click()
  85.         return self.get_popout_window_by_header('Klienci i Aplikacje')
  86.  
  87.     def __wait_for_client_change__(self, client):
  88.         xpath = "//div[@class='x-toolbar x-small-editor']//td/span[contains(text(), 'Klient:')]"
  89.         WebDriverWait(self.__tms__.get_web_driver(), 10).until(EC.text_to_be_present_in_element((By.XPATH, xpath), client))
  90.  
  91.     def __open_new_device_window__(self):
  92.         self.__open_new_window__('Urządzenia')
  93.         return self.get_popout_window_by_header('Urządzenie')
  94.  
  95.     def __open_new_seller_window__(self):
  96.         self.__open_new_window__('Sprzedawcy')
  97.         return self.get_popout_window_by_header('Sprzedawca')
  98.  
  99.     def __open_new_terminal_window__(self):
  100.         self.__open_new_window__('Terminale')
  101.         return self.get_popout_window_by_header('Terminale')
  102.  
  103.     def __open_new_group_window__(self):
  104.         self.__open_new_window__('Terminale', 3)
  105.         return self.get_popout_window_by_header('Grupy terminali')
  106.  
  107.     def __open_new_window__(self, menu_tab, in_list_position=1):
  108.         selection = self.__side_menu__.select(menu_tab)
  109.         self.__wait_for_menu_unfold__()
  110.         new_device = selection.find_elements_by_xpath(".//a[@class='x-tree-node-anchor']")
  111.         new_device[in_list_position].click()
  112.         return new_device[in_list_position]
  113.  
  114.     def __wait_for_menu__(self):
  115.         WebDriverWait(self.__tms__.get_web_driver(), 10).until(EC.presence_of_element_located((By.ID, 'Menu')))
  116.  
  117.     def __wait_for_menu_unfold__(self):
  118.         current_row = self.__side_menu__.get_current_row()
  119.         WebDriverWait(self.__tms__.get_web_driver(), 10).until(EC.visibility_of((current_row.find_element_by_class_name("x-tree-node-anchor"))))
  120.  
  121.  
  122. class Menu:
  123.     def select(self, field):
  124.         pass
  125.  
  126.     def selected_field(self):
  127.         pass
  128.  
  129.     class NoSuchMenuField(Exception):
  130.         def __init__(self, msg=''):
  131.             super(Menu.NoSuchMenuField, self).__init__(msg)
  132.             self.msg = msg
  133.  
  134.  
  135. class TMSSideMenu(Menu):
  136.     def __init__(self, window):
  137.         self.__init_fields__(window)
  138.         self.__selected_field__ = ''
  139.         self.__window__ = window
  140.  
  141.     def __init_fields__(self, window):
  142.         rows = window.find_elements_by_css_selector('.x-panel.x-tree')
  143.         keys = [v.find_element_by_class_name('x-panel-header-text').get_attribute('innerHTML') for v in rows]
  144.         self.__fields__ = {k: r for k, r in zip(keys, rows)}
  145.  
  146.     def selected_field(self):
  147.         return self.__selected_field__
  148.  
  149.     def select(self, field):
  150.         if field not in self.__fields__:
  151.             raise Menu.NoSuchMenuField("No field '{0}' in TMSSideMenu".format(field))
  152.         try:
  153.             self.__fields__[field].click()
  154.         except seleniumExceptions.StaleElementReferenceException:
  155.             self.__refresh__()
  156.             return self.select(field)
  157.         else:
  158.             self.__selected_field__ = field
  159.             return self.__fields__[field]
  160.  
  161.     def get_current_row(self):
  162.         return self.__fields__[self.selected_field()]
  163.  
  164.     def __refresh__(self):
  165.         self.__init_fields__(self.__window__)
  166.  
  167.  
  168. class Window:
  169.  
  170.     def __init__(self, window):
  171.         self.window = window
  172.  
  173.     def submit(self):
  174.         xpath = ".//button[text()='{0}']"
  175.         close_button = self.window.find_element_by_xpath(xpath.format('OK'))
  176.         close_button.click()
  177.  
  178.     def get_window(self):
  179.         return self.window
  180.  
  181.     def cancel(self):
  182.         xpath = ".//button[text()='{0}']"
  183.         close_button = self.window.find_element_by_xpath(xpath.format('OK'))
  184.         close_button.click()
  185.  
  186.  
  187. class ClientWindow (Window):
  188.  
  189.     def __init__(self, window):
  190.         super(ClientWindow, self).__init__(window)
  191.  
  192.     def submit(self):
  193.         xpath = ".//button[text()='{0}']"
  194.         close_button = self.window.find_element_by_xpath(xpath.format('OK'))
  195.         close_button.click()
  196.  
  197.     def cancel(self):
  198.         xpath = ".//button[text()='{0}']"
  199.         close_button = self.window.find_element_by_xpath(xpath.format('Anuluj'))
  200.         close_button.click()
  201.  
  202.     def select_client(self, client):
  203.         xpath = ".//div[@class='x-grid3-cell-inner x-grid3-col-columnId'][text()='{0}']"
  204.         client_row = self.window.find_element_by_xpath(xpath.format(client))
  205.         client_row.click()
  206.  
  207.  
  208. class NewWindow (Window):
  209.     def __init__(self, window):
  210.         super(NewWindow, self).__init__(window)
  211.  
  212.     def submit(self):
  213.         xpath = ".//button[text()='{0}']"
  214.         close_button = self.window.find_element_by_xpath(xpath.format('Zapisz'))
  215.         close_button.click()
  216.  
  217.     def cancel(self):
  218.         xpath = ".//button[text()='{0}']"
  219.         close_button = self.window.find_element_by_xpath(xpath.format('Anuluj'))
  220.         close_button.click()
  221.  
  222.  
  223. class DeviceWindow (NewWindow):
  224.     def __init__(self, window):
  225.         super(DeviceWindow, self).__init__(window)
  226.         self.__get_inputs__()
  227.  
  228.     def __get_inputs__(self):
  229.         fieldset = FieldSet(self.__get_fieldset__())
  230.         self.__fields__ = fieldset.get_inputs_dict()
  231.  
  232.     def __get_fieldset__(self):
  233.         fieldset_xpath = ".//fieldset[@class=' x-fieldset x-form-label-right']"
  234.         return self.window.find_element_by_xpath(fieldset_xpath)
  235.  
  236.     def fill_fields(self, values):
  237.         assert len(values) == len(self.__fields__)
  238.         for val, k in zip(values, self.__fields__):
  239.             self.__fields__[k].send_keys(val)
  240.  
  241.  
  242. class FieldSet:
  243.     def __init__(self, fieldset):
  244.         self.fieldset = fieldset
  245.  
  246.     def __get_div_wrappers__(self):
  247.         items_xpath = ".//div[@class='x-form-item ']"
  248.         fields = self.fieldset.find_elements_by_xpath(items_xpath)
  249.         return fields
  250.  
  251.     @staticmethod
  252.     def __get_input_fields__(wrappers):
  253.         return [FieldSet.__get_input_field__(el) for el in wrappers]
  254.  
  255.     @staticmethod
  256.     def __get_input_field__(wrapper):
  257.         pre_xpath = "./div[@class='x-form-element']/"
  258.         xpath = pre_xpath + "/input[@type='text']"
  259.         try:
  260.             input_field = wrapper.find_element_by_xpath(xpath)
  261.         except seleniumExceptions.NoSuchElementException:
  262.             xpath = pre_xpath + 'textarea'
  263.             input_field = wrapper.find_element_by_xpath(xpath)
  264.         return input_field
  265.  
  266.     @staticmethod
  267.     def __get_labels__(wrappers):
  268.         return [w.find_element_by_xpath('./label').get_attribute('innerHTML') for w in wrappers]
  269.  
  270.     def get_inputs_dict(self):
  271.         wrappers = self.__get_div_wrappers__()
  272.         inputs = self.__get_input_fields__(wrappers)
  273.         keys = self.__get_labels__(wrappers)
  274.         return {k[:-1]: f for k, f in zip(keys, inputs)}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement