# -*- coding: utf-8 -*-
u"""
Набор степов для работы с полями формы (input type='text',
type='select', type='checkbox' и т.д.)
"""
import xlrd
from datetime import datetime
from behave import step
from ui import get_win_object
from helpers import waitForExtAjax, path_to_resource_file, FIELDSET_NAMES
@step(u'в поле {field_label} окна {win_name} установить значение {value}')
[документация]def step_find_and_fill_field(context, field_label, win_name, value):
u"""
Устанавливает значение value в поле field_label окна win_name.
:param context: behave переменная, передается
во все степы первым аргументом.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param value: Данные которые необходимо установить в поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.set_value(value)
@step(u'очистить поле {field_label} окна {win_name}')
[документация]def step_clear_field(context, field_label, win_name):
u"""
Удаляет данные из поля field_label.
:param context: behave переменная, передается
во все степы первым аргументом.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.clear()
@step(u'в поле {field_label} окна {win_name} нажать кнопку выпадающего'
u' списка и выбрать значение {value}')
def step_find_and_fill_combobox(context, field_label, win_name, value):
u"""
Степ для выбора данных из выпадающего списка. В некоторых списках данные
подгружаютсья ajax'ом, поэтому используется ожидание waitForExtAjax.
:param context: behave переменная,
передается во все степы первым аргументом.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param value: Данные которые необходимо выбрать в списке.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.click_by_trigger(u'выпадающего списка')
waitForExtAjax(context)
field.select_combobox_item(value)
@step(u'в поле {field_label} окна {win_name} ввести значение {value}'
u' и из выпадающего списка выбрать {current_value}')
[документация]def step_enter_value_and_choose(context, field_label, win_name, value,
current_value):
u"""
Степ для выбора данных из поля с автокомплитом.
:param context: behave переменная,
передается во все степы первым аргументом.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param value: Данные которые необходимо выбрать в списке.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.set_value(value)
context.webdriverwait.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(field.field_id))
)
field.select_combobox_item(current_value)
@step(u'в поле {field_label} окна {win_name} нажать кнопку открытия '
u'выбора из справочника')
[документация]def step_find_and_fill_combobox(context, field_label, win_name):
u"""
Степ для вызова справочника. При вызове справочника необходимо дождаться
завершения ajax запросов, для этого используется waitForExtAjax.
:param context: behave переменная,
передается во все степы первым аргументом.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.click_by_trigger(u'вызова справочника')
waitForExtAjax(context)
@step(u'"{action}" чекбокс "{field_label}" окна "{win_name}"')
[документация]def step_click_checkbox(context, action, field_label, win_name):
u"""
Включение/Выключение чекбокса.
:param action: Действие над чекбоксом, может принимать значение
включить и выключить.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
if action == u'включить' and not field.is_checked():
field.click()
elif action == u'выключить' and field.is_checked():
field.click()
@step(u'чекбокс {field_label} окна "{win_name}" {status}')
[документация]def step_checkbox_status(context, field_label, win_name, status):
u"""
Проверка состояния чекбокса, включен или выключен.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param status: Проверяемое состояние, включен или выключен
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
if status == u'включен':
assert field.is_checked(), 'Checkbox is not checked'
elif status == u'выключен':
assert not field.is_checked(), 'Checkbox is not checked'
@step(u'в окне "{win_name}" есть поле "{field_label}"')
def step_(context, win_name, field_label):
u"""
Проверка есть ли поле field_label в окне win.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
assert win.get_field_by_name(field_label), "Field doesn't exist."
@step(u'поле {field_label} окна {win_name} подсвечивается'
u' {field_color} цветом')
[документация]def step_test_filed_valid(context, field_label, win_name, field_color):
u"""
Проверка каким цветом подсвечивается поле. Желтым подсвечивается
обязательное, белым не обязательное.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param field_color: Цвет поля. может принимать значение (желтым, белым)
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
if field_color == u'желтым':
assert not field.is_valid(), 'Field is not highlighted by yellow color'
elif field_color == u'белым':
assert field.is_valid(), 'Field is not highlighted by white color'
@step(u'в поле {field_label} окна {win_name} содержится значение {value}')
@step(u'в поле {field_label} окна {win_name} содержится значение "{value}"')
[документация]def step_test_value_in_field(context, field_label, win_name, value):
u"""
Степ для проверки содержится ли в поле value. Если необходимо проверить
пустое ли поле тогда в качестве параметра value необходимо указать None.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param value: Проверяемое значение.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
actual_value = field.get_value()
if value == u'None' or value == ' ':
value = ''
assert actual_value == value, (
'Value not in field. Expected {0} but found {1}'.format(
value.encode('utf-8'), actual_value.encode('utf-8')
)
)
@step(u'в поле {field_label} окна {win_name} содержится текущая дата')
@step(u'в поле {field_label} окна {win_name} занесется значение текущей даты')
def step_(context, field_label, win_name):
u"""
Степ для проверки содержится ли в поле текущая дата.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
context.execute_steps(
u'Если в поле {0} окна {1} содержится значение {2}'.format(
field_label, win_name, datetime.today().strftime('%d.%m.%Y')
))
@step(u'поле {field_label} окна {win_name} отображается с признаком '
u'редактирования')
[документация]def step_is_field_edit(context, field_label, win_name):
u"""
Проверка редактировалось ли поле. При редактирование label поля становится
фиолетовым.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
assert field.is_edited()
@step(u'в выпадающем списке {field_label} окна {win_name} '
u'будет запись {record}')
@step(u'в выпадающем списке {field_label} окна {win_name} '
u'будет запись "{record}"')
@step(u'в выпадающем списке {field_label} значений из {is_fias}'
u' окна {win_name} будет запись {record}')
@step(u'в выпадающем списке {field_label} окна {win_name}'
u' совпадают значения с {country_file}')
[документация]def step_is_record_in_list(context, field_label, win_name,
is_fias=None, record=None, country_file=None):
u"""
Проверка того что в выпадающем списке field_label содержится значение
record.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param record: Искомая запись.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
if record:
if is_fias:
if (u'Улица' in field_label) or (u'Дом' in field_label):
is_exist = False
for item in field.get_fias_list_items():
if record in item:
is_exist = True
assert is_exist, 'Record not in list'
else:
assert record in field.get_fias_list_items(), (
'Record not in list')
else:
assert record in field.get_list_items(), 'Record not in list'
else:
country_list = field.get_list_items()
wb = xlrd.open_workbook(
path_to_resource_file(country_file,
context.settings.PATH_TO_RES_DIR))
sheet = wb.sheet_by_index(0)
for rownum in xrange(1, sheet.nrows):
assert sheet.row_values(rownum, 0)[0] in country_list, \
'Record {} not in list'.format(sheet.row_values(rownum, 0)[0])
@step(u'поле {field_label} окна "{win_name}" {status} для редактирования')
[документация]def step_is_field_editable(context, field_label, win_name, status):
u"""
Проверка доступно или не доступно для редактирование поле.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param status: Статус поля для проверки, доступно или недоступно.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
if status == u'недоступно':
assert field.is_read_only(), 'Field is editable'
elif status == u'доступно':
assert not field.is_read_only(), 'Field is not editable'
@step(u'поле {field_name} блока {field_set} окна {win_name} неактивно')
[документация]def step_check_disabled_field(context, field_name, field_set, win_name):
win = get_win_object(context, win_name)
field_label = field_name + FIELDSET_NAMES[field_set]
field = win.get_field_by_name(field_label)
assert field.is_disabled()
@step(u'в поле {field_label} окна {win_name} прикрепить файл {file_name}')
[документация]def step_(context, field_label, win_name, file_name):
u"""
Прикрепление файла в поле типа file.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
:param file_name: Имя файла для добавления, файл должен храниться
в папке features_selenium/steps/resources
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.attache_file(path_to_resource_file(file_name,
context.settings.PATH_TO_RES_DIR))
@step(u'в поле {field_label} окна {win_name} нажать кнопку {button}')
@step(u'в окне {win_name} у поля "{field_label}"'
u' {visible} кнопка {button_name}')
@step(u'у поля {field_label} окна "{win_name}"'
u' {visible} кнопка {button}')
@step(u'в окне {win_name} кликнуть по кнопке {trigger_name}'
u' поля {field_label}')
@step(u'в поле {field_label} окна {win_name} вызвать календарь')
[документация]def step_open_data_picker(context, field_label, win_name):
u"""
Вызов виджета календаря у поля даты.
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.open_data_picker()
@step(u'у поля {field_label} окна {win_name} откроется виджет Календарь')
@step(u'в виджете календаря поля {field_label} окна {win_name} отображается'
u' текущая дата')
@step(u'в виджете Календаря поля {field_label} окна {win_name} '
u'дата "{date}" {status} для выбора')
@step(u'в поле {field_label} окна {win_name} нажать на кнопку '
u'проставления текущей даты')
[документация]def step_set_current_date(context, field_label, win_name):
u"""
Нажатие кнопки выставления текущей даты у поля
:param field_label: Название поля.
:param win_name: Название окна в котором находится поле.
"""
win = get_win_object(context, win_name)
field = win.get_field_by_name(field_label)
field.set_current_date()
@step(u'в виджете Календаря поля {field_label} окна {win_name} '
u'установить {date}')
@step(u'в окне {win_name} не отображается поле {field_name}'
u' из блока {field_set}')
[документация]def step_check_field_is_invisible(context, win_name, field_name, field_set):
win = get_win_object(context, win_name)
field_label = field_name + FIELDSET_NAMES[field_set]
field = win.get_field_by_name(field_label)
assert not field.is_visible()