From ef248a507d3332f9062678b065ec3b44c3a4095b Mon Sep 17 00:00:00 2001 From: Corey Goldberg <1113081+cgoldberg@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:03:34 -0400 Subject: [PATCH 1/2] [py] Moved logging API to Chromium browsers only --- py/selenium/webdriver/chromium/webdriver.py | 31 +++++++++++++++++++ py/selenium/webdriver/remote/webdriver.py | 27 ---------------- .../webdriver/common/api_example_tests.py | 18 +++++++---- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/py/selenium/webdriver/chromium/webdriver.py b/py/selenium/webdriver/chromium/webdriver.py index 93124c68a0d0c..4601ff285ba7a 100644 --- a/py/selenium/webdriver/chromium/webdriver.py +++ b/py/selenium/webdriver/chromium/webdriver.py @@ -19,6 +19,7 @@ from selenium.webdriver.common.driver_finder import DriverFinder from selenium.webdriver.common.options import ArgOptions from selenium.webdriver.common.service import Service +from selenium.webdriver.remote.command import Command from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver @@ -149,6 +150,36 @@ def get_issue_message(self): session.""" return self.execute("getIssueMessage")["value"] + + @property + def log_types(self): + """Gets a list of the available log types. + + Example: + -------- + >>> driver.log_types + """ + return self.execute(Command.GET_AVAILABLE_LOG_TYPES)["value"] + + + def get_log(self, log_type): + """Gets the log for a given log type. + + Parameters: + ----------- + log_type : str + - Type of log that which will be returned + + Example: + -------- + >>> driver.get_log('browser') + >>> driver.get_log('driver') + >>> driver.get_log('client') + >>> driver.get_log('server') + """ + return self.execute(Command.GET_LOG, {"type": log_type})["value"] + + def set_sink_to_use(self, sink_name: str) -> dict: """Sets a specific sink, using its name, as a Cast session receiver target. diff --git a/py/selenium/webdriver/remote/webdriver.py b/py/selenium/webdriver/remote/webdriver.py index e43913f570028..af5d9a5fc79e8 100644 --- a/py/selenium/webdriver/remote/webdriver.py +++ b/py/selenium/webdriver/remote/webdriver.py @@ -1174,33 +1174,6 @@ def orientation(self, value) -> None: else: raise WebDriverException("You can only set the orientation to 'LANDSCAPE' and 'PORTRAIT'") - @property - def log_types(self): - """Gets a list of the available log types. This only works with w3c - compliant browsers. - - Example: - -------- - >>> driver.log_types - """ - return self.execute(Command.GET_AVAILABLE_LOG_TYPES)["value"] - - def get_log(self, log_type): - """Gets the log for a given log type. - - Parameters: - ----------- - log_type : str - - Type of log that which will be returned - - Example: - -------- - >>> driver.get_log('browser') - >>> driver.get_log('driver') - >>> driver.get_log('client') - >>> driver.get_log('server') - """ - return self.execute(Command.GET_LOG, {"type": log_type})["value"] def start_devtools(self): global devtools diff --git a/py/test/selenium/webdriver/common/api_example_tests.py b/py/test/selenium/webdriver/common/api_example_tests.py index 803c67acadc8e..e26b549841966 100644 --- a/py/test/selenium/webdriver/common/api_example_tests.py +++ b/py/test/selenium/webdriver/common/api_example_tests.py @@ -274,17 +274,23 @@ def test_change_window_size(driver, pages): assert size["height"] == newSize[1] -@pytest.mark.xfail_firefox(raises=WebDriverException) -@pytest.mark.xfail_remote -@pytest.mark.xfail_safari +@pytest.mark.xfail_ie(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_firefox(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_remote(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_safari(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_webkitgtk(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_wpewebkit(raises=AttributeError, reason="Logging API is no longer available") def test_get_log_types(driver, pages): pages.load("blank.html") assert isinstance(driver.log_types, list) -@pytest.mark.xfail_firefox(raises=WebDriverException) -@pytest.mark.xfail_remote -@pytest.mark.xfail_safari +@pytest.mark.xfail_ie(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_firefox(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_remote(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_safari(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_webkitgtk(raises=AttributeError, reason="Logging API is no longer available") +@pytest.mark.xfail_wpewebkit()(raises=AttributeError, reason="Logging API is no longer available") def test_get_log(driver, pages): pages.load("blank.html") for log_type in driver.log_types: From 2e1c1739822f79bb438085b23bea1cf9be709548 Mon Sep 17 00:00:00 2001 From: Corey Goldberg <1113081+cgoldberg@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:18:50 -0400 Subject: [PATCH 2/2] [py] Remove unused import and fix linting errors --- py/selenium/webdriver/chromium/webdriver.py | 3 --- py/selenium/webdriver/remote/webdriver.py | 1 - py/test/selenium/webdriver/common/api_example_tests.py | 2 -- 3 files changed, 6 deletions(-) diff --git a/py/selenium/webdriver/chromium/webdriver.py b/py/selenium/webdriver/chromium/webdriver.py index 4601ff285ba7a..a7721e4de0bdf 100644 --- a/py/selenium/webdriver/chromium/webdriver.py +++ b/py/selenium/webdriver/chromium/webdriver.py @@ -150,7 +150,6 @@ def get_issue_message(self): session.""" return self.execute("getIssueMessage")["value"] - @property def log_types(self): """Gets a list of the available log types. @@ -161,7 +160,6 @@ def log_types(self): """ return self.execute(Command.GET_AVAILABLE_LOG_TYPES)["value"] - def get_log(self, log_type): """Gets the log for a given log type. @@ -179,7 +177,6 @@ def get_log(self, log_type): """ return self.execute(Command.GET_LOG, {"type": log_type})["value"] - def set_sink_to_use(self, sink_name: str) -> dict: """Sets a specific sink, using its name, as a Cast session receiver target. diff --git a/py/selenium/webdriver/remote/webdriver.py b/py/selenium/webdriver/remote/webdriver.py index af5d9a5fc79e8..c70fcb4888ec4 100644 --- a/py/selenium/webdriver/remote/webdriver.py +++ b/py/selenium/webdriver/remote/webdriver.py @@ -1174,7 +1174,6 @@ def orientation(self, value) -> None: else: raise WebDriverException("You can only set the orientation to 'LANDSCAPE' and 'PORTRAIT'") - def start_devtools(self): global devtools if self._websocket_connection: diff --git a/py/test/selenium/webdriver/common/api_example_tests.py b/py/test/selenium/webdriver/common/api_example_tests.py index e26b549841966..93a2856191009 100644 --- a/py/test/selenium/webdriver/common/api_example_tests.py +++ b/py/test/selenium/webdriver/common/api_example_tests.py @@ -15,11 +15,9 @@ # specific language governing permissions and limitations # under the License. - import pytest from selenium.common.exceptions import NoSuchElementException -from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait