Source code for nested_admin.tests.utils

import collections

import six
from nested_admin.tests.compat import python_2_unicode_compatible


[docs]def xpath_cls(classname): return 'contains(concat(" ", @class, " "), " %s ")' % classname
[docs]def xpath_item(model_name=None): xpath_item_predicate = 'not(contains(@class, "-drag")) and not(contains(@class, "thead"))' expr = "%s and %s" % (xpath_cls('djn-item'), xpath_item_predicate) if model_name: expr += (' and (@data-inline-model="%s" or %s)' % (model_name, xpath_cls("djn-dynamic-form-%s" % model_name))) return expr
[docs]def is_sequence(o): return isinstance(o, collections.Sequence)
[docs]def is_integer(o): return isinstance(o, six.integer_types)
[docs]def is_str(o): return isinstance(o, six.string_types)
Position = collections.namedtuple('Position', ['x', 'y'])
[docs]class Size(collections.namedtuple('Size', ['width', 'height'])): w = property(lambda self: self.width) h = property(lambda self: self.height)
[docs]class Rect(collections.namedtuple('Rect', [ 'left', 'top', 'right', 'bottom', 'width', 'height', 'visible'])): x = property(lambda self: self.left) y = property(lambda self: self.top) r = property(lambda self: self.right) b = property(lambda self: self.bottom) w = property(lambda self: self.width) h = property(lambda self: self.height)
[docs]@python_2_unicode_compatible class ElementRect(object): def __init__(self, element, aliases=None): default_aliases = { 't': 'top', 'l': 'left', 'x': 'left', 'y': 'top', 'w': 'width', 'h': 'height', 'r': 'right', 'b': 'bottom', } aliases = dict(default_aliases, **(aliases or {})) self.alias_map = {} for k, v in six.iteritems(aliases): self.alias_map.setdefault(v, []) self.alias_map[v].append(k) self._element = element self.selenium = element.parent self.refresh()
[docs] def refresh(self): rect_dict = (self.selenium.execute_script(""" return (function(e, w, de) { var r = e.getBoundingClientRect(), wh = (w.innerHeight || de.clientHeight), ww = (w.innerWidth || de.clientWidth), visible = (r.top <= wh) && ((r.top + r.height) >= 0) && (r.left <= ww) && ((r.left + r.width) >= 0); return { visible: visible, top: r.top, left: r.left, width: r.width, height: r.height, right: r.right, bottom: r.bottom }; })(arguments[0], window, document.documentElement) """, self._element)) self.rect = Rect(**rect_dict) for k, v in six.iteritems(rect_dict): setattr(self, k, v) for alias in (self.alias_map.get(k) or []): setattr(self, alias, v)
def __str__(self): return "%s" % self.rect def __repr__(self): return repr(self.rect)
[docs]def ensure_element_is_in_view(element): if not ElementRect(element).visible: element.parent.execute_script( 'arguments[0].scrollIntoView()', element)