135 lines
4.4 KiB
Python
Executable File
135 lines
4.4 KiB
Python
Executable File
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The SFC licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
|
|
from selenium.webdriver.common.bidi.common import command_builder
|
|
|
|
|
|
class UserPromptHandlerType:
|
|
"""Represents the behavior of the user prompt handler."""
|
|
|
|
ACCEPT = "accept"
|
|
DISMISS = "dismiss"
|
|
IGNORE = "ignore"
|
|
|
|
VALID_TYPES = {ACCEPT, DISMISS, IGNORE}
|
|
|
|
|
|
class UserPromptHandler:
|
|
"""Represents the configuration of the user prompt handler."""
|
|
|
|
def __init__(
|
|
self,
|
|
alert: str | None = None,
|
|
before_unload: str | None = None,
|
|
confirm: str | None = None,
|
|
default: str | None = None,
|
|
file: str | None = None,
|
|
prompt: str | None = None,
|
|
):
|
|
"""Initialize UserPromptHandler.
|
|
|
|
Args:
|
|
alert: Handler type for alert prompts.
|
|
before_unload: Handler type for beforeUnload prompts.
|
|
confirm: Handler type for confirm prompts.
|
|
default: Default handler type for all prompts.
|
|
file: Handler type for file picker prompts.
|
|
prompt: Handler type for prompt dialogs.
|
|
|
|
Raises:
|
|
ValueError: If any handler type is not valid.
|
|
"""
|
|
for field_name, value in [
|
|
("alert", alert),
|
|
("before_unload", before_unload),
|
|
("confirm", confirm),
|
|
("default", default),
|
|
("file", file),
|
|
("prompt", prompt),
|
|
]:
|
|
if value is not None and value not in UserPromptHandlerType.VALID_TYPES:
|
|
raise ValueError(
|
|
f"Invalid {field_name} handler type: {value}. Must be one of {UserPromptHandlerType.VALID_TYPES}"
|
|
)
|
|
|
|
self.alert = alert
|
|
self.before_unload = before_unload
|
|
self.confirm = confirm
|
|
self.default = default
|
|
self.file = file
|
|
self.prompt = prompt
|
|
|
|
def to_dict(self) -> dict[str, str]:
|
|
"""Convert the UserPromptHandler to a dictionary for BiDi protocol.
|
|
|
|
Returns:
|
|
Dictionary representation suitable for BiDi protocol.
|
|
"""
|
|
field_mapping = {
|
|
"alert": "alert",
|
|
"before_unload": "beforeUnload",
|
|
"confirm": "confirm",
|
|
"default": "default",
|
|
"file": "file",
|
|
"prompt": "prompt",
|
|
}
|
|
|
|
result = {}
|
|
for attr_name, dict_key in field_mapping.items():
|
|
value = getattr(self, attr_name)
|
|
if value is not None:
|
|
result[dict_key] = value
|
|
return result
|
|
|
|
|
|
class Session:
|
|
def __init__(self, conn):
|
|
self.conn = conn
|
|
|
|
def subscribe(self, *events, browsing_contexts=None):
|
|
params = {
|
|
"events": events,
|
|
}
|
|
if browsing_contexts is None:
|
|
browsing_contexts = []
|
|
if browsing_contexts:
|
|
params["browsingContexts"] = browsing_contexts
|
|
return command_builder("session.subscribe", params)
|
|
|
|
def unsubscribe(self, *events, browsing_contexts=None):
|
|
params = {
|
|
"events": events,
|
|
}
|
|
if browsing_contexts is None:
|
|
browsing_contexts = []
|
|
if browsing_contexts:
|
|
params["browsingContexts"] = browsing_contexts
|
|
return command_builder("session.unsubscribe", params)
|
|
|
|
def status(self):
|
|
"""The session.status command returns information about the remote end's readiness.
|
|
|
|
Returns information about the remote end's readiness to create new sessions
|
|
and may include implementation-specific metadata.
|
|
|
|
Returns:
|
|
Dictionary containing the ready state (bool), message (str) and metadata.
|
|
"""
|
|
cmd = command_builder("session.status", {})
|
|
return self.conn.execute(cmd)
|