Исходный код edutesting.ui_steps.helpers

# -*- 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_toolbar_id_by_column_name(context, win_id, column_name): window = context.browser.find_element_by_id(win_id) toolbars = window.find_elements_by_class_name('x-grid-panel') for toolbar in toolbars: columns = toolbar.find_elements_by_class_name('x-grid3-hd-inner') for column in columns: if column.text == column_name: return toolbar.get_attribute('id') return 0
[документация]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
[документация]def editor_input_value(driver, editor_id): return driver.execute_script(u""" return Ext.getCmp('{0}').getRawValue(); """.format(editor_id))