# -*- coding: utf-8 -*-
import json
from datetime import datetime
from django.utils.html import strip_tags
from selenium.webdriver import Remote
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import (NoSuchElementException,
ElementNotVisibleException)
from helpers import is_elem_exists
[документация]def find_win_obj(context, win_obj):
eval_el = context.browser.execute_script(
'return window.GeneralEvalElement;'
)
if not eval_el or win_obj not in eval_el:
eval_el = context.browser.execute_script("""
return ui.find_popup_win();
""")
assert eval_el, "Don't find window with title {0}".format(win_obj)
if not isinstance(eval_el, dict):
eval_el = json.loads(eval_el)
eval_el = dict(
(key.replace('"', '"'), eval_el[key]) for key in eval_el
)
return eval_el
[документация]def get_win_object(context, win_obj):
eval_el = find_win_obj(context, win_obj)
if eval_el[win_obj]['id'] in context.win_objects:
return context.win_objects[eval_el[win_obj]['id']]
else:
win = Window(eval_el[win_obj]['id'], win_obj, context.browser)
context.win_objects[win.win_id] = win
return win
[документация]class FieldNotFound(KeyError):
"""
Исключение возникает в случае если поле не найдено в окне.
"""
pass
[документация]class GridNotFound(Exception):
"""
Исключение возникает в случае если грид не найден в окне.
"""
pass
[документация]class Desktop(object):
"""
Класс для работы с элементами рабочего стола.
:type driver: Remote
:type icons: dict
"""
def __init__(self, driver):
self.driver = driver
icons = self.driver.find_elements_by_xpath(
"//table[@id='x-shortcuts']//td"
"//div[@class='desktop-item-shortcut-label']")
self.icons = {}
for icon in icons:
self.icons[icon.text] = icon
[документация] def select_school(self):
self.driver.execute_script('selectSchool();')
[документация] def reset_school(self):
self.driver.execute_script('resetSchool();')
[документация] def select_period(self):
self.driver.execute_script('selectPeriod();')
[документация] def click_by_icon(self, icon_name):
"""
Клик по иконке рабочего стола.
"""
if icon_name in self.icons:
self.icons[icon_name].click()
[документация] def is_icon_exists(self, icon_name):
"""
Проверка сущ. иконки на на рабочем столе
:rtype bool
"""
if icon_name in self.icons:
return True
else:
return False
[документация]class Window(object):
"""
Класс для работы с extjs window. Реализует методы работы с окном и
доступа к элементам окна (поля, кнопки, гриды и т.д.).
:type driver: Remote
:type win_obj: WebElement
"""
text = ''
def __init__(self, win_id, title, driver):
assert isinstance(driver, Remote)
self.win_id = win_id
self.title = title
self.driver = driver
self.webdriverwait = WebDriverWait(self.driver, 40)
self.win_obj = self.driver.find_element_by_id(win_id)
# Словарь вида {field_label: field_id}
self.fields_init_data = {}
# Словарь вида {field_label: FieldObj}
self.init_fields = {}
self.grids = {}
self.button_init_data = {}
self.init_buttons = {}
self.htmleditors = {}
self.__init_win_fields()
self.__init_win_buttons()
def __init_win_fields(self):
"""
Метод инициализирует данные о текстовых полях (input type='text').
В словарь fields_init_data сохраняется id поля и флаг указывающий
является ли поле Date, ключем является название поля (label).
В данном методе не создается объект Field т.к. у окна может быть
несколько вкладок и если поле находится на еще не открытой вкладке
то оно не доступно для webdriver.
"""
labels = self.driver.execute_script(u"""
return win_helpers.get_win_labels('{0}')
""".format(self.win_id))
for f in labels:
if f['label'] not in self.fields_init_data:
self.fields_init_data[f['label']] = {
'id': f['id'],
'is_date': f['is_date']
}
else:
count = 0
for fid in self.fields_init_data:
if f['label'] in fid:
count += 1
f['label'] += '-' + str(count)
self.fields_init_data[f['label']] = {
'id': f['id'],
'is_date': f['is_date']
}
def __init_win_grids(self):
self.grids = {k: v for k, v in self.grids.iteritems()
if is_elem_exists(self.driver, v.grid_id)}
grids = self.driver.find_elements_by_xpath(
u"//div[@id='{0}']"
u"//div[contains(@class, 'x-grid-panel')]".format(self.win_id)
)
for g in grids:
if g.get_attribute('id') not in self.grids and \
'comp' not in g.get_attribute('id'):
parent_panel = self.driver.execute_script(u"""
return grid_helper.get_grid_parent_panel('{0}')
""".format(g.get_attribute('id')))
if parent_panel == u'Показатели физической подготовленности':
grid = GridPhysIndicator(g.get_attribute('id'),
self.driver)
elif parent_panel == u'Журнал':
grid = GridJournal(g.get_attribute('id'), self.driver)
else:
grid = Grid(g.get_attribute('id'), self.driver)
self.grids[grid.grid_id] = grid
def __init_field(self, field_label):
try:
if self.fields_init_data[field_label]['is_date']:
field = DateField(
self.fields_init_data[field_label]['id'],
self.driver,
field_label)
else:
field = Field(
self.fields_init_data[field_label]['id'],
self.driver,
field_label)
self.init_fields[field_label] = field
except KeyError:
raise FieldNotFound(
u'Поле "{0}" в окне "{1}" не найдено.'.format(
field_label, self.title))
def __init_win_buttons(self):
self.button_init_data = self.driver.execute_script(u"""
return win_helpers.get_win_buttons('{0}')
""".format(self.win_id))
[документация] def is_open(self):
return self.driver.execute_script(u"""
return win_helpers.is_open('{0}')
""".format(self.win_id))
[документация] def is_close(self):
return self.webdriverwait.until(
lambda driver: driver.execute_script(u"""
return win_helpers.is_close('{0}');
""".format(self.win_id))
)
[документация] def close(self):
self.driver.execute_script(u"""
Ext.getCmp('{0}').close()
""".format(self.win_id))
[документация] def get_field_by_name(self, field_label):
"""
Возвращает объект типа Field по его названию
:rtype Field
"""
if field_label in self.init_fields:
return self.init_fields[field_label]
else:
self.__init_field(field_label)
return self.init_fields[field_label]
[документация] def get_fieldset_by_name(self, fieldset_name):
"""
Возвращает объект типа Fieldset по его названию
:rtype Fieldset
"""
fieldset_list = self.driver.find_elements_by_xpath(
"//div[@id='{0}']//fieldset".format(self.win_id)
)
fieldset = None
for fs in fieldset_list:
span = fs.find_element_by_tag_name('span')
if span.text == fieldset_name:
fieldset = Fieldset(
fieldset_name,
fs.get_attribute('id'),
self.driver
)
break
return fieldset
[документация] def get_grid_by_column_header(self, column_header):
"""
Поиск грида по заголовку столбца
:rtype Grid
"""
self.__init_win_grids()
for gid, gobj in self.grids.iteritems():
if column_header in gobj.columns:
return gobj
else:
raise GridNotFound(
u'Грид со столбцом "{0}" в окне "{1}" не найден'.format(
column_header, self.title
))
[документация] def get_grid_by_column_list(self, columns_list):
"""
Поиск грида по списку всех его столбцов, полезно если на в одном окне
на одной панели есть гриды с одинаковым столбцом(-ами).
column_list строка содержащая список столбцов через запятую
:rtype Grid
"""
columns_list = columns_list.replace(', ', ',').split(',')
self.__init_win_grids()
for gid, gobj in self.grids.iteritems():
if set(columns_list) == set(gobj.columns):
return gobj
else:
raise GridNotFound(
u'Грид со столбцами "{0}" в окне "{1}" не найден'.format(
columns_list, self.title
))
[документация] def get_grid_by_parent_panel_and_column_header(self, panel_name,
column_header):
"""
Поиск грида на определенной панели по заголовку столбца
:rtype Grid
"""
self.__init_win_grids()
grids = []
for gid, gobj in self.grids.iteritems():
if panel_name == gobj.get_grid_parent_panel():
grids.append(gobj)
for g in grids:
if column_header in g.columns:
return g
else:
raise GridNotFound(
u'Грид со столбцом "{0}" в окне "{1}" на вкладке {2}'
u' не найден'.format(
column_header, self.title, panel_name
))
[документация] def get_grid_by_title(self, grid_title):
"""
Получение объекта типа Grid по его заголовку
:param grid_title: Заголовок грида
:return: Объект типа Grid в случае если сущ. грид с таким заголовком,
иначе будет вызвано исключение GridNotFound
:rtype Grid
"""
self.__init_win_grids()
for gid, gobj in self.grids.iteritems():
if gobj.title == grid_title:
return gobj
else:
raise GridNotFound(u'Грид с заголовком "{0}" не найден'.format(
grid_title))
[документация] def get_tab_by_name(self, tab_name):
return self.driver.execute_script(u"""
return win_helpers.get_tab_by_name('{0}', '{1}')
""".format(self.win_id, tab_name))
[документация] def open_tab(self, tab_name):
return self.driver.execute_script(u"""
Ext.getCmp('{0}').show()
""".format(self.get_tab_by_name(tab_name)))
[документация] def is_tab_open(self, tab_name):
return self.driver.execute_script(u"""
return win_helpers.is_tab_visible('{0}', '{1}')
""".format(self.win_id, tab_name))
[документация] def get_htmleditor(self, htmleditor_name):
"""
:param htmleditor_name: это значение атрибута name у textarea
html редактора
:return: Объект HtmlEditor
:rtype HtmlEditor
"""
if htmleditor_name in self.htmleditors:
return self.htmleditors[htmleditor_name]
else:
htmleditors = self.driver.execute_script(u"""
return win_helpers.get_win_htmleditors('{0}')
""".format(self.win_id))
for h in htmleditors:
if htmleditor_name in h:
editor = HtmlEditor(htmleditor_name,
htmleditors[htmleditor_name],
self.driver)
self.htmleditors[htmleditor_name] = \
editor
return editor
[документация] def get_text(self):
"""
:return: Возвращает текст находящийся на окне
"""
if not self.text:
text = self.driver.execute_script(u"""
return win_helpers.get_text('{0}')
""".format(self.win_id))
self.text = text if text else self.win_obj.text
return self.text
[документация]class Field(object):
"""
Класс для работы с extjs field
:type driver: Remote
:type field_object: WebElement
:type wait: WebDriverWait
"""
def __init__(self, field_id, driver, field_label=None):
self.field_id = field_id
self.label = field_label
self.driver = driver
self.wait = WebDriverWait(self.driver, 10)
self.field_object = self.driver.find_element_by_id(field_id)
def __wait_ajax_combo_list(self):
"""
Ожидание появления выпадающего списка загружаемого ajax'ом.
"""
list_id = self.driver.execute_script(u"""
var f = Ext.getCmp('{0}');
return f.list.dom.id;
""".format(self.field_id)
)
self.wait.until(
lambda d: d.find_elements_by_xpath(
"//div[@id='{0}' and contains(@style, 'visibility: visible')]"
"//div[contains(@class, 'x-combo-list-item')]".format(list_id)
)
)
[документация] def get_value(self):
return (self.driver.execute_script(u"""
return field_helper.get_value('{0}')
""".format(self.field_id))).rstrip()
[документация] def set_value(self, value):
self.field_object.click()
self.field_object.clear()
self.field_object.send_keys(value)
self.field_object.send_keys(Keys.ENTER)
[документация] def is_valid(self):
return self.driver.execute_script(u"""
return field_helper.is_valid('{0}')
""".format(self.field_id))
[документация] def is_visible(self):
return self.driver.execute_script(u"""
return field_helper.is_visible('{0}')
""".format(self.field_id))
[документация] def is_edited(self):
return self.driver.execute_script(u"""
return field_helper.is_edited('{0}')
""".format(self.field_id))
[документация] def is_checked(self):
return self.field_object.get_attribute('checked')
[документация] def is_read_only(self):
return bool(self.field_object.get_attribute('readonly') or
self.field_object.get_attribute('disabled'))
[документация] def is_disabled(self):
return bool(self.field_object.get_attribute('disabled'))
[документация] def attache_file(self, file_path):
upload_field_name = self.driver.execute_script(u"""
return field_helper.get_upload_field_name('{0}')
""".format(self.field_id))
if upload_field_name:
upload_field = self.driver.find_element_by_name(upload_field_name)
upload_field.send_keys(file_path)
[документация] def get_trigger_by_type(self, trigger_name):
"""
:param trigger_name: Название триггера из словаря triggers.
:return: html id триггера
"""
triggers = {
u'очистить поле': 0,
u'выпадающего списка': 1,
u'вызова справочника': 2,
}
return self.driver.execute_script(u"""
return field_helper.get_trigger_by_type('{0}', '{1}')
""".format(self.field_id, triggers[trigger_name]))
[документация] def click_by_trigger(self, trigger_name):
trigger_id = self.get_trigger_by_type(trigger_name)
(self.driver.find_element_by_id(trigger_id)).click()
[документация] def get_list_items(self):
"""
Возвращает словарь вида {list_item_id:list_item_value} c содержимым
выпадающего списка. Предварительно дожидается открытие списка.
"""
self.wait.until(
lambda d: d.execute_script(u"""
var f = Ext.getCmp('{0}');
var l = document.getElementById(f.list.id);
return l.style['visibility'] == 'visible';
""".format(self.field_id))
)
return self.driver.execute_script(u"""
return field_helper.get_list_items('{0}')
""".format(self.field_id))
[документация] def get_fias_list_items(self):
"""
Возвращает словарь вида {list_item_id:list_item_value} c содержимым
выпадающего списка, где значения грузятся из ФИАС.
Предварительно дожидается открытие списка.
"""
self.__wait_ajax_combo_list()
return self.driver.execute_script(u"""
return field_helper.get_fias_list_items('{0}', '{1}')
""".format(self.field_id, self.label))
[документация] def select_combobox_item(self, value):
self.__wait_ajax_combo_list()
combo_id = self.driver.execute_script(u"""
return Ext.getCmp('{0}').innerList.dom.id;
""".format(self.field_id))
items = self.driver.find_elements_by_xpath(
"//div[@id='{0}']/div".format(combo_id)
)
search_item = None
for item in items:
if item.text.strip() == value.strip():
search_item = item
break
assert search_item, u'Not found value %s in %s' % (value, self.label)
search_item.click()
[документация]class DateField(Field):
"""
Класс для работы с полями типа m3-date.
"""
[документация] def open_data_picker(self):
self.driver.find_element_by_xpath(u"""
//input[@id='{f_id}']
/..//img[contains(@class, 'x-form-date-trigger')]
""".format(f_id=self.field_id)).click()
[документация] def is_data_picker_open(self):
return self.driver.execute_script(u"""
return Ext.getCmp('{0}').menu.picker.isVisible();
""".format(self.field_id))
[документация] def min_date(self):
str_date = self.driver.execute_script(u"""
return field_helper.date_picker_min_date('{0}')
""".format(self.field_id))
return datetime.strptime(str_date, '%d.%m.%Y')
[документация] def max_date(self):
str_date = self.driver.execute_script(u"""
return field_helper.date_picker_max_date('{0}')
""".format(self.field_id))
return datetime.strptime(str_date, '%d.%m.%Y')
[документация] def set_current_date(self):
self.driver.find_element_by_xpath(u"""
//input[@id='{f_id}']
/..//img[contains(@class, 'x-form-current-date-trigger')]
""".format(f_id=self.field_id)).click()
[документация] def get_value(self):
return self.driver.execute_script(u"""
return field_helper.get_value('{0}');
""".format(self.field_id))
[документация]class Grid(object):
"""
Класс для работы с grid
:type driver: Remote
:type grid_object: WebElement
"""
def __init__(self, grid_id, driver):
self.grid_id = grid_id
self.driver = driver
self.grid_object = driver.find_element_by_id(grid_id)
self.columns = self.__get_grid_columns()
self.grid_panels = {}
self.__get_grid_panels()
self.title = self.driver.execute_script(u"""
return Ext.getCmp('{grid_id}').title
""".format(grid_id=self.grid_id)) or u''
def __get_grid_columns(self):
"""
Возвращает словарь где ключом будет заголовок столбца
а значением словарь содержащий id столбца и значение dataIndex
"""
return self.driver.execute_script(u"""
return grid_helper.get_grid_columns('{0}')
""".format(self.grid_id))
def __get_grid_panels(self):
panels = self.driver.execute_script(u"""
return grid_helper.get_grid_panels('{0}')
""".format(self.grid_id))
if panels:
for p in panels:
panel = GridPanel(panels[p], self.driver)
self.grid_panels[p] = panel
[документация] def click_by_row(self, value):
path_to_rows = """
//div[@id='{grid_id}']//div[contains(@class, 'x-grid3-row')]
""".format(grid_id=self.grid_id)
rows = self.driver.find_elements_by_xpath(path_to_rows)
for r in rows:
if value in r.text:
v = r
break
assert v, u'Not found value %s' % (value)
v.click()
[документация] def select_row_by_column_value(self, column, value):
"""
Данный метод выберет запись в гриде, при этом сохранить выделение уже
выбранных записей.
"""
row_id = self.get_row_by_column_value(column, value)['id']
self.driver.execute_script(u"""
grid_helper.select_row_by_column_value('{0}', '{1}')
""".format(self.grid_id, row_id))
[документация] def select_all_rows(self):
self.driver.execute_script(u"""
grid_helper.select_all_rows('{0}')
""".format(self.grid_id))
[документация] def clear_selection(self, column=None, row_value=None):
row_id = ''
if column and row_value:
idx = self.columns[column]['dataIndex']
row_id = [r['id'] for r in self.get_rows()
if r[idx] == row_value].pop()
self.driver.execute_script(u"""
grid_helper.clear_selection('{0}', '{1}')
""".format(self.grid_id, row_id))
[документация] def is_all_rows_selected(self):
rows = self.driver.execute_script(u"""
return grid_helper.get_selected_rows('{0}', '')
""".format(self.grid_id))
return len(rows) == len(self.get_rows())
[документация] def is_row_selected(self, column, row_value):
row_id = self.get_row_by_column_value(column, row_value)['id']
return bool(self.driver.execute_script(u"""
return grid_helper.get_selected_rows('{0}', '{1}')
""".format(self.grid_id, row_id)))
[документация] def get_rows(self):
"""
Возвращает словарь содержащий id строки, и содержимое строки
по столбцам
"""
return self.driver.execute_script(u"""
return grid_helper.get_rows('{0}')
""".format(self.grid_id))
[документация] def get_total_rows_len(self):
return self.driver.execute_script(u"""
return grid_helper.get_total_rows_len('{0}')
""".format(self.grid_id))
[документация] def get_selected_rows(self):
return self.driver.execute_script(u"""
return grid_helper.get_selected_rows('{0}')
""".format(self.grid_id))
[документация] def get_grid_parent_panel(self):
return self.driver.execute_script(u"""
return grid_helper.get_grid_parent_panel('{0}')
""".format(self.grid_id))
[документация] def click_by_row_value(self, column, value):
self.select_row_by_column_value(column, value)
xpath_to_grid_cell = """
//div[contains(@class, 'x-grid3-row-selected')]
//div[contains(@class, 'x-grid3-col-{col_id}')]
/child::node()""".format(col_id=self.columns[column]['id'])
(self.driver.find_element_by_xpath(xpath_to_grid_cell)).click()
[документация] def click_by_selected_cell(self, column_name=None):
try:
xpath_to_grid_cell = """
//td[contains(@class, 'x-grid3-cell-selected')]"""
cell = self.driver.find_element_by_xpath(xpath_to_grid_cell)
except NoSuchElementException:
col_dict = self.columns
xpath_to_grid_cell = """
//div[contains(@class, 'x-grid3-col-{0}')]
""".format(col_dict[column_name]['id'])
cell = self.driver.find_element_by_xpath(xpath_to_grid_cell)
ActionChains(self.driver).double_click(cell).perform()
[документация] def get_editor_id(self, column_name):
for column in self.columns.keys():
if column == column_name:
return self.columns[column]['editorId']
[документация] def select_cell_by_row_value(self, target_column, row_value, row_column):
row_idx = self.get_row_by_column_value(row_column, row_value)['id']
col_data_index = self.columns[target_column]['dataIndex']
if row_idx:
self.driver.execute_script(u"""
grid_helper.select_cell_by_column('{0}', '{1}', '{2}')
""".format(self.grid_id, row_idx, col_data_index))
else:
help_col_idx = self.columns[row_column]['dataIndex']
self.driver.execute_script(u"""
grid_helper.select_cell_by_row_value('{0}', '{1}',
'{2}', '{3}')
""".format(self.grid_id, row_value, col_data_index, help_col_idx))
[документация] def set_value_in_active_cell(self, column, value):
cell = self.grid_object.find_element_by_id(
self.columns[column]['editorId']
)
cell.clear()
cell.send_keys(value)
cell.send_keys(Keys.ENTER)
[документация] def set_value_in_cell(self, column, value, help_column, help_column_val):
row_id = self.get_row_by_column_value(
help_column,
help_column_val
)['id']
if row_id:
self.driver.execute_script(u"""
return grid_helper.set_value_in_cell(
'{0}', '{1}', '{2}', '{3}'
)
""".format(
self.grid_id, row_id, self.columns[column]['dataIndex'], value
))
[документация] def get_cell_value(self, target_column, row_value, help_column):
row = self.get_row_by_column_value(help_column, row_value)
if row:
return row[self.columns[target_column]['dataIndex']]
[документация] def get_row_by_column_value(self, column, value):
assert column in self.columns, "Column doesn't exist"
idx = self.columns[column]['dataIndex']
for r in self.get_rows():
if value in strip_tags(r[idx]):
return r
[документация] def next_page(self):
panel_id = self.grid_panels['paginator'].panel_id
self.driver.execute_script(u"""
return grid_panel_helper.scroll_page('{0}', 'next')
""".format(panel_id))
[документация] def prev_page(self):
panel_id = self.grid_panels['paginator'].panel_id
self.driver.execute_script(u"""
return grid_panel_helper.scroll_page('{0}', 'prev')
""".format(panel_id))
[документация] def is_enabled(self):
return not self.driver.execute_script(u"""
return Ext.getCmp('{0}').disabled
""".format(self.grid_id))
[документация] def get_column_data_index(self, column):
return self.columns[column]['dataIndex']
[документация] def get_column_list_items(self, column):
if column in self.columns and 'editorId' in self.columns[column]:
return self.driver.execute_script(u"""
return field_helper.get_list_items('{0}')
""".format(self.columns[column]['editorId']))
else:
return None
[документация] def select_combobox_item(self, column, value):
combo_id = self.driver.execute_script(u"""
return Ext.getCmp('{0}').innerList.dom.id;
""".format(self.columns[column]['editorId']))
items = self.driver.find_elements_by_xpath(
"//div[@id='{0}']/div".format(combo_id)
)
search_item = None
for item in items:
if item.text.strip() == value.strip():
search_item = item
break
assert search_item, u'Not found value %s in %s' % (value, column)
search_item.click()
[документация]class GridPhysIndicator(Grid):
[документация] def phys_columns(self):
"""
Возвращает словарь где ключом будет заголовок столбца
а значением словарь содержащий id столбца и значение dataIndex
"""
return self.driver.execute_script(u"""
return grid_helper.phys_columns('{0}')
""".format(self.grid_id))
[документация] def set_value_in_cell(self, value, col_name, year_period, row_value):
"""
year_period - может принимать значение:
в начале учебного года (сентябрь)
в конце учебного года (май)
"""
column_key = col_name+'-'+year_period
columns = self.phys_columns()
row_id = self.get_row_by_column_value(u'Ф.И.О.', row_value)['index']
if columns[column_key]:
self.driver.execute_script(u"""
return grid_helper.set_value_in_cell(
'{0}', '{1}', '{2}', '{3}'
)
""".format(
self.grid_id, row_id, columns[column_key]['dataIndex'], value
))
else:
return None
[документация] def get_value_from_cell(self, col_name, year_period, row_value):
"""
year_period - может принимать значение:
в начале учебного года (сентябрь)
в конце учебного года (май)
"""
column_key = col_name+'-'+year_period
columns = self.phys_columns()
row_id = self.get_row_by_column_value(u'Ф.И.О.', row_value)['index']
if columns[column_key]:
return self.driver.execute_script(u"""
return grid_helper.get_value_from_cell(
'{0}', '{1}', '{2}'
)
""".format(
self.grid_id, row_id, columns[column_key]['dataIndex']
))
else:
return None
[документация]class GridJournal(Grid):
[документация] def journal_columns(self):
return self.driver.execute_script(u"""
return grid_helper.journal_columns('{0}')
""".format(self.grid_id))
[документация] def set_value_in_cell(self, value, col_name, date, row_value, time=''):
column_key = col_name + '-' + date
if time:
column_key = column_key + '-' + time
columns = self.journal_columns()
row_id = self.get_row_by_column_value(u'Ф.И.О.', row_value)['index']
if columns[column_key]:
self.driver.execute_script(u"""
return grid_helper.set_value_in_cell(
'{0}', '{1}', '{2}', '{3}'
)
""".format(
self.grid_id, row_id, columns[column_key]['dataIndex'], value
))
else:
return None
[документация] def get_value_from_cell(self, col_name, date, row_value, time=''):
column_key = col_name + '-' + date
if time:
column_key = column_key + '-' + time
columns = self.journal_columns()
row_id = self.get_row_by_column_value(u'Ф.И.О.', row_value)['index']
if columns[column_key]:
return self.driver.execute_script(u"""
return grid_helper.get_value_from_cell(
'{0}', '{1}', '{2}'
)
""".format(
self.grid_id, row_id, columns[column_key]['dataIndex']
))
else:
return None
[документация]class GridPanel(object):
"""
Класс для работы с grid panel и кнопками расположенными на панели.
:type driver: Remote
"""
def __init__(self, panel_id, driver):
self.panel_id = panel_id
self.driver = driver
self.buttons = self.__get_buttons()
def __get_buttons(self):
return self.driver.execute_script(u"""
return grid_panel_helper.get_buttons('{0}')
""".format(self.panel_id))
[документация] def is_enabled(self):
return not self.driver.execute_script(u"""
return Ext.getCmp('{0}').disabled
""".format(self.panel_id))
[документация]class HtmlEditor(object):
def __init__(self, htmleditor_name, htmldeditor_id, driver):
self.name = htmleditor_name
self.editor_id = htmldeditor_id
self.driver = driver
self.editor_obj = self.driver.find_element_by_id(htmldeditor_id)
[документация] def set_value(self, value):
"""
Установить значение через send_keys не получается т.к. textarea
подменяется фреймом, поэтому через js.
"""
self.driver.execute_script(u"""
Ext.getCmp('{0}').setValue('{1}')
""".format(self.editor_id, value))
[документация] def get_value(self):
return self.driver.execute_script(u"""
return Ext.getCmp('{0}').getValue()
""".format(self.editor_id))
[документация]class Fieldset(object):
"""
Класс для работы с элементами управления блоков с полями
"""
def __init__(self, fieldset_name, fieldset_id, driver):
self.name = fieldset_name
self.id = fieldset_id
self.driver = driver
self.fieldset_obj = self.driver.find_element_by_id(fieldset_id)
[документация] def click(self):
btn = self.fieldset_obj.find_element_by_class_name('x-tool-toggle')
btn.click()
[документация] def is_collapsed(self):
cls = self.fieldset_obj.get_attribute('class')
if 'collapsed' in cls:
return True
else:
return False