Add _js_call to WebEngineElement

This commit is contained in:
Florian Bruhin 2017-03-01 17:34:21 +01:00
parent bc0a9cd94d
commit 03f1e0913d

View File

@ -56,9 +56,7 @@ class WebEngineElement(webelem.AbstractWebElement):
def __setitem__(self, key, val): def __setitem__(self, key, val):
self._js_dict['attributes'][key] = val self._js_dict['attributes'][key] = val
js_code = javascript.assemble('webelem', 'set_attribute', self._id, self._js_call('set_attribute', key, val)
key, val)
self._tab.run_js_async(js_code)
def __delitem__(self, key): def __delitem__(self, key):
log.stub() log.stub()
@ -69,6 +67,11 @@ class WebEngineElement(webelem.AbstractWebElement):
def __len__(self): def __len__(self):
return len(self._js_dict['attributes']) return len(self._js_dict['attributes'])
def _js_call(self, name, *args, callback=None):
"""Wrapper to run stuff from webelem.js."""
js_code = javascript.assemble('webelem', name, self._id, *args)
self._tab.run_js_async(js_code, callback=callback)
def has_frame(self): def has_frame(self):
return True return True
@ -99,15 +102,13 @@ class WebEngineElement(webelem.AbstractWebElement):
return self._js_dict.get('value', None) return self._js_dict.get('value', None)
def set_value(self, value): def set_value(self, value):
js_code = javascript.assemble('webelem', 'set_value', self._id, value) self._js_call('set_value', value)
self._tab.run_js_async(js_code)
def insert_text(self, text): def insert_text(self, text):
if not self.is_editable(strict=True): if not self.is_editable(strict=True):
raise webelem.Error("Element is not editable!") raise webelem.Error("Element is not editable!")
log.webelem.debug("Inserting text into element {!r}".format(self)) log.webelem.debug("Inserting text into element {!r}".format(self))
js_code = javascript.assemble('webelem', 'insert_text', self._id, text) self._js_call('insert_text', text)
self._tab.run_js_async(js_code)
def rect_on_view(self, *, elem_geometry=None, no_js=False): def rect_on_view(self, *, elem_geometry=None, no_js=False):
"""Get the geometry of the element relative to the webview. """Get the geometry of the element relative to the webview.
@ -153,15 +154,11 @@ class WebEngineElement(webelem.AbstractWebElement):
def remove_blank_target(self): def remove_blank_target(self):
if self._js_dict['attributes'].get('target') == '_blank': if self._js_dict['attributes'].get('target') == '_blank':
self._js_dict['attributes']['target'] = '_top' self._js_dict['attributes']['target'] = '_top'
js_code = javascript.assemble('webelem', 'remove_blank_target', self._js_call('remove_blank_target')
self._id)
self._tab.run_js_async(js_code)
def _move_text_cursor(self): def _move_text_cursor(self):
if self.is_text_input() and self.is_editable(): if self.is_text_input() and self.is_editable():
js_code = javascript.assemble('webelem', 'move_cursor_to_end', self._js_call('move_cursor_to_end')
self._id)
self._tab.run_js_async(js_code)
def _click_editable(self, click_target): def _click_editable(self, click_target):
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58515 # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58515
@ -175,8 +172,7 @@ class WebEngineElement(webelem.AbstractWebElement):
# pylint: enable=no-member # pylint: enable=no-member
self._tab.send_event(ev) self._tab.send_event(ev)
# This actually "clicks" the element by calling focus() on it in JS. # This actually "clicks" the element by calling focus() on it in JS.
js_code = javascript.assemble('webelem', 'focus', self._id) self._js_call('focus')
self._tab.run_js_async(js_code)
self._move_text_cursor() self._move_text_cursor()
def _click_js(self, _click_target): def _click_js(self, _click_target):
@ -196,5 +192,4 @@ class WebEngineElement(webelem.AbstractWebElement):
def reset_setting(_arg): def reset_setting(_arg):
settings.setAttribute(attribute, could_open_windows) settings.setAttribute(attribute, could_open_windows)
js_code = javascript.assemble('webelem', 'click', self._id) self._js_call('click', callback=reset_setting)
self._tab.run_js_async(js_code, reset_setting)