Title: [226708] trunk/WebDriverTests
Revision
226708
Author
[email protected]
Date
2018-01-10 03:25:51 -0800 (Wed, 10 Jan 2018)

Log Message

Unreviewed. Update W3C WebDriver imported tests.

* imported/w3c/importer.json:
* imported/w3c/tools/wptrunner/wptrunner/browsers/firefox.py:
* imported/w3c/tools/wptrunner/wptrunner/browsers/servo.py:
* imported/w3c/tools/wptrunner/wptrunner/environment.py:
* imported/w3c/tools/wptrunner/wptrunner/executors/base.py:
* imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py:
* imported/w3c/tools/wptrunner/wptrunner/executors/executorservo.py:
* imported/w3c/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py:
* imported/w3c/tools/wptrunner/wptrunner/testrunner.py:
* imported/w3c/tools/wptrunner/wptrunner/update/update.py:
* imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py:
* imported/w3c/tools/wptrunner/wptrunner/wptlogging.py:
* imported/w3c/tools/wptrunner/wptrunner/wptrunner.py:
* imported/w3c/webdriver/OWNERS:
* imported/w3c/webdriver/interface/interface.html: Removed.
* imported/w3c/webdriver/tests/actions/modifier_click.py:
* imported/w3c/webdriver/tests/actions/mouse.py:
* imported/w3c/webdriver/tests/actions/mouse_dblclick.py: Added.
* imported/w3c/webdriver/tests/actions/sequence.py:
* imported/w3c/webdriver/tests/actions/support/mouse.py: Added.
* imported/w3c/webdriver/tests/cookies/add_cookie.py:
* imported/w3c/webdriver/tests/cookies/get_named_cookie.py:
* imported/w3c/webdriver/tests/element_retrieval/__init__.py: Copied from WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py.
* imported/w3c/webdriver/tests/element_retrieval/find_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element.py.
* imported/w3c/webdriver/tests/element_retrieval/find_element_from_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_element.py.
* imported/w3c/webdriver/tests/element_retrieval/find_elements.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_elements.py.
* imported/w3c/webdriver/tests/element_retrieval/find_elements_from_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_elements.py.
* imported/w3c/webdriver/tests/element_send_keys/__init__.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py.
* imported/w3c/webdriver/tests/element_send_keys/interactability.py: Added.
* imported/w3c/webdriver/tests/element_send_keys/scroll_into_view.py: Added.
* imported/w3c/webdriver/tests/execute_script/cyclic.py: Added.
* imported/w3c/webdriver/tests/get_window_rect.py:
* imported/w3c/webdriver/tests/interface.html:
* imported/w3c/webdriver/tests/navigation/current_url.py:
* imported/w3c/webdriver/tests/support/asserts.py:
* imported/w3c/webdriver/tests/support/fixtures.py:

Modified Paths

Added Paths

Removed Paths

  • trunk/WebDriverTests/imported/w3c/webdriver/interface/
  • trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/

Diff

Modified: trunk/WebDriverTests/ChangeLog (226707 => 226708)


--- trunk/WebDriverTests/ChangeLog	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/ChangeLog	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,3 +1,44 @@
+2018-01-10  Carlos Garcia Campos  <[email protected]>
+
+        Unreviewed. Update W3C WebDriver imported tests.
+
+        * imported/w3c/importer.json:
+        * imported/w3c/tools/wptrunner/wptrunner/browsers/firefox.py:
+        * imported/w3c/tools/wptrunner/wptrunner/browsers/servo.py:
+        * imported/w3c/tools/wptrunner/wptrunner/environment.py:
+        * imported/w3c/tools/wptrunner/wptrunner/executors/base.py:
+        * imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py:
+        * imported/w3c/tools/wptrunner/wptrunner/executors/executorservo.py:
+        * imported/w3c/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py:
+        * imported/w3c/tools/wptrunner/wptrunner/testrunner.py:
+        * imported/w3c/tools/wptrunner/wptrunner/update/update.py:
+        * imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py:
+        * imported/w3c/tools/wptrunner/wptrunner/wptlogging.py:
+        * imported/w3c/tools/wptrunner/wptrunner/wptrunner.py:
+        * imported/w3c/webdriver/OWNERS:
+        * imported/w3c/webdriver/interface/interface.html: Removed.
+        * imported/w3c/webdriver/tests/actions/modifier_click.py:
+        * imported/w3c/webdriver/tests/actions/mouse.py:
+        * imported/w3c/webdriver/tests/actions/mouse_dblclick.py: Added.
+        * imported/w3c/webdriver/tests/actions/sequence.py:
+        * imported/w3c/webdriver/tests/actions/support/mouse.py: Added.
+        * imported/w3c/webdriver/tests/cookies/add_cookie.py:
+        * imported/w3c/webdriver/tests/cookies/get_named_cookie.py:
+        * imported/w3c/webdriver/tests/element_retrieval/__init__.py: Copied from WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py.
+        * imported/w3c/webdriver/tests/element_retrieval/find_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element.py.
+        * imported/w3c/webdriver/tests/element_retrieval/find_element_from_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_element.py.
+        * imported/w3c/webdriver/tests/element_retrieval/find_elements.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_elements.py.
+        * imported/w3c/webdriver/tests/element_retrieval/find_elements_from_element.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_elements.py.
+        * imported/w3c/webdriver/tests/element_send_keys/__init__.py: Renamed from WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py.
+        * imported/w3c/webdriver/tests/element_send_keys/interactability.py: Added.
+        * imported/w3c/webdriver/tests/element_send_keys/scroll_into_view.py: Added.
+        * imported/w3c/webdriver/tests/execute_script/cyclic.py: Added.
+        * imported/w3c/webdriver/tests/get_window_rect.py:
+        * imported/w3c/webdriver/tests/interface.html:
+        * imported/w3c/webdriver/tests/navigation/current_url.py:
+        * imported/w3c/webdriver/tests/support/asserts.py:
+        * imported/w3c/webdriver/tests/support/fixtures.py:
+
 2017-12-14  Carlos Garcia Campos  <[email protected]>
 
         WebDriver: add a common way to run tests with pytest

