Diff
Modified: trunk/WebDriverTests/ChangeLog (288870 => 288871)
--- trunk/WebDriverTests/ChangeLog 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/ChangeLog 2022-02-01 10:32:27 UTC (rev 288871)
@@ -1,3 +1,22 @@
+2022-02-01 Carlos Garcia Campos <[email protected]>
+
+ Unreviewed. Update W3C WebDriver imported tests.
+
+ * imported/w3c/importer.json:
+ * imported/w3c/tools/webdriver/webdriver/bidi/client.py:
+ * imported/w3c/tools/webdriver/webdriver/client.py:
+ * imported/w3c/tools/wptrunner/wptrunner/browsers/firefox_android.py:
+ * imported/w3c/webdriver/tests/conftest.py:
+ * imported/w3c/webdriver/tests/find_element_from_shadow_root/find.py:
+ * imported/w3c/webdriver/tests/find_element_from_shadow_root/user_prompts.py:
+ * imported/w3c/webdriver/tests/find_elements_from_shadow_root/find.py:
+ * imported/w3c/webdriver/tests/find_elements_from_shadow_root/user_prompts.py:
+ * imported/w3c/webdriver/tests/print/printcmd.py:
+ * imported/w3c/webdriver/tests/support/asserts.py:
+ * imported/w3c/webdriver/tests/support/fixtures.py:
+ * imported/w3c/webdriver/tests/support/fixtures_bidi.py: Added.
+ * imported/w3c/webdriver/tests/support/fixtures_http.py: Added.
+
2021-11-19 Lauro Moura <[email protected]>
[GLIB][WebDriver] Gardening COOP-related timeouts
Modified: trunk/WebDriverTests/TestExpectations.json (288870 => 288871)
--- trunk/WebDriverTests/TestExpectations.json 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/TestExpectations.json 2022-02-01 10:32:27 UTC (rev 288871)
@@ -1589,6 +1589,9 @@
"imported/w3c/webdriver/tests/bidi/new_session/connect.py": {
"expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230615"}}
},
+ "imported/w3c/webdriver/tests/bidi/session_subscribe/subscribe.py": {
+ "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230615"}}
+ },
"imported/w3c/webdriver/tests/new_session/websocket_url.py": {
"expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230615"}}
}
Modified: trunk/WebDriverTests/imported/w3c/importer.json (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/importer.json 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/importer.json 2022-02-01 10:32:27 UTC (rev 288871)
@@ -1,6 +1,6 @@
{
"repository": "https://github.com/w3c/web-platform-tests.git",
- "revision": "eb8bdce552a2a9b10010f7755ed9d8d0773d548e",
+ "revision": "db065869e8ff859e7d297b04b21115a9669da745",
"paths_to_import": [
"tools/webdriver",
"tools/wptrunner",
Modified: trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/bidi/client.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/bidi/client.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/bidi/client.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -9,17 +9,11 @@
import websockets
+from .error import from_error_details
logger = logging.getLogger("webdriver.bidi")
-class BidiException(Exception):
- def __init__(self, err: str, msg: str, stack: Optional[str] = None):
- self.err = err
- self.msg = msg
- self.stack = stack
-
-
def get_running_loop() -> asyncio.AbstractEventLoop:
if sys.version_info >= (3, 7):
return asyncio.get_running_loop()
@@ -183,9 +177,10 @@
elif "error" in data and "message" in data:
assert isinstance(data["error"], str)
assert isinstance(data["message"], str)
- future.set_exception(BidiException(data["error"],
- data["message"],
- data.get("stacktrace")))
+ exception = from_error_details(data["error"],
+ data["message"],
+ data.get("stacktrace"))
+ future.set_exception(exception)
else:
raise ValueError(f"Unexpected message: {data!r}")
elif "method" in data and "params" in data:
@@ -365,9 +360,9 @@
@command
def subscribe(self,
- events: Optional[List[str]] = None,
+ events: List[str],
contexts: Optional[List[str]] = None) -> Mapping[str, Any]:
- params: MutableMapping[str, Any] = {"events": events if events is not None else []}
+ params: MutableMapping[str, Any] = {"events": events}
if contexts is not None:
params["contexts"] = contexts
return params
Modified: trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/tools/webdriver/webdriver/client.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -392,7 +392,7 @@
@classmethod
def from_json(cls, json, session):
uuid = json[ShadowRoot.identifier]
- return cls(uuid, session)
+ return cls(session, uuid)
def send_shadow_command(self, method, uri, body=None):
url = "" uri)
Modified: trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox_android.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox_android.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/tools/wptrunner/wptrunner/browsers/firefox_android.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -8,13 +8,14 @@
browser_command)
from ..executors.executormarionette import (MarionetteTestharnessExecutor, # noqa: F401
MarionetteRefTestExecutor, # noqa: F401
- MarionetteCrashtestExecutor) # noqa: F401
+ MarionetteCrashtestExecutor, # noqa: F401
+ MarionetteWdspecExecutor) # noqa: F401
from .base import (Browser,
ExecutorBrowser)
from .firefox import (get_timeout_multiplier, # noqa: F401
run_info_extras as fx_run_info_extras,
update_properties, # noqa: F401
- executor_kwargs, # noqa: F401
+ executor_kwargs as fx_executor_kwargs, # noqa: F401
ProfileCreator as FirefoxProfileCreator)
@@ -23,7 +24,8 @@
"browser": "FirefoxAndroidBrowser",
"executor": {"testharness": "MarionetteTestharnessExecutor",
"reftest": "MarionetteRefTestExecutor",
- "crashtest": "MarionetteCrashtestExecutor"},
+ "crashtest": "MarionetteCrashtestExecutor",
+ "wdspec": "MarionetteWdspecExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
@@ -66,6 +68,15 @@
"specialpowers_path": kwargs["specialpowers_path"]}
+def executor_kwargs(logger, test_type, test_environment, run_info_data,
+ **kwargs):
+ rv = fx_executor_kwargs(logger, test_type, test_environment, run_info_data,
+ **kwargs)
+ if test_type == "wdspec":
+ rv["capabilities"]["moz:firefoxOptions"]["androidPackage"] = kwargs["package_name"]
+ return rv
+
+
def env_extras(**kwargs):
return []
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/conftest.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/conftest.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/conftest.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -1 +1,5 @@
-pytest_plugins = "tests.support.fixtures"
+pytest_plugins = (
+ "tests.support.fixtures",
+ "tests.support.fixtures_bidi",
+ "tests.support.fixtures_http",
+)
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/find.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/find.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/find.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -54,7 +54,7 @@
shadow_root = custom_element.shadow_root
session.refresh()
- response = find_element(session, shadow_root.id, "css", "input")
+ response = find_element(session, shadow_root.id, "css selector", "input")
assert_error(response, "detached shadow root")
@@ -64,7 +64,7 @@
expected = session.execute_script("return arguments[0].shadowRoot.querySelector('input')",
args=(custom_element,))
shadow_root = custom_element.shadow_root
- response = find_element(session, shadow_root.id, "css", "input")
+ response = find_element(session, shadow_root.id, "css selector", "input")
value = assert_success(response)
assert_same_element(session, value, expected)
@@ -83,7 +83,7 @@
args=(custom_element,))
shadow_root = custom_element.shadow_root
response = find_element(session, shadow_root.id, using, value)
- assert_success(response)
+ value = assert_success(response)
assert_same_element(session, value, expected)
@@ -104,7 +104,7 @@
shadow_root = custom_element.shadow_root
response = find_element(session, shadow_root.id, "link text", value)
- assert_success(response)
+ value = assert_success(response)
assert_same_element(session, value, expected)
@@ -126,7 +126,7 @@
shadow_root = custom_element.shadow_root
response = find_element(session, shadow_root.id, "partial link text", value)
- assert_success(response)
+ value = assert_success(response)
assert_same_element(session, value, expected)
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/user_prompts.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/user_prompts.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/find_element_from_shadow_root/user_prompts.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -14,7 +14,7 @@
return session.transport.send(
"POST", "session/{session_id}/shadow/{shadow_id}/element".format(
session_id=session.session_id,
- element_id=shadow_id),
+ shadow_id=shadow_id),
{"using": using, "value": value})
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/find.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/find.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/find.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -13,8 +13,8 @@
{"using": using, "value": value})
-def test_null_parameter_value(session, http, inline):
- session.url = "" href=# id=linkText>full link text</a></div>")
+def test_null_parameter_value(session, http, get_shadow_page):
+ session.url = "" href=# id=linkText>full link text</a></div>")
custom_element = session.find.css("custom-shadow-element", all=False)
shadow_root = custom_element.shadow_root
@@ -54,7 +54,7 @@
shadow_root = custom_element.shadow_root
session.refresh()
- response = find_elements(session, shadow_root.id, "css", "input")
+ response = find_elements(session, shadow_root.id, "css selector", "input")
assert_error(response, "detached shadow root")
@@ -62,7 +62,7 @@
session.url = "" id='check' type='checkbox'/><input id='text'/></div>")
custom_element = session.find.css("custom-shadow-element", all=False)
shadow_root = custom_element.shadow_root
- response = find_elements(session, shadow_root.id, "css", "input")
+ response = find_elements(session, shadow_root.id, "css selector", "input")
assert_success(response)
@@ -92,7 +92,6 @@
def test_find_elements_link_text(session, get_shadow_page, document, value):
# Step 8 - 9
session.url = "" href="" wanted</a><br/>{0}</div>".format(document))
- element = session.find.css("div", all=False)
custom_element = session.find.css("custom-shadow-element", all=False)
shadow_root = custom_element.shadow_root
expected = session.execute_script("return arguments[0].shadowRoot.querySelectorAll('a')[1]",
@@ -119,7 +118,6 @@
def test_find_elements_partial_link_text(session, get_shadow_page, document, value):
# Step 8 - 9
session.url = "" href="" wanted</a><br/>{0}</div>".format(document))
- element = session.find.css("div", all=False)
custom_element = session.find.css("custom-shadow-element", all=False)
shadow_root = custom_element.shadow_root
expected = session.execute_script("return arguments[0].shadowRoot.querySelectorAll('a')[1]",
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/user_prompts.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/user_prompts.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/find_elements_from_shadow_root/user_prompts.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -14,7 +14,7 @@
return session.transport.send(
"POST", "session/{session_id}/shadow/{shadow_id}/elements".format(
session_id=session.session_id,
- element_id=shadow_id),
+ shadow_id=shadow_id),
{"using": using, "value": value})
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/print/printcmd.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -41,7 +41,42 @@
# TODO: Test that the output is reasonable
assert_pdf(pdf)
+def test_large_html_document(session, inline):
+ session.url = "" id=\"image\"></canvas>")
+ session.execute_script(
+ """
+ const width = 700;
+ const height = 900;
+
+ const canvas = document.getElementById("image");
+ const context = canvas.getContext("2d");
+
+ canvas.width = width;
+ canvas.height = height;
+
+ for (let x = 0; x < width; ++x) {
+ for (let y = 0; y < height; ++y) {
+ const colourHex = Math.floor(Math.random() * 0xffffff).toString(16);
+
+ context.fillStyle = `#${colourHex}`;
+ context.fillRect(x, y, 1, 1);
+ }
+ }
+ """
+ )
+
+ response = do_print(session, {})
+ value = assert_success(response)
+ pdf = decodebytes(value.encode())
+
+ # This was added to test the fix for a bug in firefox where a PDF larger
+ # than 500kb would cause an error. If the resulting PDF is smaller than that
+ # it could pass incorrectly.
+ assert len(pdf) > 500000
+ assert_pdf(pdf)
+
+
@pytest.mark.parametrize("options", [{"orientation": 0},
{"orientation": "foo"},
{"scale": "1"},
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/asserts.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -7,6 +7,7 @@
# WebDriver specification ID: dfn-error-response-data
errors = {
+ "detached shadow root": 404,
"element click intercepted": 400,
"element not selectable": 400,
"element not interactable": 400,
@@ -23,6 +24,7 @@
"no such cookie": 404,
"no such element": 404,
"no such frame": 404,
+ "no such shadow root": 404,
"no such window": 404,
"script timeout": 500,
"session not created": 500,
Modified: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py (288870 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py 2022-02-01 10:26:28 UTC (rev 288870)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -12,7 +12,6 @@
from tests.support.helpers import cleanup_session, deep_update
from tests.support.inline import build_inline
from tests.support.http_request import HTTPRequest
-from tests.support.sync import Poll
_current_session = None
@@ -21,8 +20,10 @@
def pytest_configure(config):
# register the capabilities marker
- config.addinivalue_line("markers",
- "capabilities: mark test to use capabilities")
+ config.addinivalue_line(
+ "markers",
+ "capabilities: mark test to use capabilities"
+ )
@pytest.fixture
@@ -38,9 +39,9 @@
metafunc.parametrize("capabilities", marker.args, ids=None)
-# Ensure that the event loop is restarted once per session rather than the default of once per test
-# if we don't do this, tests will try to reuse a closed event loop and fail with an error that the "future
-# belongs to a different loop"
+# Ensure that the event loop is restarted once per session rather than the default
+# of once per test. If we don't do this, tests will try to reuse a closed event
+# loop and fail with an error that the "future belongs to a different loop".
@pytest.fixture(scope="session")
def event_loop():
"""Change event_loop fixture to session level."""
@@ -50,55 +51,6 @@
@pytest.fixture
-def add_event_listeners(session):
- """Register listeners for tracked events on element."""
- def add_event_listeners(element, tracked_events):
- element.session.execute_script("""
- let element = arguments[0];
- let trackedEvents = arguments[1];
-
- if (!("events" in window)) {
- window.events = [];
- }
-
- for (var i = 0; i < trackedEvents.length; i++) {
- element.addEventListener(trackedEvents[i], function (event) {
- window.events.push(event.type);
- });
- }
- """, args=(element, tracked_events))
- return add_event_listeners
-
-
[email protected]
-def create_cookie(session, url):
- """Create a cookie"""
- def create_cookie(name, value, **kwargs):
- if kwargs.get("path", None) is not None:
- session.url = ""
-
- session.set_cookie(name, value, **kwargs)
- return session.cookies(name)
-
- return create_cookie
-
-
[email protected]
-def create_frame(session):
- """Create an `iframe` element in the current browsing context and insert it
- into the document. Return a reference to the newly-created element."""
- def create_frame():
- append = """
- var frame = document.createElement('iframe');
- document.body.appendChild(frame);
- return frame;
- """
- return session.execute_script(append)
-
- return create_frame
-
-
[email protected]
def http(configuration):
return HTTPRequest(configuration["host"], configuration["port"])
@@ -122,14 +74,14 @@
}
-async def reset_current_session_if_necessary(caps, request_bidi):
+async def reset_current_session_if_necessary(caps):
global _current_session
- # If there is a session with different capabilities active or the current session
- # is of different type than the one we would like to create, end it now.
+ # If there is a session with different requested capabilities active than
+ # the one we would like to create, end it now.
if _current_session is not None:
- is_bidi = isinstance(_current_session, webdriver.BidiSession)
- if is_bidi != request_bidi or not _current_session.match(caps):
+ if not _current_session.match(caps):
+ is_bidi = isinstance(_current_session, webdriver.BidiSession)
if is_bidi:
await _current_session.end()
else:
@@ -144,7 +96,8 @@
By default the session will stay open after each test, but we always try to start a
new one and assume that if that fails there is already a valid session. This makes it
possible to recover from some errors that might leave the session in a bad state, but
- does not demand that we start a new session per test."""
+ does not demand that we start a new session per test.
+ """
global _current_session
# Update configuration capabilities with custom ones from the
@@ -153,7 +106,7 @@
deep_update(caps, capabilities)
caps = {"alwaysMatch": caps}
- await reset_current_session_if_necessary(caps, False)
+ await reset_current_session_if_necessary(caps)
if _current_session is None:
_current_session = webdriver.Session(
@@ -168,8 +121,9 @@
raise
# Enforce a fixed default window size and position
- _current_session.window.size = defaults.WINDOW_SIZE
- _current_session.window.position = defaults.WINDOW_POSITION
+ if _current_session.capabilities.get("setWindowRect"):
+ _current_session.window.size = defaults.WINDOW_SIZE
+ _current_session.window.position = defaults.WINDOW_POSITION
yield _current_session
@@ -178,21 +132,25 @@
@pytest.fixture(scope="function")
async def bidi_session(capabilities, configuration, request):
- """Create and start a bidi session for a test that does not itself test
- bidi session creation.
+ """Create and start a bidi session.
+
+ Can be used for a test that does not itself test bidi session creation.
+
By default the session will stay open after each test, but we always try to start a
new one and assume that if that fails there is already a valid session. This makes it
possible to recover from some errors that might leave the session in a bad state, but
- does not demand that we start a new session per test."""
+ does not demand that we start a new session per test.
+ """
global _current_session
# Update configuration capabilities with custom ones from the
# capabilities fixture, which can be set by tests
caps = copy.deepcopy(configuration["capabilities"])
+ caps.update({"webSocketUrl": True})
deep_update(caps, capabilities)
caps = {"alwaysMatch": caps}
- await reset_current_session_if_necessary(caps, True)
+ await reset_current_session_if_necessary(caps)
if _current_session is None:
_current_session = webdriver.Session(
@@ -235,93 +193,8 @@
@pytest.fixture
-def create_dialog(session):
- """Create a dialog (one of "alert", "prompt", or "confirm") and provide a
- function to validate that the dialog has been "handled" (either accepted or
- dismissed) by returning some value."""
-
- def create_dialog(dialog_type, text=None):
- assert dialog_type in ("alert", "confirm", "prompt"), (
- "Invalid dialog type: '%s'" % dialog_type)
-
- if text is None:
- text = ""
-
- assert isinstance(text, str), "`text` parameter must be a string"
-
- # Script completes itself when the user prompt has been opened.
- # For prompt() dialogs, add a value for the 'default' argument,
- # as some user agents (IE, for example) do not produce consistent
- # values for the default.
- session.execute_async_script("""
- let dialog_type = arguments[0];
- let text = arguments[1];
-
- setTimeout(function() {
- if (dialog_type == 'prompt') {
- window.dialog_return_value = window[dialog_type](text, '');
- } else {
- window.dialog_return_value = window[dialog_type](text);
- }
- }, 0);
- """, args=(dialog_type, text))
-
- wait = Poll(
- session,
- timeout=15,
- ignored_exceptions=webdriver.NoSuchAlertException,
- message="No user prompt with text '{}' detected".format(text))
- wait.until(lambda s: s.alert.text == text)
-
- return create_dialog
-
-
[email protected]
-def closed_frame(session, url):
- original_handle = session.window_handle
- new_handle = session.new_window()
-
- session.window_handle = new_handle
-
- session.url = ""
-
- subframe = session.find.css("#sub-frame", all=False)
- session.switch_frame(subframe)
-
- deleteframe = session.find.css("#delete-frame", all=False)
- session.switch_frame(deleteframe)
-
- button = session.find.css("#remove-parent", all=False)
- button.click()
-
- yield
-
- session.window.close()
- assert new_handle not in session.handles, "Unable to close window {}".format(new_handle)
-
- session.window_handle = original_handle
-
-
[email protected]
-def closed_window(session, inline):
- original_handle = session.window_handle
- new_handle = session.new_window()
-
- session.window_handle = new_handle
- session.url = "" id='a' value='b'>")
- element = session.find.css("input", all=False)
-
- session.window.close()
- assert new_handle not in session.handles, "Unable to close window {}".format(new_handle)
-
- yield (original_handle, element)
-
- session.window_handle = original_handle
-
-
[email protected]
def inline(url):
- """Takes a source extract and produces well-formed documents.
+ """Take a source extract and produces well-formed documents.
Based on the desired document type, the extract is embedded with
predefined boilerplate in order to produce well-formed documents.
@@ -349,7 +222,7 @@
@pytest.fixture
def iframe(inline):
- """Inlines document extract as the source document of an <iframe>."""
+ """Inline document extract as the source document of an <iframe>."""
def iframe(src, **kwargs):
return "<iframe src=''></iframe>".format(inline(src, **kwargs))
Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_bidi.py (0 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_bidi.py (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_bidi.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -0,0 +1,14 @@
+import asyncio
+from typing import Any, Mapping
+
+import pytest
+import webdriver
+
+
[email protected]
+def send_blocking_command(bidi_session):
+ """Send a blocking command that awaits until the BiDi response has been received."""
+ async def send_blocking_command(command: str, params: Mapping[str, Any]) -> Mapping[str, Any]:
+ future_response = await bidi_session.send_command(command, params)
+ return await future_response
+ return send_blocking_command
Added: trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_http.py (0 => 288871)
--- trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_http.py (rev 0)
+++ trunk/WebDriverTests/imported/w3c/webdriver/tests/support/fixtures_http.py 2022-02-01 10:32:27 UTC (rev 288871)
@@ -0,0 +1,152 @@
+import pytest
+from webdriver.error import NoSuchAlertException
+
+from tests.support.sync import Poll
+
+
[email protected]
+def add_event_listeners(session):
+ """Register listeners for tracked events on element."""
+ def add_event_listeners(element, tracked_events):
+ element.session.execute_script("""
+ let element = arguments[0];
+ let trackedEvents = arguments[1];
+
+ if (!("events" in window)) {
+ window.events = [];
+ }
+
+ for (var i = 0; i < trackedEvents.length; i++) {
+ element.addEventListener(trackedEvents[i], function (event) {
+ window.events.push(event.type);
+ });
+ }
+ """, args=(element, tracked_events))
+ return add_event_listeners
+
+
[email protected]
+def closed_frame(session, url):
+ """Create a frame and remove it after switching to it.
+
+ The removed frame will be kept selected, which allows to test for invalid
+ browsing context references.
+ """
+ original_handle = session.window_handle
+ new_handle = session.new_window()
+
+ session.window_handle = new_handle
+
+ session.url = ""
+
+ subframe = session.find.css("#sub-frame", all=False)
+ session.switch_frame(subframe)
+
+ deleteframe = session.find.css("#delete-frame", all=False)
+ session.switch_frame(deleteframe)
+
+ button = session.find.css("#remove-parent", all=False)
+ button.click()
+
+ yield
+
+ session.window.close()
+ assert new_handle not in session.handles, "Unable to close window {}".format(new_handle)
+
+ session.window_handle = original_handle
+
+
[email protected]
+def closed_window(session, inline):
+ """Create a window and close it immediately.
+
+ The window handle will be kept selected, which allows to test for invalid
+ top-level browsing context references.
+ """
+ original_handle = session.window_handle
+ new_handle = session.new_window()
+
+ session.window_handle = new_handle
+ session.url = "" id='a' value='b'>")
+ element = session.find.css("input", all=False)
+
+ session.window.close()
+ assert new_handle not in session.handles, "Unable to close window {}".format(new_handle)
+
+ yield (original_handle, element)
+
+ session.window_handle = original_handle
+
+
[email protected]
+def create_cookie(session, url):
+ """Create a cookie."""
+ def create_cookie(name, value, **kwargs):
+ if kwargs.get("path", None) is not None:
+ session.url = ""
+
+ session.set_cookie(name, value, **kwargs)
+ return session.cookies(name)
+
+ return create_cookie
+
+
[email protected]
+def create_dialog(session):
+ """Create a dialog (one of "alert", "prompt", or "confirm").
+
+ Also it provides a function to validate that the dialog has been "handled"
+ (either accepted or dismissed) by returning some value.
+ """
+ def create_dialog(dialog_type, text=None):
+ assert dialog_type in ("alert", "confirm", "prompt"), (
+ "Invalid dialog type: '%s'" % dialog_type)
+
+ if text is None:
+ text = ""
+
+ assert isinstance(text, str), "`text` parameter must be a string"
+
+ # Script completes itself when the user prompt has been opened.
+ # For prompt() dialogs, add a value for the 'default' argument,
+ # as some user agents (IE, for example) do not produce consistent
+ # values for the default.
+ session.execute_async_script("""
+ let dialog_type = arguments[0];
+ let text = arguments[1];
+
+ setTimeout(function() {
+ if (dialog_type == 'prompt') {
+ window.dialog_return_value = window[dialog_type](text, '');
+ } else {
+ window.dialog_return_value = window[dialog_type](text);
+ }
+ }, 0);
+ """, args=(dialog_type, text))
+
+ wait = Poll(
+ session,
+ timeout=15,
+ ignored_exceptions=NoSuchAlertException,
+ message="No user prompt with text '{}' detected".format(text))
+ wait.until(lambda s: s.alert.text == text)
+
+ return create_dialog
+
+
[email protected]
+def create_frame(session):
+ """Create an `iframe` element.
+
+ The element will be inserted into the document of the current browsing
+ context. Return a reference to the newly-created element.
+ """
+ def create_frame():
+ append = """
+ var frame = document.createElement('iframe');
+ document.body.appendChild(frame);
+ return frame;
+ """
+ return session.execute_script(append)
+
+ return create_frame