From 1734d700b8e431e4d01690be0558e91d15fc2a79 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Fri, 13 Apr 2018 13:33:50 +0000 Subject: [PATCH] Test serialisation of collections in wdspec. Ports tests added to Marionette in bug 1284232 to WPT. These test that the Arguments, Array, FileList, HTMLAllCollection, HTMLCollection, HTMLFormControlsCollection, HTMLOptionsCollection, and NodeList collections are properly serialised when returned from an injected script. There is one failing test that needs more investigation. My current suspicion is that it is a JavaScript bug. bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1453009 gecko-commit: 172094bca9a6e2f841e629aae292647e212d92c6 gecko-integration-branch: central gecko-reviewers: whimboo --- .../tests/execute_async_script/collections.py | 158 ++++++++++++++++++ webdriver/tests/execute_script/collections.py | 136 +++++++++++++++ 2 files changed, 294 insertions(+) create mode 100644 webdriver/tests/execute_async_script/collections.py create mode 100644 webdriver/tests/execute_script/collections.py diff --git a/webdriver/tests/execute_async_script/collections.py b/webdriver/tests/execute_async_script/collections.py new file mode 100644 index 00000000000000..5affdc9af35283 --- /dev/null +++ b/webdriver/tests/execute_async_script/collections.py @@ -0,0 +1,158 @@ +import os + +from tests.support.asserts import assert_same_element, assert_success +from tests.support.inline import inline + + +def execute_async_script(session, script, args=None): + if args is None: + args = [] + body = {"script": script, "args": args} + return session.transport.send( + "POST", + "/session/{session_id}/execute/async".format(**vars(session)), + body) + + +def test_arguments(session): + response = execute_async_script(session, """ + let [resolve] = arguments; + function func() { + return arguments; + } + resolve(func("foo", "bar")); + """) + assert_success(response, [u"foo", u"bar"]) + + +def test_array(session): + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve([1, 2]); + """) + assert_success(response, [1, 2]) + + +def test_file_list(session, tmpdir): + files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")] + + session.url = inline("") + upload = session.find.css("input", all=False) + for file in files: + file.write("morn morn") + upload.send_keys(str(file)) + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.querySelector('input').files); + """) + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == len(files) + for expected, actual in zip(files, value): + assert isinstance(actual, dict) + assert "name" in actual + assert isinstance(actual["name"], basestring) + assert os.path.basename(str(expected)) == actual["name"] + + +def test_html_all_collection(session): + session.url = inline(""" +

foo +

bar + """) + html = session.find.css("html", all=False) + head = session.find.css("head", all=False) + body = session.find.css("body", all=False) + ps = session.find.css("p") + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.all); + """) + value = assert_success(response) + assert isinstance(value, list) + # , , ,

,

+ assert len(value) == 5 + + assert_same_element(session, html, value[0]) + assert_same_element(session, head, value[1]) + assert_same_element(session, body, value[2]) + assert_same_element(session, ps[0], value[3]) + assert_same_element(session, ps[1], value[4]) + + +def test_html_collection(session): + session.url = inline(""" +

foo +

bar + """) + ps = session.find.css("p") + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.getElementsByTagName('p')); + """) + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(ps, value): + assert_same_element(session, expected, actual) + + +def test_html_form_controls_collection(session): + session.url = inline(""" +

+ + +
+ """) + inputs = session.find.css("input") + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.forms[0].elements); + """) + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(inputs, value): + assert_same_element(session, expected, actual) + + +def test_html_options_collection(session): + session.url = inline(""" + + """) + options = session.find.css("option") + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.querySelector('select').options); + """) + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(options, value): + assert_same_element(session, expected, actual) + + +def test_node_list(session): + session.url = inline(""" +

foo +

bar + """) + ps = session.find.css("p") + + response = execute_async_script(session, """ + let [resolve] = arguments; + resolve(document.querySelectorAll('p')); + """) + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(ps, value): + assert_same_element(session, expected, actual) diff --git a/webdriver/tests/execute_script/collections.py b/webdriver/tests/execute_script/collections.py new file mode 100644 index 00000000000000..d96c7fe3a675f3 --- /dev/null +++ b/webdriver/tests/execute_script/collections.py @@ -0,0 +1,136 @@ +import os + +from tests.support.asserts import assert_same_element, assert_success +from tests.support.inline import inline + + +def execute_script(session, script, args=None): + if args is None: + args = [] + body = {"script": script, "args": args} + return session.transport.send( + "POST", + "/session/{session_id}/execute/sync".format(**vars(session)), + body) + + +def test_arguments(session): + response = execute_script(session, """ + function func() { + return arguments; + } + return func("foo", "bar"); + """) + assert_success(response, [u"foo", u"bar"]) + + +def test_array(session): + response = execute_script(session, "return [1, 2]") + assert_success(response, [1, 2]) + + +def test_file_list(session, tmpdir): + files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")] + + session.url = inline("") + upload = session.find.css("input", all=False) + for file in files: + file.write("morn morn") + upload.send_keys(str(file)) + + response = execute_script(session, "return document.querySelector('input').files") + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == len(files) + for expected, actual in zip(files, value): + assert isinstance(actual, dict) + assert "name" in actual + assert isinstance(actual["name"], basestring) + assert os.path.basename(str(expected)) == actual["name"] + + +def test_html_all_collection(session): + session.url = inline(""" +

foo +

bar + """) + html = session.find.css("html", all=False) + head = session.find.css("head", all=False) + body = session.find.css("body", all=False) + ps = session.find.css("p") + + response = execute_script(session, "return document.all") + value = assert_success(response) + assert isinstance(value, list) + # , , ,

,

+ assert len(value) == 5 + + assert_same_element(session, html, value[0]) + assert_same_element(session, head, value[1]) + assert_same_element(session, body, value[2]) + assert_same_element(session, ps[0], value[3]) + assert_same_element(session, ps[1], value[4]) + + +def test_html_collection(session): + session.url = inline(""" +

foo +

bar + """) + ps = session.find.css("p") + + response = execute_script(session, "return document.getElementsByTagName('p')") + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(ps, value): + assert_same_element(session, expected, actual) + + +def test_html_form_controls_collection(session): + session.url = inline(""" +

+ + +
+ """) + inputs = session.find.css("input") + + response = execute_script(session, "return document.forms[0].elements") + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(inputs, value): + assert_same_element(session, expected, actual) + + +def test_html_options_collection(session): + session.url = inline(""" + + """) + options = session.find.css("option") + + response = execute_script(session, "return document.querySelector('select').options") + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(options, value): + assert_same_element(session, expected, actual) + + +def test_node_list(session): + session.url = inline(""" +

foo +

bar + """) + ps = session.find.css("p") + + response = execute_script(session, "return document.querySelectorAll('p')") + value = assert_success(response) + assert isinstance(value, list) + assert len(value) == 2 + for expected, actual in zip(ps, value): + assert_same_element(session, expected, actual)