diff --git a/py/selenium/webdriver/chromium/webdriver.py b/py/selenium/webdriver/chromium/webdriver.py index 484fa132ad74d..0f140a90a2b88 100644 --- a/py/selenium/webdriver/chromium/webdriver.py +++ b/py/selenium/webdriver/chromium/webdriver.py @@ -20,11 +20,11 @@ from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection from selenium.webdriver.chromium.service import ChromiumService from selenium.webdriver.common.driver_finder import DriverFinder +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.remote.command import Command -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver -class ChromiumDriver(RemoteWebDriver): +class ChromiumDriver(LocalWebDriver): """Control the WebDriver instance of ChromiumDriver and drive the browser.""" def __init__( @@ -69,8 +69,6 @@ def __init__( self.quit() raise - self._is_remote = False - def launch_app(self, id): """Launches Chromium app specified by id. @@ -206,25 +204,3 @@ def stop_casting(self, sink_name: str) -> dict: sink_name: Name of the sink to stop the Cast session. """ return self.execute("stopCasting", {"sinkName": sink_name}) - - def quit(self) -> None: - """Closes the browser and shuts down the ChromiumDriver executable.""" - try: - super().quit() - except Exception: - # We don't care about the message because something probably has gone wrong - pass - finally: - self.service.stop() - - def download_file(self, *args, **kwargs): - """Download file functionality is not implemented for Chromium driver.""" - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - """Get downloadable files functionality is not implemented for Chromium driver.""" - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - """Delete downloadable files functionality is not implemented for Chromium driver.""" - raise NotImplementedError diff --git a/py/selenium/webdriver/common/webdriver.py b/py/selenium/webdriver/common/webdriver.py new file mode 100644 index 0000000000000..cc76e95754082 --- /dev/null +++ b/py/selenium/webdriver/common/webdriver.py @@ -0,0 +1,54 @@ +# 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.remote.webdriver import WebDriver as RemoteWebDriver + + +class LocalWebDriver(RemoteWebDriver): + """Base class for local WebDrivers.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._is_remote = False + + def __new__(cls, *args, **kwargs): + if cls is LocalWebDriver: + raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") + return object.__new__(cls) + + def quit(self) -> None: + """Closes the browser and shuts down the driver executable.""" + try: + super().quit() + except Exception: + # We don't care about the message because something probably has gone wrong + pass + finally: + self.service.stop() + + def download_file(self, *args, **kwargs): + """Only implemented in RemoteWebDriver.""" + raise NotImplementedError + + def get_downloadable_files(self, *args, **kwargs): + """Only implemented in RemoteWebDriver.""" + raise NotImplementedError + + def delete_downloadable_files(self, *args, **kwargs): + """Only implemented in RemoteWebDriver.""" + raise NotImplementedError diff --git a/py/selenium/webdriver/firefox/webdriver.py b/py/selenium/webdriver/firefox/webdriver.py index fd953edd23e5b..a6d02ad38a510 100644 --- a/py/selenium/webdriver/firefox/webdriver.py +++ b/py/selenium/webdriver/firefox/webdriver.py @@ -14,6 +14,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. + + import base64 import os import warnings @@ -22,13 +24,13 @@ from io import BytesIO from selenium.webdriver.common.driver_finder import DriverFinder +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.remote_connection import FirefoxRemoteConnection from selenium.webdriver.firefox.service import Service -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver -class WebDriver(RemoteWebDriver): +class WebDriver(LocalWebDriver): """Controls the GeckoDriver and allows you to drive the browser.""" CONTEXT_CHROME = "chrome" @@ -70,18 +72,6 @@ def __init__( self.quit() raise - self._is_remote = False - - def quit(self) -> None: - """Closes the browser and shuts down the GeckoDriver executable.""" - try: - super().quit() - except Exception: - # We don't care about the message because something probably has gone wrong - pass - finally: - self.service.stop() - def set_context(self, context) -> None: """Sets the context that Selenium commands are running in. @@ -223,15 +213,3 @@ def get_full_page_screenshot_as_base64(self) -> str: driver.get_full_page_screenshot_as_base64() """ return self.execute("FULL_PAGE_SCREENSHOT")["value"] - - def download_file(self, *args, **kwargs): - """Download file functionality is not implemented for Firefox driver.""" - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - """Get downloadable files functionality is not implemented for Firefox driver.""" - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - """Delete downloadable files functionality is not implemented for Firefox driver.""" - raise NotImplementedError diff --git a/py/selenium/webdriver/ie/webdriver.py b/py/selenium/webdriver/ie/webdriver.py index 47f3224e2123a..cd85f4305093b 100644 --- a/py/selenium/webdriver/ie/webdriver.py +++ b/py/selenium/webdriver/ie/webdriver.py @@ -17,14 +17,14 @@ from selenium.webdriver.common.driver_finder import DriverFinder +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.ie.options import Options from selenium.webdriver.ie.service import Service from selenium.webdriver.remote.client_config import ClientConfig from selenium.webdriver.remote.remote_connection import RemoteConnection -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver -class WebDriver(RemoteWebDriver): +class WebDriver(LocalWebDriver): """Control the IEServerDriver and drive Internet Explorer.""" def __init__( @@ -59,24 +59,3 @@ def __init__( except Exception: self.quit() raise - - self._is_remote = False - - def quit(self) -> None: - """Closes the browser and shuts down the IEServerDriver executable.""" - try: - super().quit() - except Exception: - # We don't care about the message because something probably has gone wrong - pass - finally: - self.service.stop() - - def download_file(self, *args, **kwargs): - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - raise NotImplementedError diff --git a/py/selenium/webdriver/safari/webdriver.py b/py/selenium/webdriver/safari/webdriver.py index 8f17758f1b96d..68983f59515bf 100644 --- a/py/selenium/webdriver/safari/webdriver.py +++ b/py/selenium/webdriver/safari/webdriver.py @@ -18,13 +18,13 @@ from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.driver_finder import DriverFinder -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.safari.options import Options from selenium.webdriver.safari.remote_connection import SafariRemoteConnection from selenium.webdriver.safari.service import Service -class WebDriver(RemoteWebDriver): +class WebDriver(LocalWebDriver): """Controls the SafariDriver and allows you to drive the browser.""" def __init__( @@ -61,8 +61,6 @@ def __init__( self.quit() raise - self._is_remote = False - def quit(self): """Closes the browser and shuts down the SafariDriver executable.""" try: @@ -105,12 +103,3 @@ def get_permission(self, permission): def debug(self): self.execute("ATTACH_DEBUGGER") self.execute_script("debugger;") - - def download_file(self, *args, **kwargs): - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - raise NotImplementedError diff --git a/py/selenium/webdriver/webkitgtk/webdriver.py b/py/selenium/webdriver/webkitgtk/webdriver.py index a2ca221659fbe..5833fc21f7152 100644 --- a/py/selenium/webdriver/webkitgtk/webdriver.py +++ b/py/selenium/webdriver/webkitgtk/webdriver.py @@ -15,15 +15,14 @@ # specific language governing permissions and limitations # under the License. -import http.client as http_client from selenium.webdriver.common.driver_finder import DriverFinder -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.webkitgtk.options import Options from selenium.webdriver.webkitgtk.service import Service -class WebDriver(RemoteWebDriver): +class WebDriver(LocalWebDriver): """Controls the WebKitGTKDriver and allows you to drive the browser.""" def __init__( @@ -45,22 +44,3 @@ def __init__( self.service.start() super().__init__(command_executor=self.service.service_url, options=options) - self._is_remote = False - - def quit(self): - """Close the browser and shut down the WebKitGTK driver executable.""" - try: - super().quit() - except http_client.BadStatusLine: - pass - finally: - self.service.stop() - - def download_file(self, *args, **kwargs): - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - raise NotImplementedError diff --git a/py/selenium/webdriver/wpewebkit/webdriver.py b/py/selenium/webdriver/wpewebkit/webdriver.py index aa1cb3ce8683b..8c6a7a17dfda7 100644 --- a/py/selenium/webdriver/wpewebkit/webdriver.py +++ b/py/selenium/webdriver/wpewebkit/webdriver.py @@ -15,15 +15,14 @@ # specific language governing permissions and limitations # under the License. -import http.client as http_client from selenium.webdriver.common.driver_finder import DriverFinder -from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver +from selenium.webdriver.common.webdriver import LocalWebDriver from selenium.webdriver.wpewebkit.options import Options from selenium.webdriver.wpewebkit.service import Service -class WebDriver(RemoteWebDriver): +class WebDriver(LocalWebDriver): """Controls the WPEWebKitDriver and allows you to drive the browser.""" def __init__( @@ -45,22 +44,3 @@ def __init__( self.service.start() super().__init__(command_executor=self.service.service_url, options=options) - self._is_remote = False - - def quit(self): - """Close the browser and shut down the WPEWebKit driver executable.""" - try: - super().quit() - except http_client.BadStatusLine: - pass - finally: - self.service.stop() - - def download_file(self, *args, **kwargs): - raise NotImplementedError - - def get_downloadable_files(self, *args, **kwargs): - raise NotImplementedError - - def delete_downloadable_files(self, *args, **kwargs): - raise NotImplementedError