# -*- coding: utf-8 -*-
u"""
Набор вспомогательных фун. для селениум тестов.
"""
import os
import copy
from hashlib import md5
MONTHS = {
u'Январь': 1,
u'Февраль': 2,
u'Март': 3,
u'Апрель': 4,
u'Май': 5,
u'Июнь': 6,
u'Июль': 7,
u'Август': 8,
u'Сентябрь': 9,
u'Октябрь': 10,
u'Ноябрь': 11,
u'Декабрь': 12,
}
"""
Индексы для полей, расположенных в блоках fieldset
с соответствующими именами
"""
FIELDSET_NAMES = {
u'Фактический адрес': '',
u'Адрес регистрации по месту жительства': '-1',
u'Адрес регистрации по месту пребывания': '-2',
u'Адрес регистрации по месту пребывания ученика': '-2'
}
[документация]def inject_js_script(driver, file_path):
f = open(file_path, 'r')
driver.execute_script(f.read())
[документация]def execute_required_js(driver):
path = os.path.join(os.path.dirname(__file__), 'js_scripts')
for file_name in os.listdir(path):
if file_name.endswith('.js'):
inject_js_script(driver, path + '/' + file_name)
[документация]def load_js(function):
"""
Декоратор для загрузки js кода. Навешивается на функцию before_step в
файле enviroment.py. И перед каждым степом проверяет
загружены ли необходимые js библиотеки.
"""
def wrapper_load_js(arg_context, arg_step):
if hasattr(arg_context, 'browser'):
js_helpers_not_load = arg_context.browser.execute_script(
"""return (typeof ui === 'undefined')""")
if (js_helpers_not_load and
arg_context.TEST_URL in arg_context.browser.current_url and
not arg_context.personal_area_interface):
execute_required_js(arg_context.browser)
elif arg_context.personal_area_interface:
intercept_jquery_ajax(arg_context.browser)
function(arg_context, arg_step)
return wrapper_load_js
[документация]def is_ext_defined(driver):
"""
Проверяем доступен ли объект Ext на текущей странице. Необходим т.к.
например в интерфейсе ученика/родителя ExtJS не используется.
"""
return driver.execute_script("""
return !(typeof(Ext) == 'undefined');
""")
[документация]def waitForExtAjax(context):
"""
Ждем пока завершатся все Ajaxы у Ext
"""
context.webdriverwait.until(lambda driver: driver.execute_script("""
return !Ext.Ajax.isLoading()
|| (typeof SJTXE !== "undefined" && SJTXE.hasAjaxFailure());
"""))
[документация]def waitForJQueryAjax(context):
"""
Ждем пока завершатся все Ajaxы у JQuery
"""
context.webdriverwait.until(lambda driver: driver.execute_script("""
return jQuery.active == 0;
"""))
[документация]def intercept_jquery_ajax(driver):
"""
Перехватываем все Ajax-ответы jQuery. Применяется для получения
имени скачиваемых файлов.
"""
driver.execute_script("""
$(document).ajaxComplete(function(event, xhr, settings) {
if (xhr.responseText.indexOf('media/downloads') != -1) {
file_name = xhr.responseText.slice(
xhr.responseText.indexOf("/media"),
xhr.responseText.indexOf("xls")+3
);
window.reportFileName = file_name.split('/').pop();
} else {
window.jQueryAjaxResponse = xhr.responseText;
}
});
""")
[документация]def waitForImport(context):
"""
Ждем завершение импорта файла
"""
context.webdriverwait.until(lambda driver: driver.execute_script("""
return window.responseImport;
"""))
[документация]def screenshot(func):
def wrapper(*args, **kwargs):
# формируем название файла из названия ф-и и значений параметров
context = None
cache_param = [func.__name__]
copy_kwargs = copy.copy(kwargs)
copy_args = copy.copy(args)
if 'context' in kwargs:
context = kwargs['context']
del copy_kwargs['context']
else:
context = copy_args[0]
cache_param.extend(list(copy_args)[1:])
cache_param.extend(copy_kwargs.values())
rebase_cache_param = []
for i in cache_param:
if isinstance(i, dict):
rebase_cache_param.extend(i.values())
elif isinstance(i, list):
rebase_cache_param.extend(i)
else:
rebase_cache_param.append(i)
result = func(*args, **kwargs)
def generate_file_name(list_params, path_name):
path = getattr(context, path_name, None)
if path:
if not os.path.exists(path):
os.mkdir(path)
filename = md5(
(u''.join(list_params)).encode('utf8')
).hexdigest() + '.png'
return os.path.join(path, filename)
return None
image1 = generate_file_name(
rebase_cache_param,
'TEMPLATE_PATH'
)
image2 = generate_file_name(
rebase_cache_param,
'STANDART_TEMPLATE_PATH'
)
output = generate_file_name(
['output'] + rebase_cache_param,
'TEMPLATE_PATH'
)
context.browser.save_screenshot(image1)
if image2 and os.path.exists(image2):
import subprocess
res = subprocess.Popen(
['compare -metric AE -fuzz 5%s %s %s %s' % (
'%', image1, image2, output)],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
compare_stdout, compare_stderr = res.communicate()
assert int(compare_stderr) == 0
return result
return wrapper
[документация]def get_modal_win_id_by_name(context, win_name):
windows = context.webdriverwait.until(
lambda driver: driver.find_elements_by_xpath(
"//div[(contains(@class, 'x-window') "
"or contains(@class, ' x-window'))"
" and contains(@id, 'ext-comp')]")
)
for window in windows:
header = window.find_element_by_class_name('x-window-header-text')
if header.text == win_name:
return window.get_attribute('id')
return 0
[документация]def select_journal_cell(context, grid_id, date, time, header, pupil_name):
context.browser.execute_script(u"""
helpers.find_and_select_row('{0}', '{1}', '{2}', '{3}', '{4}')
""".format(grid_id, date, time, header, pupil_name)
)
[документация]def path_to_resource_file(file_name, resource_dir):
"""
:param resource_dir: Путь к директории в которой храниться файл.
"""
path_to_file = (resource_dir + '/' + file_name)
assert os.path.exists(path_to_file)
return path_to_file
[документация]def is_tab_with_title_open(context, win_title):
"""
В большинстве тестов все действия происходят одном окне поэтому
при проверке открылась ли новая вкладка можно
проверить вкладку с индексом 1.
"""
context.browser.switch_to.window(context.browser.window_handles[1])
cur_title = context.browser.title
context.browser.switch_to.window(context.browser.window_handles[0])
return win_title in cur_title
[документация]def get_report_file_name(context):
return context.browser.execute_script(u"""
return window.reportFileName;
""")
[документация]def is_elem_exists(driver, elem_id):
return len(driver.find_elements_by_id(elem_id)) > 0