# -*- coding: utf-8 -*-
u"""
Набор степов для работы с гридами.
"""
from behave import step
from selenium.webdriver.common.keys import Keys
from winobject import get_win_object
from helpers import editor_input_value
@step(u'в гриде со столбцом "{column_name}" на вкладке {panel}'
u' окна {win_name} выбрать запись {value}')
@step(u'в гриде со столбцом "{column_name}" окна {win_name}'
u' выбрать запись {value}')
@step(u'в гриде со столбцами "{columns}" окна {win_name}'
u' выбрать запись {value} по столбцу {column_name}')
[документация]def step_find_and_select_row(context, column_name, win_name,
value, panel=None, columns=None):
u"""
Выбор записи в гриде.
:param column_name: Название столбца по которому будет найден грид
:param value: Значение записи по столбцу column_name. на основе этого
значение будет найдена запись.
:param win_name: Название окна в котором расположен грид.
:param panel: Название вкладки окна на которой расположен грид
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel,
column_name)
elif columns:
grid = win.get_grid_by_column_list(columns)
else:
grid = win.get_grid_by_column_header(column_name)
grid.select_row_by_column_value(column_name, value)
@step(u'в окне "{win_name}" у столбца "{column}" в выпадающем списке'
u' выбрать запись "{record}"')
[документация]def step_select_record_in_column_combobox(context, win_name, column, record):
u"""
Выбор записи из выпадающего списка в столбце грида.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца в котором расположен выпадающий список
:param record: Запись которая будет выбрана.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
grid.select_combobox_item(column, record)
@step(u'в окне "{win_name}" у столбца "{column}" в выпадающем '
u'списке будет запись "{record}"')
[документация]def step_is_record_in_column_combobox(context, win_name, column, record):
u"""
Проверка того что record содержится в выпадающем списке столбца column.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца в котором расположен выпадающий список
:param record: Искомая запись.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
assert record in grid.get_column_list_items(column), 'Record not in list'
@step(u'в окне {win_name} у столбца {column} содержится промежуточное'
u' значение {record}')
[документация]def step_check_cell_tmp_value(context, win_name, column, record):
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
assert editor_input_value(
grid.driver, grid.columns[column]['editorId']
) == record, "Record not in column"
@step(u'в окне {win_name} на панели инструментов со столбцом {column} '
u'нажать кнопку {button_name}')
@step(u'в окне {win_name} на панели инструментов со столбцом {column} '
u'на вкладке {panel} нажать кнопку {button_name}')
@step(u'в окне {win_name} на панели инструментов грида со столбцом {column}'
u' есть кнопка "{button_name}"')
@step(u'в окне {win_name} на панели инструментов грида со столбцом {column}'
u' на вкладке {panel} есть кнопка "{button_name}"')
@step(u'в окне {win_name} на панели инструментов грида со столбцом {column}'
u' "{is_absent}" кнопка "{button_name}"')
@step(u'в гриде со столбцом {column} окна {win_name}'
u' будет {records_amount} запись')
@step(u'в гриде со столбцом {column} окна {win_name}'
u' будет {records_amount} записей')
[документация]def step_test_win_records_amount(context, column, win_name, records_amount):
u"""
Проверка того что в гриде содержится records_amount записей.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param records_amount: Ожидаемое кол-во записей.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
assert grid.get_total_rows_len() == int(records_amount)
@step(u'в гриде со столбцом {column} окна {win_obj} нет записей')
[документация]def step_is_grid_empty(context, column, win_obj):
u"""
Проверка того что в гриде со столбцом column нет ни одной записи.
:param win_obj: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(column)
assert len(grid.get_rows()) == 0, 'Grid have records'
@step(u'в окне {win_name} выбрать все записи по колонке {column}')
@step(u'в окне {win_name} на вкладке {panel} '
u'выбрать все записи по колонке {column}')
[документация]def step_select_all_rows_in_grid(context, win_name, column, panel=None):
u"""
Выбор всех записей в гриде.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
grid.select_all_rows()
@step(u'все записи грида со столбцом {column}'
u' окна "{win_name}" {status} признак выделения')
[документация]def step_is_all_row_selected(context, column, win_name, status):
u"""
Проверка того что все записи грида выбраны/не выбраны.
:param win_name: Название окна в котором расположен грид.
:param column Название столбца по которому будет найдем нужный грид.
:param status:.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
if status == u'имеют':
assert grid.is_all_rows_selected(), 'Rows not selected'
elif status == u'не имеют':
assert not grid.is_all_rows_selected(), 'Rows selected'
@step(u'запись {record} грида со столбцом {column}'
u' окна "{win_name}" {status} признак выделения')
[документация]def step_is_record_selected(context, record, column, win_name, status):
u"""
Проверка того что запись record грида выбраны/не выбраны.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param record: Искомая запись.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
if status == u'имеет':
assert grid.is_row_selected(column, record), 'Rows not selected'
elif status == u'не имеет':
assert not grid.is_row_selected(column, record), 'Rows selected'
@step(u'в гриде со столбцом "{column}" окна {win_obj} нажать кнопку {button}')
@step(u'в гриде со столбцом "{column}" на вкладке {panel}'
u' окна {win_obj} нажать кнопку {button}')
@step(u'в гриде со столбцами "{columns}" окна {win_obj}'
u' нажать кнопку {button}')
@step(u'в гриде на вкладке {panel} окна "{win_name}" {status}'
u' значение {value} по колонке {column}')
@step(u'в гриде окна "{win_name}" {status} значение {value}'
u' по колонке {column}')
@step(u'в гриде со столбцами {columns} окна "{win_name}" {status} значение'
u' {value} по колонке {column}')
@step(u'в гриде с кнопкой {button} окна "{win_obj}" {status} значение {value}')
[документация]def step_check_value_in_grid_rows(context, win_name, value, status, column='',
panel='', columns=None, button=None):
u"""
Проверка того что в столбце column содержится/не содержится значение value.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param value: Искомое значение.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
elif columns:
grid = win.get_grid_by_column_list(columns)
elif button:
grid = win.get_grid_by_button_name(button)
else:
grid = win.get_grid_by_column_header(column)
val_in_row = False
for row in grid.get_rows():
row_val = row[grid.columns[column]['dataIndex']]
if type(row_val) in (str, unicode):
if value in row_val:
val_in_row = True
break
if type(row_val) is int:
if int(value) == row_val:
val_in_row = True
break
if status == u'содержится':
assert val_in_row, u"Value not in row"
elif status == u'не содержится':
assert not val_in_row, u"Value {} in row".format(value)
@step(u'в гриде окна "{win_name}" {status} значение "{value}" в столбце'
u' "{column}" для строки с значением "{help_column}"'
u' по столбцу "{help_value}"')
[документация]def step_check_value_in_row(context, win_name, status, value, column,
help_column, help_value):
u"""
Проверка того что для заданной строки грида в столбце column
содержится/не содержится значение value.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param value: Искомое значение.
"""
win = get_win_object(context, win_name)
grid = win.get_grid_by_column_header(column)
row = grid.get_row_by_column_value(help_column, help_value)
column_index = grid.columns[column]['dataIndex']
if status == u'содержится':
assert str(row[column_index]) == value, (
u"Expected {0} but found {1}".format(value, row[column_index])
)
elif status == u'не содержится':
assert str(row[column_index]) != value, (
u"Value {0} in row but shouldn't.".format(value, row[column_index])
)
@step(u'в гриде на вкладке {panel} окна {win_name} кликнуть'
u' по ячейке с содержимым {value} по колонке {column}')
@step(u'в гриде окна {win_name} кликнуть '
u'по ячейке с содержимым {value} по колонке {column}')
[документация]def step_click_on_grid_cell(context, win_name, value, column, panel=None):
u"""
Кликнуть по ячейке со значением value.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param value: Искомое значение.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
grid.click_by_row_value(column, value)
@step(u'в гриде со столбцом "{column}" на вкладке {panel} окна {win_name}'
u' снять выделение со всех строк')
@step(u'в гриде со столбцом "{column}" окна {win_name}'
u' снять выделение со всех строк')
[документация]def step_clear_selection(context, column, win_name, panel=None):
u"""
Снять выделение со всех строк в гриде.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца по которому будет найдем нужный грид.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
grid.clear_selection()
@step(u'в гриде окна {win_name} выбрать ячейку по столбцу {target_column}'
u' в строке со значением {row_value} в столбце {help_column}')
@step(u'в гриде на вкладке {panel} окна {win_name} выбрать ячейку по столбцу'
u' {target_column} в строке со значением {row_value}'
u' в столбце {help_column}')
[документация]def step_select_grid_cell(context, win_name, target_column,
row_value, help_column, panel=None):
u"""
Выделить ячейку со значением.
:param win_name: Название окна в котором расположен грид.
:param target_column: Название столбца в котором будет выбрана ячейка
:param help_column: Название столбца для поиска грида.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel,
target_column)
else:
grid = win.get_grid_by_column_header(target_column)
grid.select_cell_by_row_value(target_column, row_value, help_column)
@step(u'в гриде на вкладке {panel} окна {win_obj} установить значение {value} '
u'в столбце {column} для строки со значением {row_value}'
u' по столбцу {help_column}')
@step(u'в гриде окна {win_obj} установить значение {value} '
u'в столбце {column} для строки со значением {row_value}'
u' по столбцу {help_column}')
[документация]def step_set_val_in_cell(context, win_obj, value, column, row_value,
help_column, panel=None):
u"""
Устанавливает значение value в столбец грида.
:param win_obj: Название окна в котором расположен грид.
:param column: Столбец в который будет установлено значение.
:param help_column: Название столбца для поиска грида.
:param row_value: Значение столбца help_column необходимое
для поиска грида.
"""
win = get_win_object(context, win_obj)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel,
column)
else:
grid = win.get_grid_by_column_header(column)
grid.set_value_in_cell(column, value, help_column, row_value)
@step(u'в гриде на вкладке {panel} окна {win_obj}'
u' в столбце {column} для строки со значением {row_value}'
u' по столбцу {help_column} содержится значение {value}')
@step(u'в гриде окна {win_obj} в столбце {column} для строки'
u' со значением {row_value} по столбцу {help_column}'
u' содержится значение {value}')
[документация]def step_check_cell_value(context, win_obj, value, column, row_value,
help_column, panel=None):
u"""
Проверяет что в столбце грида установлено значение value
:param win_obj: Название окна в котором расположен грид.
:param column: Столбец в который будет установлено значение.
:param help_column: Название столбца для поиска грида.
:param row_value: Значение столбца help_column необходимое
для поиска грида.
"""
win = get_win_object(context, win_obj)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel,
column)
else:
grid = win.get_grid_by_column_header(column)
actual_value = grid.get_cell_value(column, row_value, help_column)
if type(actual_value) in (int, float):
actual_value = str(actual_value)
assert actual_value == value, (
"Valued don't match. Expected {0} but found {1}".format(
value, actual_value
)
)
@step(u'в гриде со столбцом {column} окна'
u' {win_name} кликнуть по выделенной ячейке')
@step(u'в гриде со столбцом {column} окна'
u' {win_name} кликнуть по выделенной ячейке в колонке {help_column}')
@step(u'в гриде со столбцом {column} на вкладке {panel} окна'
u' {win_name} кликнуть по выделенной ячейке')
[документация]def step_click_by_selected_cell(context, column, win_name,
panel=None, help_column=None):
u"""
Кликнуть по выделенной ячейке.
:param win_name: Название окна в котором расположен грид.
:param column: Название столбца для поиска грида.
:param panel: Название вкладки окна на которой расположен грид.
"""
win = get_win_object(context, win_name)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
if help_column:
grid.click_by_selected_cell(help_column)
editor_id = grid.get_editor_id(help_column)
context.win_objects['editor_id'] = editor_id
assert editor_id
else:
grid.click_by_selected_cell()
@step(u'ячейка по столбцу {target_column} в гриде со строкой {row_value}'
u' в столбце {help_column} окна {win_obj} доступна для редактирования')
[документация]def step_cell_is_editable(context, target_column, row_value,
help_column, win_obj):
U"""
Проверка того что ячейка грдида доступна для редактирования
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(target_column)
grid.set_value_in_active_cell(target_column, '42')
assert grid.get_cell_value(target_column, row_value, help_column) == '42'
@step(u'панель грида со столбцом "{column}" на вкладке "{panel}"'
u' окна "{win_obj}" {status}')
@step(u'в окне "{win_obj}" панель грида со столбцом "{column}" {status}')
def step_check_grid_panel(context, column, win_obj, status, panel=''):
u"""
Проверка активна ли панель инструментов грида.
"""
win = get_win_object(context, win_obj)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
panel = grid.grid_panels['control']
if status == u'активна':
assert panel.is_enabled(), 'Panel is not enabled'
elif status == u'неактива':
assert not panel.is_enabled(), 'Panel not enabled'
@step(u'в окне "{win_obj}" кнопка {button} на панели грида со столбцом'
u' "{column}" {status}')
@step(u'в окне "{win_obj}" грид со столбцом "{column}" {status}')
[документация]def step_check_grid_panel(context, column, win_obj, status, panel=''):
u"""
Проверка активен ли грид.
"""
win = get_win_object(context, win_obj)
if panel:
grid = win.get_grid_by_parent_panel_and_column_header(panel, column)
else:
grid = win.get_grid_by_column_header(column)
if status == u'активен':
assert grid.is_enabled(), 'Panel is not enabled'
elif status == u'неактивен':
assert not grid.is_enabled(), 'Panel not enabled'
@step(u'в гриде со столбцом {column} окна {win_obj} нажать'
u' {page_direction} страница')
[документация]def step_grid_page_scroll(context, column, win_obj, page_direction):
u"""
Переключение страниц в гриде.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(column)
if page_direction == u'следующая':
grid.next_page()
elif page_direction == u'предыдущая':
grid.prev_page()
@step(u'у всех записей грида окна {win_obj} по колонке'
u' {column} стоит значение {value}')
[документация]def step_check_column_val_for_all_rows(context, win_obj, column, value):
u"""
Проверка того, что у всех записей грида в столбце column стоит значение
value.
:param win_obj: Название окна в котором расположен грид.
:param column: Название столбца для поиска грида.
:param value: Проверяемое значение.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(column)
col_idx = grid.columns[column]['dataIndex']
value_in_all_rows = True
for r in grid.get_rows():
if value not in r[col_idx]:
value_in_all_rows = False
assert value_in_all_rows, 'Value not in all rows'
@step(u'в гриде окна {win_obj} со столбцом {help_column} "{status}"'
u' {target_column}')
[документация]def step_check_column_in_grid(context, win_obj, help_column, status,
target_column):
u"""
Проверка того, что гриде есть/нет столбец target_column.
:param win_obj: Название окна в котором расположен грид.
:param help_column: Вспомогательный столбце для поиска грида.
:param target_column: Проверяемый столбец.
:param status: Одна из фраз (есть столбец, нет столбца) указывающих
тип проверки.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(help_column)
if status == u'есть столбец':
assert target_column in grid.columns, 'Column not exist'
elif status == u'нет столбца':
assert target_column not in grid.columns, 'Column exist'
@step(u'в гриде окна {win_obj} в строке со значением {value}'
u' по колонке {column} кликнуть по чекбоксу')
[документация]def step_click_grid_checbox(context, win_obj, value, column):
u"""
Включает/выключает чекбокс расположенные в столбце column.
:param win_obj: Название окна в котором расположен грид.
:param column: Вспомогательный столбце для поиска грида.
:param value: Значение для поиска необходимой строки.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(column)
context.browser.execute_script(u"""
var grid = Ext.getCmp('{0}');
var el_id = grid.store.find('name', '{1}');
var rec = grid.store.getAt(el_id);
rec.set('active', 'true')
""".format(grid.grid_id, value))
@step(u'в таблице окна {win_obj} останутся записи со сменой "{value}"')
[документация]def step_find_filtered_values(context, win_obj, value):
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(u'Урок')
rows = grid.get_rows()
another_record = False
for row in rows:
if value not in row['weekday']:
another_record = True
assert not another_record
@step(u'в гриде со столбцом {column} окна {win_obj}'
u' кликнуть по строке с значение {row_value}')
[документация]def step_click_by_grid_row(context, column, win_obj, row_value):
u"""
Клик по строке с значением row_value.
:param win_obj: Название окна в котором расположен грид.
:param column: Вспомогательный столбце для поиска грида.
:param row_value: Значение строки необходимое для ее поиска.
"""
win = get_win_object(context, win_obj)
grid = win.get_grid_by_column_header(column)
grid.click_by_row(row_value)