Skip to content

Commit 6a776f3

Browse files
authored
[py] fix proxy options (#12029)
1 parent 9e165e5 commit 6a776f3

File tree

8 files changed

+49
-52
lines changed

8 files changed

+49
-52
lines changed

py/selenium/webdriver/common/options.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class BaseOptions(metaclass=ABCMeta):
2828
def __init__(self) -> None:
2929
super().__init__()
3030
self._caps = self.default_capabilities
31+
self._proxy = None
3132
self.set_capability("pageLoadStrategy", "normal")
3233
self.mobile_options = None
3334

@@ -213,6 +214,7 @@ def proxy(self, value: Proxy) -> None:
213214
if not isinstance(value, Proxy):
214215
raise InvalidArgumentException("Only Proxy objects can be passed in.")
215216
self._proxy = value
217+
self._caps["proxy"] = value.to_capabilities()
216218

217219
@abstractmethod
218220
def to_capabilities(self):

py/selenium/webdriver/common/proxy.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,8 @@ def _verify_proxy_type_compatibility(self, compatible_proxy):
284284
f"Specified proxy type ({compatible_proxy}) not compatible with current setting ({self.proxyType})"
285285
)
286286

287-
def add_to_capabilities(self, capabilities):
288-
"""Adds proxy information as capability in specified capabilities.
289-
290-
:Args:
291-
- capabilities: The capabilities to which proxy will be added.
292-
"""
293-
proxy_caps = {"proxyType": self.proxyType["string"]}
287+
def to_capabilities(self):
288+
proxy_caps = {"proxyType": self.proxyType["string"].lower()}
294289
if self.autodetect:
295290
proxy_caps["autodetect"] = self.autodetect
296291
if self.ftpProxy:
@@ -311,4 +306,4 @@ def add_to_capabilities(self, capabilities):
311306
proxy_caps["socksPassword"] = self.socksPassword
312307
if self.socksVersion:
313308
proxy_caps["socksVersion"] = self.socksVersion
314-
capabilities["proxy"] = proxy_caps
309+
return proxy_caps

py/selenium/webdriver/firefox/options.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def __init__(self) -> None:
4242
self._binary: typing.Optional[FirefoxBinary] = None
4343
self._preferences: dict = {}
4444
self._profile = None
45-
self._proxy = None
4645
self.log = Log()
4746

4847
@property
@@ -144,8 +143,6 @@ def to_capabilities(self) -> dict:
144143
opts["binary"] = self._binary._start_cmd
145144
if self._preferences:
146145
opts["prefs"] = self._preferences
147-
if self._proxy:
148-
self._proxy.add_to_capabilities(caps)
149146
if self._profile:
150147
opts["profile"] = self._profile.encoded
151148
if self._arguments:

py/selenium/webdriver/remote/webdriver.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,6 @@ def _make_w3c_caps(caps):
104104
caps = copy.deepcopy(caps)
105105
profile = caps.get("firefox_profile")
106106
always_match = {}
107-
if caps.get("proxy") and caps["proxy"].get("proxyType"):
108-
caps["proxy"]["proxyType"] = caps["proxy"]["proxyType"].lower()
109107
for k, v in caps.items():
110108
if v and k in _OSS_W3C_CONVERSION:
111109
# Todo: Remove in 4.7.0 (Deprecated in 4.5.0)

py/test/selenium/webdriver/common/proxy_tests.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import pytest
1919

20+
from selenium.webdriver.common.options import ArgOptions
2021
from selenium.webdriver.common.proxy import Proxy
2122
from selenium.webdriver.common.proxy import ProxyType
2223

@@ -40,7 +41,7 @@
4041
}
4142

4243

43-
def test_can_add_manual_proxy_to_desired_capabilities():
44+
def test_can_add_manual_proxy_to_options():
4445
proxy = Proxy()
4546
proxy.http_proxy = MANUAL_PROXY["httpProxy"]
4647
proxy.ftp_proxy = MANUAL_PROXY["ftpProxy"]
@@ -51,39 +52,36 @@ def test_can_add_manual_proxy_to_desired_capabilities():
5152
proxy.socksPassword = MANUAL_PROXY["socksPassword"]
5253
proxy.socksVersion = MANUAL_PROXY["socksVersion"]
5354

