Skip to content

Commit 18539c9

Browse files
committed
Add the ability to set the User-Agent string for the browser
1 parent 41eb330 commit 18539c9

File tree

4 files changed

+46
-16
lines changed

4 files changed

+46
-16
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ def _add_chrome_proxy_extension(
8383

8484

8585
def _set_chrome_options(
86-
downloads_path, proxy_string, proxy_auth, proxy_user, proxy_pass):
86+
downloads_path, proxy_string, proxy_auth,
87+
proxy_user, proxy_pass, user_agent):
8788
chrome_options = webdriver.ChromeOptions()
8889
prefs = {
8990
"download.default_directory": downloads_path,
@@ -100,6 +101,8 @@ def _set_chrome_options(
100101
chrome_options.add_argument("--allow-file-access-from-files")
101102
chrome_options.add_argument("--allow-insecure-localhost")
102103
chrome_options.add_argument("--allow-running-insecure-content")
104+
if user_agent:
105+
chrome_options.add_argument("--user-agent=%s" % user_agent)
103106
chrome_options.add_argument("--disable-infobars")
104107
chrome_options.add_argument("--disable-save-password-bubble")
105108
chrome_options.add_argument("--disable-single-click-autofill")
@@ -113,7 +116,7 @@ def _set_chrome_options(
113116
return chrome_options
114117

115118

116-
def _create_firefox_profile(downloads_path, proxy_string):
119+
def _create_firefox_profile(downloads_path, proxy_string, user_agent):
117120
profile = webdriver.FirefoxProfile()
118121
profile.accept_untrusted_certs = True
119122
profile.set_preference("reader.parse-on-load.enabled", False)
@@ -128,6 +131,8 @@ def _create_firefox_profile(downloads_path, proxy_string):
128131
profile.set_preference("network.proxy.http_port", int(proxy_port))
129132
profile.set_preference("network.proxy.ssl", proxy_server)
130133
profile.set_preference("network.proxy.ssl_port", int(proxy_port))
134+
if user_agent:
135+
profile.set_preference("general.useragent.override", user_agent)
131136
profile.set_preference(
132137
"security.mixed_content.block_active_content", False)
133138
profile.set_preference("security.csp.enable", False)
@@ -195,7 +200,7 @@ def validate_proxy_string(proxy_string):
195200

196201
def get_driver(browser_name, headless=False, use_grid=False,
197202
servername='localhost', port=4444, proxy_string=None,
198-
cap_file=None):
203+
user_agent=None, cap_file=None):
199204
proxy_auth = False
200205
proxy_user = None
201206
proxy_pass = None
@@ -224,27 +229,26 @@ def get_driver(browser_name, headless=False, use_grid=False,
224229
if use_grid:
225230
return get_remote_driver(
226231
browser_name, headless, servername, port, proxy_string, proxy_auth,
227-
proxy_user, proxy_pass, cap_file)
232+
proxy_user, proxy_pass, user_agent, cap_file)
228233
else:
229234
return get_local_driver(
230235
browser_name, headless, proxy_string, proxy_auth,
231-
proxy_user, proxy_pass)
236+
proxy_user, proxy_pass, user_agent)
232237

233238

234239
def get_remote_driver(
235240
browser_name, headless, servername, port, proxy_string, proxy_auth,
236-
proxy_user, proxy_pass, cap_file):
241+
proxy_user, proxy_pass, user_agent, cap_file):
237242
downloads_path = download_helper.get_downloads_folder()
238243
download_helper.reset_downloads_folder()
239244
address = "http://%s:%s/wd/hub" % (servername, port)
240245
desired_caps = {}
241246
if cap_file:
242247
desired_caps = capabilities_parser.get_desired_capabilities(cap_file)
243-
244248
if browser_name == constants.Browser.GOOGLE_CHROME:
245249
chrome_options = _set_chrome_options(
246250
downloads_path, proxy_string, proxy_auth,
247-
proxy_user, proxy_pass)
251+
proxy_user, proxy_pass, user_agent)
248252
if headless:
249253
if not proxy_auth:
250254
# Headless Chrome doesn't support extensions, which are
@@ -264,7 +268,8 @@ def get_remote_driver(
264268
elif browser_name == constants.Browser.FIREFOX:
265269
try:
266270
# Use Geckodriver for Firefox if it's on the PATH
267-
profile = _create_firefox_profile(downloads_path, proxy_string)
271+
profile = _create_firefox_profile(
272+
downloads_path, proxy_string, user_agent)
268273
firefox_capabilities = DesiredCapabilities.FIREFOX.copy()
269274
firefox_capabilities['marionette'] = True
270275
if headless:
@@ -280,7 +285,8 @@ def get_remote_driver(
280285
browser_profile=profile)
281286
except WebDriverException:
282287
# Don't use Geckodriver: Only works for old versions of Firefox
283-
profile = _create_firefox_profile(downloads_path, proxy_string)
288+
profile = _create_firefox_profile(
289+
downloads_path, proxy_string, user_agent)
284290
firefox_capabilities = DesiredCapabilities.FIREFOX.copy()
285291
firefox_capabilities['marionette'] = False
286292
if headless:
@@ -360,7 +366,7 @@ def get_remote_driver(
360366

361367
def get_local_driver(
362368
browser_name, headless, proxy_string, proxy_auth,
363-
proxy_user, proxy_pass):
369+
proxy_user, proxy_pass, user_agent):
364370
'''
365371
Spins up a new web browser and returns the driver.
366372
Can also be used to spin up additional browsers for the same test.
@@ -372,7 +378,8 @@ def get_local_driver(
372378
try:
373379
try:
374380
# Use Geckodriver for Firefox if it's on the PATH
375-
profile = _create_firefox_profile(downloads_path, proxy_string)
381+
profile = _create_firefox_profile(
382+
downloads_path, proxy_string, user_agent)
376383
firefox_capabilities = DesiredCapabilities.FIREFOX.copy()
377384
firefox_capabilities['marionette'] = True
378385
options = webdriver.FirefoxOptions()
@@ -392,7 +399,8 @@ def get_local_driver(
392399
options=options)
393400
except WebDriverException:
394401
# Don't use Geckodriver: Only works for old versions of Firefox
395-
profile = _create_firefox_profile(downloads_path, proxy_string)
402+
profile = _create_firefox_profile(
403+
downloads_path, proxy_string, user_agent)
396404
firefox_capabilities = DesiredCapabilities.FIREFOX.copy()
397405
firefox_capabilities['marionette'] = False
398406
firefox_driver = webdriver.Firefox(
@@ -451,7 +459,7 @@ def get_local_driver(
451459
try:
452460
chrome_options = _set_chrome_options(
453461
downloads_path, proxy_string, proxy_auth,
454-
proxy_user, proxy_pass)
462+
proxy_user, proxy_pass, user_agent)
455463
if headless:
456464
# Headless Chrome doesn't support extensions, which are
457465
# required when using a proxy server that has authentication.

seleniumbase/fixtures/base_case.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,8 +2348,8 @@ def save_screenshot(self, name, folder=None):
23482348
return page_actions.save_screenshot(self.driver, name, folder)
23492349

23502350
def get_new_driver(self, browser=None, headless=None,
2351-
servername=None, port=None, proxy=None, switch_to=True,
2352-
cap_file=None):
2351+
servername=None, port=None, proxy=None, agent=None,
2352+
switch_to=True, cap_file=None):
23532353
""" This method spins up an extra browser for tests that require
23542354
more than one. The first browser is already provided by tests
23552355
that import base_case.BaseCase from seleniumbase. If parameters
@@ -2399,6 +2399,9 @@ def get_new_driver(self, browser=None, headless=None,
23992399
proxy_string = proxy
24002400
if proxy_string is None:
24012401
proxy_string = self.proxy_string
2402+
user_agent = agent
2403+
if user_agent is None:
2404+
user_agent = self.user_agent
24022405
if cap_file is None:
24032406
cap_file = self.cap_file
24042407
valid_browsers = constants.ValidBrowsers.valid_browsers
@@ -2413,6 +2416,7 @@ def get_new_driver(self, browser=None, headless=None,
24132416
servername=servername,
24142417
port=port,
24152418
proxy_string=proxy_string,
2419+
user_agent=user_agent,
24162420
cap_file=cap_file)
24172421
self._drivers_list.append(new_driver)
24182422
if switch_to:
@@ -2776,6 +2780,7 @@ def setUp(self):
27762780
self.servername = sb_config.servername
27772781
self.port = sb_config.port
27782782
self.proxy_string = sb_config.proxy_string
2783+
self.user_agent = sb_config.user_agent
27792784
self.cap_file = sb_config.cap_file
27802785
self.database_env = sb_config.database_env
27812786
self.message_duration = sb_config.message_duration
@@ -2846,6 +2851,7 @@ def setUp(self):
28462851
servername=self.servername,
28472852
port=self.port,
28482853
proxy=self.proxy_string,
2854+
agent=self.user_agent,
28492855
switch_to=True,
28502856
cap_file=self.cap_file)
28512857
self._default_driver = self.driver

seleniumbase/plugins/pytest_plugin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ def pytest_addoption(parser):
9797
username:password@servername:port OR
9898
A dict key from proxy_list.PROXY_LIST
9999
Default: None.""")
100+
parser.addoption('--agent', action='store',
101+
dest='user_agent',
102+
default=None,
103+
help="""Designates the User-Agent for the browser to use.
104+
Format: A string.
105+
Default: None.""")
100106
parser.addoption('--headless', action="store_true",
101107
dest='headless',
102108
default=False,
@@ -155,6 +161,7 @@ def pytest_configure(config):
155161
sb_config.data = config.getoption('data')
156162
sb_config.environment = config.getoption('environment')
157163
sb_config.with_selenium = config.getoption('with_selenium')
164+
sb_config.user_agent = config.getoption('user_agent')
158165
sb_config.headless = config.getoption('headless')
159166
sb_config.with_testing_base = config.getoption('with_testing_base')
160167
sb_config.with_db_reporting = config.getoption('with_db_reporting')

seleniumbase/plugins/selenium_plugin.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class SeleniumBrowser(Plugin):
1919
self.options.server -- the server used by the test (--server)
2020
self.options.port -- the port used by the test (--port)
2121
self.options.proxy -- designates the proxy server:port to use. (--proxy)
22+
self.options.agent -- designates the User Agent for the browser. (--agent)
2223
self.options.headless -- the option to run headlessly (--headless)
2324
self.options.demo_mode -- the option to slow down Selenium (--demo_mode)
2425
self.options.demo_sleep -- Selenium action delay in DemoMode (--demo_sleep)
@@ -73,6 +74,13 @@ def options(self, parser, env):
7374
username:password@servername:port OR
7475
A dict key from proxy_list.PROXY_LIST
7576
Default: None.""")
77+
parser.add_option(
78+
'--agent', action='store',
79+
dest='user_agent',
80+
default=None,
81+
help="""Designates the User-Agent for the browser to use.
82+
Format: A string.
83+
Default: None.""")
7684
parser.add_option(
7785
'--headless', action="store_true",
7886
dest='headless',
@@ -140,6 +148,7 @@ def beforeTest(self, test):
140148
test.test.servername = self.options.servername
141149
test.test.port = self.options.port
142150
test.test.proxy_string = self.options.proxy_string
151+
test.test.user_agent = self.options.user_agent
143152
test.test.demo_mode = self.options.demo_mode
144153
test.test.demo_sleep = self.options.demo_sleep
145154
test.test.highlights = self.options.highlights

0 commit comments

Comments
 (0)