Modified: trunk/WebDriverTests/imported/w3c/importer.json (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/importer.json	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/importer.json	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,6 +1,6 @@
 {
     "repository": "https://github.com/w3c/web-platform-tests.git",
-    "revision": "267d6b27ffd416577702653c0987b30239daae3f",
+    "revision": "941f6aa2949e24475a7dcd53fd1cb70142059d37",
     "paths_to_import": [
         "tools/webdriver",
         "tools/wptrunner",

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -51,7 +51,10 @@
         else:
             return 2
     elif run_info_data["debug"] or run_info_data.get("asan"):
-        return 3
+        if run_info_data.get("ccov"):
+            return 4
+        else:
+            return 3
     return 1
 
 

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/servo.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/servo.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/servo.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -42,6 +42,8 @@
     rv = base_executor_kwargs(test_type, server_config,
                               cache_manager, **kwargs)
     rv["pause_after_test"] = kwargs["pause_after_test"]
+    if test_type == "wdspec":
+        rv["capabilities"] = {}
     return rv
 
 

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/environment.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -37,8 +37,6 @@
     try:
         from tools.serve import serve
     except ImportError:
-        from wpt_tools.serve import serve
-    except ImportError:
         failed.append("serve")
 
     try:
@@ -86,7 +84,6 @@
         self.ssl_env = ssl_env
         self.server = None
         self.config = None
-        self.external_config = None
         self.pause_after_test = pause_after_test
         self.test_server_port = options.pop("test_server_port", True)
         self.debug_info = debug_info
@@ -105,9 +102,10 @@
             cm.__enter__(self.options)
         self.setup_server_logging()
         self.config = self.load_config()
-        serve.set_computed_defaults(self.config)
-        self.external_config, self.servers = serve.start(self.config, self.ssl_env,
-                                                         self.get_routes())
+        ports = serve.get_ports(self.config, self.ssl_env)
+        self.config = serve.normalise_config(self.config, ports)
+        self.servers = serve.start(self.config, self.ssl_env,
+                                   self.get_routes())
         if self.options.get("supports_debugger") and self.debug_info and self.debug_info.interactive:
             self.ignore_interrupts()
         return self
@@ -160,6 +158,8 @@
         config["key_file"] = key_file
         config["certificate"] = certificate
 
+        serve.set_computed_defaults(config)
+
         return config
 
     def setup_server_logging(self):

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/base.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -113,7 +113,7 @@
         :param browser: ExecutorBrowser instance providing properties of the
                         browser that will be tested.
         :param server_config: Dictionary of wptserve server configuration of the
-                              form stored in TestEnvironment.external_config
+                              form stored in TestEnvironment.config
         :param timeout_multiplier: Multiplier relative to base timeout to use
                                    when setting test timeout.
         """

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executormarionette.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -175,7 +175,11 @@
             # This can happen if there was a crash
             return
         if socket_timeout:
-            self.marionette.timeout.script = socket_timeout / 2
+            try:
+                self.marionette.timeout.script = socket_timeout / 2
+            except (socket.error, IOError):
+                self.logger.debug("Socket closed")
+                return
 
         self.marionette.switch_to_window(self.runner_handle)
         while True:
@@ -564,7 +568,7 @@
             self.executor.protocol.marionette.set_context(self.executor.protocol.marionette.CONTEXT_CONTENT)
         except Exception as e:
             # Ignore errors during teardown
-            self.logger.warning(traceback.traceback.format_exc(e))
+            self.logger.warning(traceback.format_exc(e))
 
 
 

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservo.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservo.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/executorservo.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -18,7 +18,7 @@
                    RefTestImplementation,
                    testharness_result_converter,
                    reftest_result_converter,
-                   WdspecExecutor)
+                   WdspecExecutor, WebDriverProtocol)
 from .process import ProcessTestExecutor
 from ..browsers.base import browser_command
 from ..wpttest import WdspecResult, WdspecSubtestResult
@@ -286,82 +286,9 @@
                                        line,
                                        " ".join(self.command))
 
-class ServoWdspecProtocol(Protocol):
-    def __init__(self, executor, browser):
-        self.do_delayed_imports()
-        Protocol.__init__(self, executor, browser)
-        self.session = None
-        self.server = None
 
-    def setup(self, runner):
-        try:
-            self.server = ServoDriverServer(self.logger, binary=self.browser.binary, binary_args=self.browser.binary_args)
-            self.server.start(block=False)
-            self.logger.info(
-                "WebDriver HTTP server listening at %s" % self.server.url)
+class ServoDriverProtocol(WebDriverProtocol):
+    server_cls = ServoDriverServer
 
-            self.logger.info(
-                "Establishing new WebDriver session with %s" % self.server.url)
-            self.session = webdriver.Session(
-                self.server.host, self.server.port, self.server.base_path)
-        except Exception:
-            self.logger.error(traceback.format_exc())
-            self.executor.runner.send_message("init_failed")
-        else:
-            self.executor.runner.send_message("init_succeeded")
-
-    def teardown(self):
-        if self.server is not None:
-            try:
-                if self.session.session_id is not None:
-                    self.session.end()
-            except Exception:
-                pass
-            if self.server.is_alive:
-                self.server.stop()
-
-    @property
-    def is_alive(self):
-        conn = httplib.HTTPConnection(self.server.host, self.server.port)
-        conn.request("HEAD", self.server.base_path + "invalid")
-        res = conn.getresponse()
-        return res.status == 404
-
-    def do_delayed_imports(self):
-        global pytestrunner, webdriver
-        from . import pytestrunner
-        import webdriver
-
-
 class ServoWdspecExecutor(WdspecExecutor):
-    def __init__(self, browser, server_config,
-                 timeout_multiplier=1, close_after_done=True, debug_info=None,
-                 **kwargs):
-        WdspecExecutor.__init__(self, browser, server_config,
-                                timeout_multiplier=timeout_multiplier,
-                                debug_info=debug_info)
-        self.protocol = ServoWdspecProtocol(self, browser)
-
-    def is_alive(self):
-        return self.protocol.is_alive
-
-    def on_environment_change(self, new_environment):
-        pass
-
-    def do_test(self, test):
-        timeout = test.timeout * self.timeout_multiplier + extra_timeout
-
-        success, data = ""
-                                  self.protocol.session,
-                                  test.path,
-                                  timeout).run()
-
-        if success:
-            return self.convert_result(test, data)
-
-        return (test.result_cls(*data), [])
-
-    def do_wdspec(self, session, path, timeout):
-        harness_result = ("OK", None)
-        subtest_results = pytestrunner.run(path, session, timeout=timeout)
-        return (harness_result, subtest_results)
+    protocol_cls = ServoDriverProtocol

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -117,7 +117,7 @@
     def record(self, test, status, message=None, stack=None):
         if stack is not None:
             stack = str(stack)
-        new_result = (test, status, message, stack)
+        new_result = (test.split("::")[-1], status, message, stack)
         self.results.append(new_result)
 
 

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testrunner.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testrunner.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/testrunner.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -120,6 +120,13 @@
                  executor_browser_cls, executor_browser_kwargs,
                  stop_flag):
     """Launch a TestRunner in a new process"""
+    def log(level, msg):
+        runner_result_queue.put(("log", (level, {"message": msg})))
+
+    def handle_error(e):
+        log("critical", traceback.format_exc())
+        stop_flag.set()
+
     try:
         browser = executor_browser_cls(**executor_browser_kwargs)
         executor = executor_cls(browser, **executor_kwargs)
@@ -128,10 +135,10 @@
                 runner.run()
             except KeyboardInterrupt:
                 stop_flag.set()
-    except Exception:
-        runner_result_queue.put(("log", ("critical", {"message": traceback.format_exc()})))
-        print >> sys.stderr, traceback.format_exc()
-        stop_flag.set()
+            except Exception as e:
+                handle_error(e)
+    except Exception as e:
+        handle_error(e)
     finally:
         runner_command_queue = None
         runner_result_queue = None
@@ -389,6 +396,7 @@
         }
         try:
             command, data = "" 1)
+            self.logger.debug("Got command: %r" % command)
         except IOError:
             self.logger.error("Got IOError from poll")
             return RunnerManagerState.restarting(0)
@@ -676,9 +684,20 @@
             self.browser.cleanup()
         while True:
             try:
-                self.logger.warning(" ".join(map(repr, self.command_queue.get_nowait())))
+                cmd, data = ""
             except Empty:
                 break
+            else:
+                if cmd == "log":
+                     self.log(*data)
+                else:
+                    self.logger.warning("%r: %r" % (cmd, data))
+        while True:
+            try:
+                cmd, data = ""
+                self.logger.warning("%r: %r" % (cmd, data))
+            except Empty:
+                break
 
 
 def make_test_queue(tests, test_source_cls, **test_source_kwargs):

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/update/update.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/update/update.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/update/update.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -11,10 +11,7 @@
 
 def setup_paths(sync_path):
     sys.path.insert(0, os.path.abspath(sync_path))
-    try:
-        from tools import localpaths
-    except ImportError:
-        from wpt_tools import localpaths
+    from tools import localpaths
 
 class LoadConfig(Step):
     """Step for loading configuration from the ini file and kwargs."""

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/webdriver_server.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -195,10 +195,11 @@
 
 
 class ServoDriverServer(WebDriverServer):
-    def __init__(self, logger, binary="servo", binary_args=None, host="127.0.0.1", port=None):
+    def __init__(self, logger, binary="servo", binary_args=None, host="127.0.0.1",
+                 port=None, args=None):
         env = os.environ.copy()
         env["RUST_BACKTRACE"] = "1"
-        WebDriverServer.__init__(self, logger, binary, host=host, port=port, env=env)
+        WebDriverServer.__init__(self, logger, binary, host=host, port=port, env=env, args=args)
         self.binary_args = binary_args
 
     def make_command(self):

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptlogging.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptlogging.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptlogging.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,13 +1,20 @@
 import logging
 import sys
 import threading
+from Queue import Empty
 from StringIO import StringIO
 from multiprocessing import Queue
 
-from mozlog import commandline, stdadapter
+from mozlog import commandline, stdadapter, set_default_logger
+from mozlog.structuredlog import StructuredLogger
 
 def setup(args, defaults):
-    logger = commandline.setup_logging("web-platform-tests", args, defaults)
+    logger = args.pop('log', None)
+    if logger:
+        set_default_logger(logger)
+        StructuredLogger._logger_states["web-platform-tests"] = logger._state
+    else:
+        logger = commandline.setup_logging("web-platform-tests", args, defaults)
     setup_stdlib_logger()
 
     for name in args.keys():
@@ -45,7 +52,6 @@
         return self.inner(data)
 
 
-
 class LogThread(threading.Thread):
     def __init__(self, queue, logger, level):
         self.queue = queue
@@ -120,5 +126,10 @@
                 self.logging_queue.put(None)
                 if self.logging_thread is not None:
                     self.logging_thread.join(10)
+                while not self.logging_queue.empty():
+                    try:
+                        self.logger.warning("Dropping log message: %r", self.logging_queue.get())
+                    except Exception:
+                        pass
                 self.logging_queue.close()
                 self.logger.info("queue closed")

Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/wptrunner.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -201,7 +201,7 @@
                     logger.info("Repetition %i / %i" % (repeat_count, repeat))
 
                 unexpected_count = 0
-                logger.suite_start(test_loader.test_ids, run_info)
+                logger.suite_start(test_loader.test_ids, name='web-platform-test', run_info=run_info)
                 for test_type in kwargs["test_types"]:
                     logger.info("Running %s tests" % test_type)
 
@@ -222,7 +222,7 @@
 
                     executor_cls = executor_classes.get(test_type)
                     executor_kwargs = get_executor_kwargs(test_type,
-                                                          test_environment.external_config,
+                                                          test_environment.config,
                                                           test_environment.cache_manager,
                                                           run_info,
                                                           **kwargs)

Modified: trunk/WebDriverTests/imported/w3c/webdriver/OWNERS (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/OWNERS	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/OWNERS	2018-01-10 11:25:51 UTC (rev 226708)
@@ -4,3 +4,4 @@
 @lukeis
 @mjzffr
 @shs96c
+@whimboo

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/modifier_click.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/modifier_click.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/modifier_click.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -6,30 +6,55 @@
 from tests.actions.support.keys import Keys
 
 
+# Using local fixtures because we want to start a new session between
+# each test, otherwise the clicks in each test interfere with each other.
[email protected](autouse=True)
+def release_actions(mod_click_session, request):
+    request.addfinalizer(mod_click_session.actions.release)
+
+
[email protected]
+def mod_click_session(new_session, url, add_browser_capabilites):
+    _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({})}})
+    session.url = ""
+
+    return session
+
+
[email protected]
+def key_chain(mod_click_session):
+    return mod_click_session.actions.sequence("key", "keyboard_id")
+
+
[email protected]
+def mouse_chain(mod_click_session):
+    return mod_click_session.actions.sequence(
+        "pointer",
+        "pointer_id",
+        {"pointerType": "mouse"})
+
+
 @pytest.mark.parametrize("modifier, prop", [
-    (Keys.CONTROL, "ctrlKey"),
-    (Keys.ALT, "altKey"),
-    (Keys.META, "metaKey"),
-    (Keys.SHIFT, "shiftKey"),
-    (Keys.R_CONTROL, "ctrlKey"),
-    (Keys.R_ALT, "altKey"),
-    (Keys.R_META, "metaKey"),
-    (Keys.R_SHIFT, "shiftKey"),
+   (Keys.ALT, "altKey"),
+   (Keys.R_ALT, "altKey"),
+   (Keys.META, "metaKey"),
+   (Keys.R_META, "metaKey"),
+   (Keys.SHIFT, "shiftKey"),
+   (Keys.R_SHIFT, "shiftKey"),
 ])
-def test_modifier_click(session,
-                       test_actions_page,
+def test_modifier_click(mod_click_session,
                        key_chain,
                        mouse_chain,
                        modifier,
                        prop):
     key_chain \
-        .pause(0) \
+        .pause(200) \
         .key_down(modifier) \
         .pause(200) \
         .key_up(modifier)
-    outer = session.find.css("#outer", all=False)
+    outer = mod_click_session.find.css("#outer", all=False)
     mouse_chain.click(element=outer)
-    session.actions.perform([key_chain.dict, mouse_chain.dict])
+    mod_click_session.actions.perform([key_chain.dict, mouse_chain.dict])
     expected = [
         {"type": "mousemove"},
         {"type": "mousedown"},
@@ -46,29 +71,47 @@
         e.update(defaults)
         if e["type"] != "mousemove":
             e[prop] = True
-    filtered_events = [filter_dict(e, expected[0]) for e in get_events(session)]
+    filtered_events = [filter_dict(e, expected[0]) for e in get_events(mod_click_session)]
     assert expected == filtered_events
 
 
-def test_release_control_click(session, key_reporter, key_chain, mouse_chain):
+def test_many_modifiers_click(mod_click_session, key_chain, mouse_chain):
+    outer = mod_click_session.find.css("#outer", all=False)
     key_chain \
         .pause(0) \
-        .key_down(Keys.CONTROL)
+        .key_down(Keys.CONTROL) \
+        .key_down(Keys.SHIFT) \
+        .pause(0) \
+        .key_up(Keys.CONTROL) \
+        .key_up(Keys.SHIFT)
     mouse_chain \
-        .pointer_move(0, 0, origin=key_reporter) \
+        .pointer_move(0, 0, origin=outer) \
+        .pause(0) \
+        .pointer_down() \
+        .pointer_up() \
+        .pause(0) \
+        .pause(0) \
         .pointer_down()
-    session.actions.perform([key_chain.dict, mouse_chain.dict])
-    session.execute_script("""
-        var keyReporter = document.getElementById("keys");
-        ["mousedown", "mouseup"].forEach((e) => {
-            keyReporter.addEventListener(e, recordPointerEvent);
-          });
-        resetEvents();
-    """)
-    session.actions.release()
+    mod_click_session.actions.perform([key_chain.dict, mouse_chain.dict])
     expected = [
+        {"type": "mousemove"},
+        # shift and ctrl presses
+        {"type": "mousedown"},
         {"type": "mouseup"},
-        {"type": "keyup"},
+        {"type": "click"},
+        # no modifiers pressed
+        {"type": "mousedown"},
     ]
-    events = [filter_dict(e, expected[0]) for e in get_events(session)]
+    defaults = {
+        "altKey": False,
+        "metaKey": False,
+        "shiftKey": False,
+        "ctrlKey": False
+    }
+    for e in expected:
+        e.update(defaults)
+    for e in expected[1:4]:
+        e["shiftKey"] = True
+        e["ctrlKey"] = True
+    events = [filter_dict(e, expected[0]) for e in get_events(mod_click_session)]
     assert events == expected

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,7 +1,8 @@
 import pytest
 
+from tests.actions.support.mouse import assert_move_to_coordinates, get_center
+from tests.actions.support.refine import get_events, filter_dict
 from tests.support.inline import inline
-from tests.actions.support.refine import get_events, filter_dict
 from tests.support.wait import wait
 
 
@@ -10,13 +11,6 @@
     return inline(content)
 
 
-def get_center(rect):
-    return {
-        "x": rect["width"] / 2 + rect["x"],
-        "y": rect["height"] / 2 + rect["y"],
-    }
-
-
 # TODO use pytest.approx once we upgrade to pytest > 3.0
 def approx(n, m, tolerance=1):
     return abs(n - m) <= tolerance
@@ -33,11 +27,8 @@
         .perform()
     events = get_events(session)
     assert len(events) == 4
+    assert_move_to_coordinates(div_point, "outer", events)
     for e in events:
-        if e["type"] != "mousemove":
-            assert e["pageX"] == div_point["x"]
-            assert e["pageY"] == div_point["y"]
-            assert e["target"] == "outer"
         if e["type"] != "mousedown":
             assert e["buttons"] == 0
         assert e["button"] == 0
@@ -89,7 +80,7 @@
             assert e["target"] == "outer"
 
 
-def test_click_navigation(session, url):
+def test_click_navigation(session, url, release_actions):
     destination = url("/webdriver/tests/actions/support/test_actions_wdspec.html")
     start = link_doc(destination)
 
@@ -112,7 +103,12 @@
 @pytest.mark.parametrize("drag_duration", [0, 300, 800])
 @pytest.mark.parametrize("dx, dy",
     [(20, 0), (0, 15), (10, 15), (-20, 0), (10, -15), (-10, -15)])
-def test_drag_and_drop(session, test_actions_page, mouse_chain, dx, dy, drag_duration):
+def test_drag_and_drop(session,
+                       test_actions_page,
+                       mouse_chain,
+                       dx,
+                       dy,
+                       drag_duration):
     drag_target = session.find.css("#dragTarget", all=False)
     initial_rect = drag_target.rect
     initial_center = get_center(initial_rect)

Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse_dblclick.py (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse_dblclick.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/mouse_dblclick.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,108 @@
+import pytest
+
+from tests.actions.support.mouse import assert_move_to_coordinates, get_center
+from tests.actions.support.refine import get_events, filter_dict
+
+
+_DBLCLICK_INTERVAL = 640
+
+
+# Using local fixtures because we want to start a new session between
+# each test, otherwise the clicks in each test interfere with each other.
[email protected](autouse=True)
+def release_actions(dblclick_session, request):
+    # release all actions after each test
+    # equivalent to a teardown_function, but with access to session fixture
+    request.addfinalizer(dblclick_session.actions.release)
+
+
[email protected]
+def dblclick_session(new_session, url, add_browser_capabilites):
+    _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({})}})
+    session.url = ""
+
+    return session
+
+
[email protected]
+def mouse_chain(dblclick_session):
+    return dblclick_session.actions.sequence(
+        "pointer",
+        "pointer_id",
+        {"pointerType": "mouse"})
+
+
[email protected]("click_pause", [0, 200])
+def test_dblclick_at_coordinates(dblclick_session, mouse_chain, click_pause):
+    div_point = {
+        "x": 82,
+        "y": 187,
+    }
+    mouse_chain \
+        .pointer_move(div_point["x"], div_point["y"]) \
+        .click() \
+        .pause(click_pause) \
+        .click() \
+        .perform()
+    events = get_events(dblclick_session)
+    assert_move_to_coordinates(div_point, "outer", events)
+    expected = [
+        {"type": "mousedown", "button": 0},
+        {"type": "mouseup", "button": 0},
+        {"type": "click", "button": 0},
+        {"type": "mousedown", "button": 0},
+        {"type": "mouseup", "button": 0},
+        {"type": "click", "button": 0},
+        {"type": "dblclick", "button": 0},
+    ]
+    assert len(events) == 8
+    filtered_events = [filter_dict(e, expected[0]) for e in events]
+    assert expected == filtered_events[1:]
+
+
+def test_dblclick_with_pause_after_second_pointerdown(dblclick_session, mouse_chain):
+        outer = dblclick_session.find.css("#outer", all=False)
+        center = get_center(outer.rect)
+        mouse_chain \
+            .pointer_move(int(center["x"]), int(center["y"])) \
+            .click() \
+            .pointer_down() \
+            .pause(_DBLCLICK_INTERVAL + 10) \
+            .pointer_up() \
+            .perform()
+        events = get_events(dblclick_session)
+        expected = [
+            {"type": "mousedown", "button": 0},
+            {"type": "mouseup", "button": 0},
+            {"type": "click", "button": 0},
+            {"type": "mousedown", "button": 0},
+            {"type": "mouseup", "button": 0},
+            {"type": "click", "button": 0},
+            {"type": "dblclick", "button": 0},
+        ]
+        assert len(events) == 8
+        filtered_events = [filter_dict(e, expected[0]) for e in events]
+        assert expected == filtered_events[1:]
+
+
+def test_no_dblclick(dblclick_session, mouse_chain):
+        outer = dblclick_session.find.css("#outer", all=False)
+        center = get_center(outer.rect)
+        mouse_chain \
+            .pointer_move(int(center["x"]), int(center["y"])) \
+            .click() \
+            .pause(_DBLCLICK_INTERVAL + 10) \
+            .click() \
+            .perform()
+        events = get_events(dblclick_session)
+        expected = [
+            {"type": "mousedown", "button": 0},
+            {"type": "mouseup", "button": 0},
+            {"type": "click", "button": 0},
+            {"type": "mousedown", "button": 0},
+            {"type": "mouseup", "button": 0},
+            {"type": "click", "button": 0},
+        ]
+        assert len(events) == 7
+        filtered_events = [filter_dict(e, expected[0]) for e in events]
+        assert expected == filtered_events[1:]

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/sequence.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/sequence.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/sequence.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -37,45 +37,3 @@
     session.actions.release()
     assert len(get_keys(key_reporter)) == 0
     assert len(get_events(session)) == 0
-
-
-def test_many_modifiers_click(session, test_actions_page, key_chain, mouse_chain):
-    outer = session.find.css("#outer", all=False)
-    key_chain \
-        .pause(0) \
-        .key_down(Keys.CONTROL) \
-        .key_down(Keys.SHIFT) \
-        .pause(0) \
-        .key_up(Keys.CONTROL) \
-        .key_up(Keys.SHIFT)
-    mouse_chain \
-        .pointer_move(0, 0, origin=outer) \
-        .pause(0) \
-        .pointer_down() \
-        .pointer_up() \
-        .pause(0) \
-        .pause(0) \
-        .pointer_down()
-    session.actions.perform([key_chain.dict, mouse_chain.dict])
-    expected = [
-        {"type": "mousemove"},
-        # shift and ctrl presses
-        {"type": "mousedown"},
-        {"type": "mouseup"},
-        {"type": "click"},
-        # no modifiers pressed
-        {"type": "mousedown"},
-    ]
-    defaults = {
-        "altKey": False,
-        "metaKey": False,
-        "shiftKey": False,
-        "ctrlKey": False
-    }
-    for e in expected:
-        e.update(defaults)
-    for e in expected[1:4]:
-        e["shiftKey"] = True
-        e["ctrlKey"] = True
-    events = [filter_dict(e, expected[0]) for e in get_events(session)]
-    assert events == expected

Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/support/mouse.py (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/support/mouse.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/actions/support/mouse.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,13 @@
+def assert_move_to_coordinates(point, target, events):
+    for e in events:
+        if e["type"] != "mousemove":
+            assert e["pageX"] == point["x"]
+            assert e["pageY"] == point["y"]
+            assert e["target"] == target
+
+
+def get_center(rect):
+    return {
+        "x": rect["width"] / 2 + rect["x"],
+        "y": rect["height"] / 2 + rect["y"],
+    }

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/add_cookie.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/add_cookie.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/add_cookie.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,8 +1,7 @@
 from tests.support.fixtures import clear_all_cookies
-from tests.support.fixtures import server_config
 from datetime import datetime, timedelta
 
-def test_add_domain_cookie(session, url):
+def test_add_domain_cookie(session, url, server_config):
     session.url = ""
     clear_all_cookies(session)
     create_cookie_request = {
@@ -9,7 +8,7 @@
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "web-platform.test",
+            "domain": server_config["domains"][""],
             "path": "/",
             "httpOnly": False,
             "secure": False
@@ -37,9 +36,9 @@
 
     assert cookie["name"] == "hello"
     assert cookie["value"] == "world"
-    assert cookie["domain"] == ".web-platform.test"
+    assert cookie["domain"] == ".%s" % server_config["domains"][""]
 
-def test_add_cookie_for_ip(session, url, server_config):
+def test_add_cookie_for_ip(session, url, server_config, configuration):
     session.url = "" % (server_config["ports"]["http"][0])
     clear_all_cookies(session)
     create_cookie_request = {
@@ -46,7 +45,7 @@
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "127.0.0.1",
+            "domain": configuration["host"],
             "path": "/",
             "httpOnly": False,
             "secure": False
@@ -142,3 +141,37 @@
 
     assert cookie["name"] == "hello"
     assert cookie["value"] == "world"
+
+def test_add_session_cookie_with_leading_dot_character_in_domain(session, url, server_config):
+    session.url = ""
+    clear_all_cookies(session)
+    create_cookie_request = {
+        "cookie": {
+            "name": "hello",
+            "value": "world",
+            "domain": ".%s" % server_config["domains"][""]
+        }
+    }
+    result = session.transport.send("POST", "session/%s/cookie" % session.session_id, create_cookie_request)
+    assert result.status == 200
+    assert "value" in result.body
+    assert isinstance(result.body["value"], dict)
+
+    result = session.transport.send("GET", "session/%s/cookie" % session.session_id)
+    assert result.status == 200
+    assert "value" in result.body
+    assert isinstance(result.body["value"], list)
+    assert len(result.body["value"]) == 1
+    assert isinstance(result.body["value"][0], dict)
+
+    cookie = result.body["value"][0]
+    assert "name" in cookie
+    assert isinstance(cookie["name"], basestring)
+    assert "value" in cookie
+    assert isinstance(cookie["value"], basestring)
+    assert "domain" in cookie
+    assert isinstance(cookie["domain"], basestring)
+
+    assert cookie["name"] == "hello"
+    assert cookie["value"] == "world"
+    assert cookie["domain"] == ".%s" % server_config["domains"][""]

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/get_named_cookie.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/get_named_cookie.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/cookies/get_named_cookie.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -61,7 +61,7 @@
     # convert from seconds since epoch
     assert datetime.utcfromtimestamp(cookie["expiry"]).strftime(utc_string_format) == a_year_from_now
 
-def test_duplicated_cookie(session, url):
+def test_duplicated_cookie(session, url, server_config):
     session.url = ""
     clear_all_cookies(session)
     create_cookie_request = {
@@ -68,7 +68,7 @@
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "web-platform.test",
+            "domain": server_config["domains"][""],
             "path": "/",
             "httpOnly": False,
             "secure": False
@@ -79,7 +79,7 @@
     assert "value" in result.body
     assert isinstance(result.body["value"], dict)
 
-    session.url = "" = 'hello=newworld; domain=web-platform.test; path=/';</script>")
+    session.url = "" = 'hello=newworld; domain=%s; path=/';</script>" % server_config["domains"][""])
     result = session.transport.send("GET", "session/%s/cookie" % session.session_id)
     assert result.status == 200
     assert "value" in result.body

Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/__init__.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py) ( => )


Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element.py)
===================================================================
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,83 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def find_element(session, using, value):
+    return session.transport.send("POST",
+                                  "session/%s/element" % session.session_id,
+                                  {"using": using, "value": value})
+
+
+# 12.2 Find Element
+
[email protected]("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+    # Step 1 - 2
+    response = find_element(session, using, "value")
+    assert_error(response, "invalid argument")
+
+
[email protected]("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+    # Step 3 - 4
+    response = find_element(session, "css selector", value)
+    assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+    # Step 5
+    new_window = create_window()
+    session.window_handle = new_window
+    session.close()
+
+    response = find_element(session, "css selector", "foo")
+
+    assert_error(response, "no such window")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//a")])
+def test_find_element(session, using, value):
+    # Step 8 - 9
+    session.url = "" href=# id=linkText>full link text</a>")
+
+    response = find_element(session, using, value)
+    assert_success(response)
+
+
[email protected]("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+    # Step 8 - 9
+    response = find_element(session, using, value)
+    assert_error(response, "no such element")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//*[name()='a']")])
+def test_xhtml_namespace(session, using, value):
+    session.url = "" href="" id="linkText">full link text</a>""", doctype="xhtml")
+    expected = session.execute_script("return document.links[0]")
+
+    response = find_element(session, using, value)
+    value = assert_success(response)
+    assert_same_element(session, value, expected)
+
+
[email protected]("using,value",
+                         [("css selector", ":root"),
+                          ("tag name", "html"),
+                          ("xpath", "/html")])
+def test_htmldocument(session, using, value):
+    session.url = ""
+    response = find_element(session, using, value)
+    assert_success(response)

Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element_from_element.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_element.py) (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element_from_element.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_element_from_element.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,82 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def find_element(session, element, using, value):
+    return session.transport.send("POST",
+                                  "session/%s/element/%s/element" % (session.session_id, element),
+                                  {"using": using, "value": value})
+
+
[email protected]("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+    # Step 1 - 2
+    response = find_element(session, "notReal", using, "value")
+    assert_error(response, "invalid argument")
+
+
[email protected]("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+    # Step 3 - 4
+    response = find_element(session, "notReal", "css selector", value)
+    assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+    # Step 5
+    new_window = create_window()
+    session.window_handle = new_window
+    session.close()
+
+    response = find_element(session, "notReal", "css selector", "foo")
+
+    assert_error(response, "no such window")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//a")])
+def test_find_element(session, using, value):
+    # Step 8 - 9
+    session.url = "" href=# id=linkText>full link text</a></div>")
+    element = session.find.css("div", all=False)
+    response = find_element(session, element.id, using, value)
+    assert_success(response)
+
+
[email protected]("using,value",[("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+    # Step 8 - 9
+    session.url = ""
+    element = session.find.css("div", all=False)
+    response = find_element(session, element.id, using, value)
+    assert_error(response, "no such element")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//*[name()='a']")])
+def test_xhtml_namespace(session, using, value):
+    session.url = "" href="" id="linkText">full link text</a></p>""", doctype="xhtml")
+    from_element = session.execute_script("""return document.querySelector("p")""")
+    expected = session.execute_script("return document.links[0]")
+
+    response = find_element(session, from_element.id, using, value)
+    value = assert_success(response)
+    assert_same_element(session, value, expected)
+
+
+def test_parent_htmldocument(session):
+    session.url = ""
+    from_element = session.execute_script("return document.documentElement")
+
+    response = find_element(session, from_element.id, "xpath", "..")
+    assert_success(response)

Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_elements.py) (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,91 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def find_elements(session, using, value):
+    return session.transport.send("POST",
+                                  "session/%s/elements" % session.session_id,
+                                  {"using": using, "value": value})
+
+
[email protected]("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+    # Step 1 - 2
+    response = find_elements(session, using, "value")
+    assert_error(response, "invalid argument")
+
+
[email protected]("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+    # Step 3 - 4
+    response = find_elements(session, "css selector", value)
+    assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+    # Step 5
+    new_window = create_window()
+    session.window_handle = new_window
+    session.close()
+
+    response = session.transport.send("POST",
+                                      "session/%s/elements" % session.session_id,
+                                      {"using": "css selector", "value": "foo"})
+
+    assert_error(response, "no such window")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//a")])
+def test_find_elements(session, using, value):
+    # Step 8 - 9
+    session.url = "" href=# id=linkText>full link text</a>")
+
+    response = find_elements(session, using, value)
+    assert_success(response)
+    assert len(response.body["value"]) == 1
+
+
[email protected]("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+    # Step 8 - 9
+    response = find_elements(session, using, value)
+    assert_success(response)
+    assert response.body["value"] == []
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//*[name()='a']")])
+def test_xhtml_namespace(session, using, value):
+    session.url = "" href="" id="linkText">full link text</a></p>""", doctype="xhtml")
+    expected = session.execute_script("return document.links[0]")
+
+    response = find_elements(session, using, value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
[email protected]("using,value",
+                         [("css selector", ":root"),
+                          ("tag name", "html"),
+                          ("xpath", "/html")])
+def test_htmldocument(session, using, value):
+    session.url = ""
+    response = find_elements(session, using, value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1

Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements_from_element.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/find_element_from_elements.py) (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements_from_element.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_retrieval/find_elements_from_element.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,87 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+from tests.support.inline import inline
+
+
+def find_elements(session, element, using, value):
+    return session.transport.send("POST",
+                                  "session/%s/element/%s/elements" % (session.session_id, element),
+                                  {"using": using, "value": value})
+
[email protected]("using", [("a"), (True), (None), (1), ([]), ({})])
+def test_invalid_using_argument(session, using):
+    # Step 1 - 2
+    response = find_elements(session, "notReal", using, "value")
+    assert_error(response, "invalid argument")
+
+
[email protected]("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+    # Step 3 - 4
+    response = find_elements(session, "notReal", "css selector", value)
+    assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+    # Step 5
+    new_window = create_window()
+    session.window_handle = new_window
+    session.close()
+
+    response = find_elements(session, "notReal", "css selector", "foo")
+
+    assert_error(response, "no such window")
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//a")])
+def test_find_elements(session, using, value):
+    # Step 8 - 9
+    session.url = "" href=# id=linkText>full link text</a></div>")
+    element = session.find.css("div", all=False)
+    response = find_elements(session, element.id, using, value)
+    assert_success(response)
+
+
[email protected]("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+    # Step 8 - 9
+    session.url = ""
+    element = session.find.css("div", all=False)
+    response = find_elements(session, element.id, using, value)
+    assert response.body["value"] == []
+
+
[email protected]("using,value",
+                         [("css selector", "#linkText"),
+                          ("link text", "full link text"),
+                          ("partial link text", "link text"),
+                          ("tag name", "a"),
+                          ("xpath", "//*[name()='a']")])
+def test_xhtml_namespace(session, using, value):
+    session.url = "" href="" id="linkText">full link text</a></p>""", doctype="xhtml")
+    from_element = session.execute_script("""return document.querySelector("p")""")
+    expected = session.execute_script("return document.links[0]")
+
+    response = find_elements(session, from_element.id, using, value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
+def test_parent_htmldocument(session):
+    session.url = ""
+    from_element = session.execute_script("return document.documentElement")
+
+    response = find_elements(session, from_element.id, "xpath", "..")
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1

Copied: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/__init__.py (from rev 226705, trunk/WebDriverTests/imported/w3c/webdriver/tests/retrieval/__init__.py) ( => )


Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/interactability.py
===================================================================
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/interactability.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/interactability.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,136 @@
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+from tests.support.inline import iframe, inline
+
+
+def send_keys_to_element(session, element, text):
+    return session.transport.send(
+        "POST",
+        "/session/{session_id}/element/{element_id}/value".format(
+            session_id=session.session_id,
+            element_id=element.id),
+        {"text": text})
+
+
+def test_body_is_interactable(session):
+    session.url = ""
+        <body _onkeypress_="document.getElementById('result').value += event.key">
+          <input type="text" id="result"/>
+        </body>
+    """)
+
+    element = session.find.css("body", all=False)
+    result = session.find.css("input", all=False)
+
+    # By default body is the active element
+    assert_same_element(session, element, session.active_element)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+    assert_same_element(session, element, session.active_element)
+    assert result.property("value") == "foo"
+
+
+def test_document_element_is_interactable(session):
+    session.url = ""
+        <html _onkeypress_="document.getElementById('result').value += event.key">
+          <input type="text" id="result"/>
+        </html>
+    """)
+
+    body = session.find.css("body", all=False)
+    element = session.find.css(":root", all=False)
+    result = session.find.css("input", all=False)
+
+    # By default body is the active element
+    assert_same_element(session, body, session.active_element)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+    assert_same_element(session, element, session.active_element)
+    assert result.property("value") == "foo"
+
+
+def test_iframe_is_interactable(session):
+    session.url = ""
+        <body _onkeypress_="document.getElementById('result').value += event.key">
+          <input type="text" id="result"/>
+        </body>
+    """))
+
+    body = session.find.css("body", all=False)
+    frame = session.find.css("iframe", all=False)
+
+    # By default the body has the focus
+    assert_same_element(session, body, session.active_element)
+
+    response = send_keys_to_element(session, frame, "foo")
+    assert_success(response)
+    assert_same_element(session, frame, session.active_element)
+
+    # Any key events are immediately routed to the nested
+    # browsing context's active document.
+    session.switch_frame(frame)
+    result = session.find.css("input", all=False)
+    assert result.property("value") == "foo"
+
+
+def test_transparent_element(session):
+    session.url = "" style=\"opacity: 0;\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+    assert element.property("value") == "foo"
+
+
+def test_readonly_element(session):
+    session.url = "" readonly>")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+    assert element.property("value") == ""
+
+
+def test_obscured_element(session):
+    session.url = ""
+      <input type="text" />
+      <div style="position: relative; top: -3em; height: 5em; background-color: blue"></div>
+    """)
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+    assert element.property("value") == "foo"
+
+
+def test_not_a_focusable_element(session):
+    session.url = ""
+    element = session.find.css("div", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_error(response, "element not interactable")
+
+
+def test_not_displayed_element(session):
+    session.url = "" style=\"display: none\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_error(response, "element not interactable")
+
+
+def test_hidden_element(session):
+    session.url = "" style=\"visibility: hidden\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_error(response, "element not interactable")
+
+
+def test_disabled_element(session):
+    session.url = "" disabled=\"false\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_error(response, "element not interactable")

Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/scroll_into_view.py (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/scroll_into_view.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/element_send_keys/scroll_into_view.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,78 @@
+from tests.support.asserts import assert_success
+from tests.support.fixtures import is_element_in_viewport
+from tests.support.inline import inline
+
+
+def send_keys_to_element(session, element, text):
+    return session.transport.send(
+        "POST",
+        "/session/{session_id}/element/{element_id}/value".format(
+            session_id=session.session_id,
+            element_id=element.id),
+        {"text": text})
+
+
+def test_element_outside_of_not_scrollable_viewport(session):
+    session.url = "" style=\"position: relative; left: -9999px;\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+
+    assert not is_element_in_viewport(session, element)
+
+
+def test_element_outside_of_scrollable_viewport(session):
+    session.url = "" style=\"margin-top: 102vh;\">")
+    element = session.find.css("input", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+
+    assert is_element_in_viewport(session, element)
+
+
+def test_option_select_container_outside_of_scrollable_viewport(session):
+    session.url = ""
+        <select style="margin-top: 102vh;">
+          <option value="foo">foo</option>
+          <option value="bar" id="bar">bar</option>
+        </select>
+    """)
+    element = session.find.css("option#bar", all=False)
+    select = session.find.css("select", all=False)
+
+    response = send_keys_to_element(session, element, "bar")
+    assert_success(response)
+
+    assert is_element_in_viewport(session, select)
+    assert is_element_in_viewport(session, element)
+
+
+def test_option_stays_outside_of_scrollable_viewport(session):
+    session.url = ""
+        <select multiple style="height: 105vh; margin-top: 100vh;">
+          <option value="foo" id="foo" style="height: 100vh;">foo</option>
+          <option value="bar" id="bar" style="background-color: yellow;">bar</option>
+        </select>
+    """)
+    select = session.find.css("select", all=False)
+    option_foo = session.find.css("option#foo", all=False)
+    option_bar = session.find.css("option#bar", all=False)
+
+    response = send_keys_to_element(session, option_bar, "bar")
+    assert_success(response)
+
+    assert is_element_in_viewport(session, select)
+    assert is_element_in_viewport(session, option_foo)
+    assert not is_element_in_viewport(session, option_bar)
+
+
+def test_contenteditable_element_outside_of_scrollable_viewport(session):
+    session.url = "" contenteditable style=\"margin-top: 102vh;\"></div>")
+    element = session.find.css("div", all=False)
+
+    response = send_keys_to_element(session, element, "foo")
+    assert_success(response)
+
+    assert is_element_in_viewport(session, element)

Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/execute_script/cyclic.py (0 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/execute_script/cyclic.py	                        (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/execute_script/cyclic.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -0,0 +1,48 @@
+from tests.support.asserts import assert_error
+
+
+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(
+            session_id=session.session_id),
+        body)
+
+
+def test_array(session):
+    response = execute_script(session, """
+        let arr = [];
+        arr.push(arr);
+        return arr;
+        """)
+    assert_error(response, "_javascript_ error")
+
+
+def test_object(session):
+    response = execute_script(session, """
+        let obj = {};
+        obj.reference = obj;
+        return obj;
+        """)
+    assert_error(response, "_javascript_ error")
+
+
+def test_array_in_object(session):
+    response = execute_script(session, """
+        let arr = [];
+        arr.push(arr);
+        return {arr};
+        """)
+    assert_error(response, "_javascript_ error")
+
+
+def test_object_in_array(session):
+    response = execute_script(session, """
+        let obj = {};
+        obj.reference = obj;
+        return [obj];
+        """)
+    assert_error(response, "_javascript_ error")

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/get_window_rect.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/get_window_rect.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/get_window_rect.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -151,11 +151,10 @@
     assert response.status == 200
     assert isinstance(response.body["value"], dict)
     value = response.body["value"]
-    assert "width" in value
-    assert "height" in value
-    assert "x" in value
-    assert "y" in value
-    assert isinstance(value["width"], int)
-    assert isinstance(value["height"], int)
-    assert isinstance(value["x"], int)
-    assert isinstance(value["y"], int)
+    expected = session.execute_script("""return {
+         x: window.screenX,
+         y: window.screenY,
+         width: window.outerWidth,
+         height: window.outerHeight
+    }""")
+    assert expected == value

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/interface.html (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/interface.html	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/interface.html	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,15 +1,38 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>WebDriver interface test</title>
-<script src=""
-<script src=""
+<!DOCTYPE html>
+<body>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
+<script type=text/plain class=untested>
+[Exposed=Window]
+interface Navigator {
+  // objects implementing this interface also implement the interfaces given below
+};
+</script>
+<script type=text/plain>
+Navigator includes NavigatorAutomationInformation;
 
+interface mixin NavigatorAutomationInformation {
+    readonly attribute boolean webdriver;
+    // always returns true
+};
+</script>
 <script>
-var t = new IdlArray();
-t.add_untested_idls("interface Navigator {};");
-t.add_idls("partial interface Navigator { readonly attribute boolean webdriver; };");
-t.add_objects({Navigator: ["navigator"]});
-t.test();
+"use strict";
+
+if ("webdriver" in navigator) {
+  test(() => assert_true(navigator.webdriver), "navigator.webdriver is always true");
+  var idlArray = new IdlArray();
+  [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
+    if (node.className == "untested") {
+      idlArray.add_untested_idls(node.textContent);
+    } else {
+      idlArray.add_idls(node.textContent);
+    }
+  });
+  idlArray.test();
+} else {
+  done();
+}
 </script>

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/navigation/current_url.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/navigation/current_url.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/navigation/current_url.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -4,6 +4,7 @@
 
 from tests.support.inline import inline
 from tests.support.asserts import assert_error, assert_success
+from tests.support.wait import wait
 
 alert_doc = inline("<script>window.alert()</script>")
 frame_doc = inline("<p>frame")
@@ -75,8 +76,11 @@
     assert_error(result, "invalid argument")
 
 def test_get_current_url_after_modified_location(session):
+    start = session.transport.send("GET", "session/%s/url" % session.session_id)
     session.execute_script("window.location.href = ''")
-
+    wait(session,
+         lambda s: s.transport.send("GET", "session/%s/url" % session.session_id) != start.body["value"],
+         "URL did not change")
     result = session.transport.send("GET", "session/%s/url" % session.session_id)
 
     assert_success(result, "about:blank#wd_test_modification")

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -1,5 +1,6 @@
 from webdriver import Element, WebDriverException
 
+
 # WebDriver specification ID: dfn-error-response-data
 errors = {
     "element click intercepted": 400,
@@ -32,6 +33,7 @@
     "unsupported operation": 500,
 }
 
+
 # WebDriver specification ID: dfn-send-an-error
 #
 # > When required to send an error, with error code, a remote end must run the
@@ -98,7 +100,7 @@
     except:
         assert (result.status == 200 and
                 result.body["value"] != expected_text), (
-               "Dialog with text '%s' was not handled." % expected_text)
+            "Dialog with text '%s' was not handled." % expected_text)
 
 
 def assert_same_element(session, a, b):
@@ -123,7 +125,7 @@
         return
 
     message = ("Expected element references to describe the same element, " +
-        "but they did not.")
+               "but they did not.")
 
     # Attempt to provide more information, accounting for possible errors such
     # as stale element references or not visible elements.

Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py (226707 => 226708)


--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py	2018-01-10 10:44:37 UTC (rev 226707)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py	2018-01-10 11:25:51 UTC (rev 226708)
@@ -267,3 +267,19 @@
 def clear_all_cookies(session):
     """Removes all cookies associated with the current active document"""
     session.transport.send("DELETE", "session/%s/cookie" % session.session_id)
+
+
+def is_element_in_viewport(session, element):
+    """Check if element is outside of the viewport"""
+    return session.execute_script("""
+        let el = arguments[0];
+
+        let rect = el.getBoundingClientRect();
+        let viewport = {
+          height: window.innerHeight || document.documentElement.clientHeight,
+          width: window.innerWidth || document.documentElement.clientWidth,
+        };
+
+        return !(rect.right < 0 || rect.bottom < 0 ||
+            rect.left > viewport.width || rect.top > viewport.height)
+    """, args=(element,))
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to