Bug 1754161 - [marionette] Merge Marionette::_unwrap_response in _from_json r=webdriver-reviewers,jgraham

Depends on D138159

_from_json should be redundant with _unwrap_response now.

Differential Revision: https://phabricator.services.mozilla.com/D138160
This commit is contained in:
Julian Descottes 2022-02-10 16:53:31 +00:00
Родитель 9797428b04
Коммит c033a12a53
2 изменённых файлов: 42 добавлений и 32 удалений

Просмотреть файл

@ -378,7 +378,7 @@ class HTMLElement(object):
class ShadowRoot(object):
"""A Class to handling Shadow Roots"""
identifiers = WEB_SHADOW_ROOT_KEY
identifiers = (WEB_SHADOW_ROOT_KEY,)
def __init__(self, marionette, id, kind=WEB_SHADOW_ROOT_KEY):
self.marionette = marionette
@ -668,24 +668,9 @@ class Marionette(object):
self._handle_error(err)
if key is not None:
return self._unwrap_response(res.get(key))
return self._from_json(res.get(key))
else:
return self._unwrap_response(res)
def _unwrap_response(self, value):
if isinstance(value, dict) and any(
k in value.keys() for k in HTMLElement.identifiers
):
return HTMLElement._from_json(value, self)
elif isinstance(value, dict) and ShadowRoot.identifiers in value.keys():
return ShadowRoot._from_json(value, self)
elif isinstance(value, dict):
return {key: self._unwrap_response(val) for key, val in value.items()}
elif isinstance(value, list):
return list(self._unwrap_response(item) for item in value)
else:
return value
return self._from_json(res)
def _handle_error(self, obj):
error = obj["error"]
@ -1599,19 +1584,18 @@ class Marionette(object):
return wrapped
def _from_json(self, value):
if isinstance(value, list):
unwrapped = []
for item in value:
unwrapped.append(self._from_json(item))
return unwrapped
if isinstance(value, dict) and any(
k in value.keys() for k in HTMLElement.identifiers
):
return HTMLElement._from_json(value, self)
elif isinstance(value, dict) and any(
k in value.keys() for k in ShadowRoot.identifiers
):
return ShadowRoot._from_json(value, self)
elif isinstance(value, dict):
unwrapped = {}
for key in value:
if key in HTMLElement.identifiers:
return HTMLElement._from_json(value[key], self)
else:
unwrapped[key] = self._from_json(value[key])
return unwrapped
return {key: self._from_json(val) for key, val in value.items()}
elif isinstance(value, list):
return list(self._from_json(item) for item in value)
else:
return value
@ -1712,7 +1696,7 @@ class Marionette(object):
if script_timeout is not None:
self.timeout.script = original_timeout
return self._from_json(rv)
return rv
def execute_async_script(
self,
@ -1782,7 +1766,7 @@ class Marionette(object):
if script_timeout is not None:
self.timeout.script = original_timeout
return self._from_json(rv)
return rv
def find_element(self, method, target, id=None):
"""Returns an :class:`~marionette_driver.marionette.HTMLElement`

Просмотреть файл

@ -210,6 +210,26 @@ class TestExecuteContent(MarionetteTestCase):
)
self.assertEqual(expected, actual)
def test_return_web_element_nested_array(self):
self.marionette.navigate(elements)
expected = self.marionette.find_elements(By.TAG_NAME, "p")
actual = self.marionette.execute_script(
"""
let els = document.querySelectorAll('p')
return { els: [els[0], els[1]] }"""
)
self.assertEqual(expected, actual["els"])
def test_return_web_element_nested_dict(self):
self.marionette.navigate(elements)
expected = self.marionette.find_element(By.TAG_NAME, "p")
actual = self.marionette.execute_script(
"""
let el = document.querySelector('p')
return { path: { to: { el } } }"""
)
self.assertEqual(expected, actual["path"]["to"]["el"])
# Bug 938228 identifies a problem with unmarshaling NodeList
# objects from the DOM. document.querySelectorAll returns this
# construct.
@ -482,6 +502,12 @@ class TestExecuteChrome(WindowManagerMixin, TestExecuteContent):
def test_return_web_element_array(self):
pass
def test_return_web_element_nested_array(self):
pass
def test_return_web_element_nested_dict(self):
pass
def test_return_web_element_nodelist(self):
pass