From 0d7e57a7079c0a48286e8e741a0122916c08ca16 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Fri, 6 Mar 2020 19:32:52 +0100 Subject: [PATCH] [py] Add WPEWebKit driver (#6375) For the WPE port of WebKit Co-authored-by: David Burns --- py/selenium/webdriver/__init__.py | 2 + .../webdriver/common/desired_capabilities.py | 6 ++ py/selenium/webdriver/wpewebkit/__init__.py | 16 ++++ py/selenium/webdriver/wpewebkit/options.py | 88 +++++++++++++++++++ py/selenium/webdriver/wpewebkit/service.py | 42 +++++++++ py/selenium/webdriver/wpewebkit/webdriver.py | 72 +++++++++++++++ 6 files changed, 226 insertions(+) create mode 100644 py/selenium/webdriver/wpewebkit/__init__.py create mode 100644 py/selenium/webdriver/wpewebkit/options.py create mode 100644 py/selenium/webdriver/wpewebkit/service.py create mode 100644 py/selenium/webdriver/wpewebkit/webdriver.py diff --git a/py/selenium/webdriver/__init__.py b/py/selenium/webdriver/__init__.py index c88ecc12f48aa..7015ee9109332 100644 --- a/py/selenium/webdriver/__init__.py +++ b/py/selenium/webdriver/__init__.py @@ -32,6 +32,8 @@ from .android.webdriver import WebDriver as Android # noqa from .webkitgtk.webdriver import WebDriver as WebKitGTK # noqa from .webkitgtk.options import Options as WebKitGTKOptions # noqa +from .wpewebkit.webdriver import WebDriver as WPEWebKit # noqa +from .wpewebkit.options import Options as WPEWebKitOptions # noqa from .remote.webdriver import WebDriver as Remote # noqa from .common.desired_capabilities import DesiredCapabilities # noqa from .common.action_chains import ActionChains # noqa diff --git a/py/selenium/webdriver/common/desired_capabilities.py b/py/selenium/webdriver/common/desired_capabilities.py index 3f9975db0ad35..74cd0c067c09b 100644 --- a/py/selenium/webdriver/common/desired_capabilities.py +++ b/py/selenium/webdriver/common/desired_capabilities.py @@ -125,3 +125,9 @@ class DesiredCapabilities(object): "version": "", "platform": "ANY", } + + WPEWEBKIT = { + "browserName": "MiniBrowser", + "version": "", + "platform": "ANY", + } diff --git a/py/selenium/webdriver/wpewebkit/__init__.py b/py/selenium/webdriver/wpewebkit/__init__.py new file mode 100644 index 0000000000000..a5b1e6f85a09e --- /dev/null +++ b/py/selenium/webdriver/wpewebkit/__init__.py @@ -0,0 +1,16 @@ +# 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. diff --git a/py/selenium/webdriver/wpewebkit/options.py b/py/selenium/webdriver/wpewebkit/options.py new file mode 100644 index 0000000000000..100eb76e3b328 --- /dev/null +++ b/py/selenium/webdriver/wpewebkit/options.py @@ -0,0 +1,88 @@ +# 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.desired_capabilities import DesiredCapabilities + + +class Options(object): + KEY = 'wpe:browserOptions' + + def __init__(self): + self._binary_location = '' + self._arguments = [] + self._caps = DesiredCapabilities.WPEWEBKIT.copy() + + @property + def capabilities(self): + return self._caps + + def set_capability(self, name, value): + """Sets a capability.""" + self._caps[name] = value + + @property + def binary_location(self): + """ + Returns the location of the browser binary otherwise an empty string + """ + return self._binary_location + + @binary_location.setter + def binary_location(self, value): + """ + Allows you to set the browser binary to launch + + :Args: + - value : path to the browser binary + """ + self._binary_location = value + + @property + def arguments(self): + """ + Returns a list of arguments needed for the browser + """ + return self._arguments + + def add_argument(self, argument): + """ + Adds an argument to the list + + :Args: + - Sets the arguments + """ + if argument: + self._arguments.append(argument) + else: + raise ValueError("argument can not be null") + + def to_capabilities(self): + """ + Creates a capabilities with all the options that have been set and + returns a dictionary with everything + """ + caps = self._caps + + browser_options = {} + if self.binary_location: + browser_options["binary"] = self.binary_location + if self.arguments: + browser_options["args"] = self.arguments + + caps[Options.KEY] = browser_options + + return caps diff --git a/py/selenium/webdriver/wpewebkit/service.py b/py/selenium/webdriver/wpewebkit/service.py new file mode 100644 index 0000000000000..0b1f55e2917ef --- /dev/null +++ b/py/selenium/webdriver/wpewebkit/service.py @@ -0,0 +1,42 @@ +# 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 import service + + +class Service(service.Service): + """ + Object that manages the starting and stopping of the WPEWebKitDriver + """ + + def __init__(self, executable_path, port=0, log_path=None): + """ + Creates a new instance of the Service + + :Args: + - executable_path : Path to the WPEWebKitDriver + - port : Port the service is running on + - log_path : Path for the WPEWebKitDriver service to log to + """ + log_file = open(log_path, "wb") if log_path is not None and log_path != "" else None + service.Service.__init__(self, executable_path, port, log_file) + + def command_line_args(self): + return ["-p", "%d" % self.port] + + def send_remote_shutdown_command(self): + pass diff --git a/py/selenium/webdriver/wpewebkit/webdriver.py b/py/selenium/webdriver/wpewebkit/webdriver.py new file mode 100644 index 0000000000000..3949047fc01c4 --- /dev/null +++ b/py/selenium/webdriver/wpewebkit/webdriver.py @@ -0,0 +1,72 @@ +# 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. + +try: + import http.client as http_client +except ImportError: + import httplib as http_client + +from selenium.webdriver.common.desired_capabilities import DesiredCapabilities +from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver +from .service import Service + + +class WebDriver(RemoteWebDriver): + """ + Controls the WPEWebKitDriver and allows you to drive the browser. + """ + + def __init__(self, executable_path="WPEWebDriver", port=0, options=None, + desired_capabilities=DesiredCapabilities.WPEWEBKIT, + service_log_path=None): + """ + Creates a new instance of the WPEWebKit driver. + + Starts the service and then creates new instance of WPEWebKit Driver. + + :Args: + - executable_path : path to the executable. If the default is used it assumes the executable is in the $PATH. + - port : port you would like the service to run, if left as 0, a free port will be found. + - options : an instance of WPEWebKitOptions + - desired_capabilities : Dictionary object with desired capabilities + - service_log_path : Path to write service stdout and stderr output. + """ + if options is not None: + capabilities = options.to_capabilities() + capabilities.update(desired_capabilities) + desired_capabilities = capabilities + + self.service = Service(executable_path, port=port, log_path=service_log_path) + self.service.start() + + RemoteWebDriver.__init__( + self, + command_executor=self.service.service_url, + desired_capabilities=desired_capabilities) + self._is_remote = False + + def quit(self): + """ + Closes the browser and shuts down the WPEWebKitDriver executable + that is started when starting the WPEWebKitDriver + """ + try: + RemoteWebDriver.quit(self) + except http_client.BadStatusLine: + pass + finally: + self.service.stop()