Skip to content

Commit 9d5c344

Browse files
committed
add enable_webextensions method and exception for chrome webextensions
1 parent 793d99d commit 9d5c344

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

py/selenium/webdriver/chrome/options.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,47 @@
2222

2323

2424
class Options(ChromiumOptions):
25+
def __init__(self) -> None:
26+
super().__init__()
27+
self._enable_webextensions = False
28+
2529
@property
2630
def default_capabilities(self) -> dict:
2731
return DesiredCapabilities.CHROME.copy()
2832

33+
@property
34+
def enable_webextensions(self) -> bool:
35+
"""Returns whether webextension support is enabled for Chrome.
36+
37+
:Returns: True if webextension support is enabled, False otherwise.
38+
"""
39+
return self._enable_webextensions
40+
41+
@enable_webextensions.setter
42+
def enable_webextensions(self, value: bool) -> None:
43+
"""Enables or disables webextension support for Chrome.
44+
45+
When enabled, this automatically adds the required Chrome flags:
46+
- --enable-unsafe-extension-debugging
47+
- --remote-debugging-pipe
48+
49+
:Args:
50+
- value: True to enable webextension support, False to disable.
51+
"""
52+
self._enable_webextensions = value
53+
if value:
54+
# Add required flags for Chrome webextension support
55+
required_flags = ["--enable-unsafe-extension-debugging", "--remote-debugging-pipe"]
56+
for flag in required_flags:
57+
if flag not in self._arguments:
58+
self.add_argument(flag)
59+
else:
60+
# Remove webextension flags if disabling
61+
flags_to_remove = ["--enable-unsafe-extension-debugging", "--remote-debugging-pipe"]
62+
for flag in flags_to_remove:
63+
if flag in self._arguments:
64+
self._arguments.remove(flag)
65+
2966
def enable_mobile(
3067
self,
3168
android_package: Optional[str] = "com.android.chrome",

py/selenium/webdriver/common/bidi/webextension.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from typing import Dict, Union
1919

2020
from selenium.webdriver.common.bidi.common import command_builder
21+
from selenium.common.exceptions import WebDriverException
2122

2223

2324
class WebExtension:
@@ -54,8 +55,17 @@ def install(self, path=None, archive_path=None, base64_value=None) -> Dict:
5455
extension_data = {"type": "base64", "value": base64_value}
5556

5657
params = {"extensionData": extension_data}
57-
result = self.conn.execute(command_builder("webExtension.install", params))
58-
return result
58+
59+
try:
60+
result = self.conn.execute(command_builder("webExtension.install", params))
61+
return result
62+
except WebDriverException as e:
63+
if "Method not available" in str(e):
64+
raise WebDriverException(
65+
f"{str(e)}. If you are using Chrome, add '--enable-unsafe-extension-debugging' "
66+
"and '--remote-debugging-pipe' arguments or set options.enable_webextensions = True"
67+
) from e
68+
raise
5969

6070
def uninstall(self, extension_id_or_result: Union[str, Dict]) -> None:
6171
"""Uninstalls a web extension from the remote end.

0 commit comments

Comments
 (0)