54-
desired_capabilities = {}
55-
proxy.add_to_capabilities(desired_capabilities)
55+
options = ArgOptions()
56+
options.proxy = proxy
5657

5758
proxy_capabilities = MANUAL_PROXY.copy()
58-
proxy_capabilities["proxyType"] = "MANUAL"
59-
expected_capabilities = {"proxy": proxy_capabilities}
60-
assert expected_capabilities == desired_capabilities
59+
proxy_capabilities["proxyType"] = "manual"
60+
assert proxy_capabilities == options.to_capabilities().get("proxy")
6161

6262

63-
def test_can_add_autodetect_proxy_to_desired_capabilities():
63+
def test_can_add_autodetect_proxy_to_options():
6464
proxy = Proxy()
6565
proxy.auto_detect = AUTODETECT_PROXY["autodetect"]
6666

67-
desired_capabilities = {}
68-
proxy.add_to_capabilities(desired_capabilities)
67+
options = ArgOptions()
68+
options.proxy = proxy
6969

7070
proxy_capabilities = AUTODETECT_PROXY.copy()
71-
proxy_capabilities["proxyType"] = "AUTODETECT"
72-
expected_capabilities = {"proxy": proxy_capabilities}
73-
assert expected_capabilities == desired_capabilities
71+
proxy_capabilities["proxyType"] = "autodetect"
72+
assert proxy_capabilities == options.to_capabilities().get("proxy")
7473

7574

76-
def test_can_add_pacproxy_to_desired_capabilities():
75+
def test_can_add_pacproxy_to_options():
7776
proxy = Proxy()
7877
proxy.proxy_autoconfig_url = PAC_PROXY["proxyAutoconfigUrl"]
7978

80-
desired_capabilities = {}
81-
proxy.add_to_capabilities(desired_capabilities)
79+
options = ArgOptions()
80+
options.proxy = proxy
8281

8382
proxy_capabilities = PAC_PROXY.copy()
84-
proxy_capabilities["proxyType"] = "PAC"
85-
expected_capabilities = {"proxy": proxy_capabilities}
86-
assert expected_capabilities == desired_capabilities
83+
proxy_capabilities["proxyType"] = "pac"
84+
assert proxy_capabilities == options.to_capabilities().get("proxy")
8785

8886

8987
def test_can_not_change_initialized_proxy_type():
@@ -136,10 +134,9 @@ def test_can_init_empty_proxy():
136134
assert "" == proxy.proxy_autoconfig_url
137135
assert proxy.socks_version is None
138136

139-
desired_capabilities = {}
140-
proxy.add_to_capabilities(desired_capabilities)
137+
options = ArgOptions()
138+
options.proxy = proxy
141139

142140
proxy_capabilities = {}
143-
proxy_capabilities["proxyType"] = "UNSPECIFIED"
144-
expected_capabilities = {"proxy": proxy_capabilities}
145-
assert expected_capabilities == desired_capabilities
141+
proxy_capabilities["proxyType"] = "unspecified"
142+
assert proxy_capabilities == options.to_capabilities().get("proxy")

py/test/unit/selenium/webdriver/common/common_options_tests.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717

1818
import pytest
1919

20+
from selenium.webdriver import Proxy
2021
from selenium.webdriver.common.options import ArgOptions
22+
from selenium.webdriver.common.proxy import ProxyType
2123

2224

2325
@pytest.fixture
@@ -62,3 +64,14 @@ def test_missing_capabilities_return_false_rather_than_none():
6264
assert options.strict_file_interactability is False
6365
assert options.set_window_rect is False
6466
assert options.accept_insecure_certs is False
67+
68+
69+
def test_add_proxy():
70+
options = ArgOptions()
71+
proxy = Proxy({"proxyType": ProxyType.MANUAL})
72+
proxy.http_proxy = "http://user:password@http_proxy.com:8080"
73+
options.proxy = proxy
74+
caps = options.to_capabilities()
75+
76+
assert options.proxy == proxy
77+
assert caps.get("proxy") == proxy.to_capabilities()

py/test/unit/selenium/webdriver/firefox/firefox_options_tests.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def test_set_proxy_isnt_in_moz_prefix(options):
7777
options.proxy = proxy
7878

7979
caps = options.to_capabilities()
80-
assert caps["proxy"]["proxyType"] == "MANUAL"
80+
assert caps["proxy"]["proxyType"] == "manual"
8181
assert caps.get("moz:firefoxOptions") is None
8282

8383

@@ -132,7 +132,7 @@ def test_creates_capabilities(options):
132132
options._arguments = ["foo"]
133133
options._binary = FirefoxBinary("/bar")
134134
options._preferences = {"foo": "bar"}
135-
options._proxy = Proxy({"proxyType": ProxyType.MANUAL})
135+
options.proxy = Proxy({"proxyType": ProxyType.MANUAL})
136136
options._profile = profile
137137
options.log.level = "debug"
138138
caps = options.to_capabilities()
@@ -142,7 +142,7 @@ def test_creates_capabilities(options):
142142
assert opts["binary"] == "/bar"
143143
assert opts["prefs"]["foo"] == "bar"
144144
assert opts["profile"] == profile.encoded
145-
assert caps["proxy"]["proxyType"] == ProxyType.MANUAL["string"]
145+
assert caps["proxy"]["proxyType"] == "manual"
146146
assert opts["log"]["level"] == "debug"
147147

148148

py/test/unit/selenium/webdriver/remote/new_session_tests.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,19 @@
1616
# under the License.
1717

1818

19-
from copy import deepcopy
2019
from importlib import import_module
2120

2221
import pytest
2322

2423
from selenium.webdriver import DesiredCapabilities
24+
from selenium.webdriver.common.options import ArgOptions
25+
from selenium.webdriver.common.proxy import Proxy
26+
from selenium.webdriver.common.proxy import ProxyType
2527
from selenium.webdriver.remote import webdriver
2628
from selenium.webdriver.remote.command import Command
2729
from selenium.webdriver.remote.webdriver import WebDriver
2830

2931

30-
def test_converts_oss_capabilities_to_w3c(mocker):
31-
mock = mocker.patch("selenium.webdriver.remote.webdriver.WebDriver.execute")
32-
oss_caps = {"platform": "WINDOWS", "version": "11", "acceptSslCerts": True}
33-
w3c_caps = {"platformName": "windows", "browserVersion": "11", "acceptInsecureCerts": True}
34-
WebDriver(desired_capabilities=deepcopy(oss_caps))
35-
expected_params = {"capabilities": {"firstMatch": [{}], "alwaysMatch": w3c_caps}}
36-
mock.assert_called_with(Command.NEW_SESSION, expected_params)
37-
38-
3932
@pytest.mark.parametrize(
4033
"oss_name, val, w3c_name",
4134
(
@@ -54,9 +47,11 @@ def test_non_compliant_w3c_caps_is_deprecated(oss_name, val, w3c_name):
5447

5548
def test_converts_proxy_type_value_to_lowercase_for_w3c(mocker):
5649
mock = mocker.patch("selenium.webdriver.remote.webdriver.WebDriver.execute")
57-
oss_caps = {"proxy": {"proxyType": "MANUAL", "httpProxy": "foo"}}
58-
w3c_caps = {"proxy": {"proxyType": "manual", "httpProxy": "foo"}}
59-
WebDriver(desired_capabilities=deepcopy(oss_caps))
50+
w3c_caps = {"pageLoadStrategy": "normal", "proxy": {"proxyType": "manual", "httpProxy": "foo"}}
51+
options = ArgOptions()
52+
proxy = Proxy({"proxyType": ProxyType.MANUAL, "httpProxy": "foo"})
53+
options.proxy = proxy
54+
WebDriver(options=options)
6055
expected_params = {"capabilities": {"firstMatch": [{}], "alwaysMatch": w3c_caps}}
6156
mock.assert_called_with(Command.NEW_SESSION, expected_params)
6257

0 commit comments

Comments
 (0)