Skip to content

Commit a3b6d8e

Browse files
committed
Add option to override the driver version used
1 parent f7a9d49 commit a3b6d8e

File tree

7 files changed

+124
-26
lines changed

7 files changed

+124
-26
lines changed

seleniumbase/behave/behave_sb.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
-D extension-zip=ZIP (Load a Chrome Extension .zip|.crx, comma-separated.)
4141
-D extension-dir=DIR (Load a Chrome Extension directory, comma-separated.)
4242
-D binary-location=PATH (Set path of the Chromium browser binary to use.)
43+
-D driver-version=VER (Set the chromedriver or uc_driver version to use.)
4344
-D sjw (Skip JS Waits for readyState to be "complete" or Angular to load.)
4445
-D pls=PLS (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
4546
-D headless (Run tests in headless mode. The default arg on Linux OS.)
@@ -164,6 +165,7 @@ def get_configured_sb(context):
164165
sb.extension_zip = None
165166
sb.extension_dir = None
166167
sb.binary_location = None
168+
sb.driver_version = None
167169
sb.page_load_strategy = None
168170
sb.database_env = "test"
169171
sb.log_path = "latest_logs" + os.sep
@@ -459,6 +461,13 @@ def get_configured_sb(context):
459461
binary_location = sb.binary_location # revert to default
460462
sb.binary_location = binary_location
461463
continue
464+
# Handle: -D driver-version=VER / driver_version=VER
465+
if low_key in ["driver-version", "driver_version"]:
466+
driver_version = userdata[key]
467+
if driver_version == "true":
468+
driver_version = sb.driver_version # revert to default
469+
sb.driver_version = driver_version
470+
continue
462471
# Handle: -D pls=PLS / page-load-strategy=PLS / page_load_strategy=PLS
463472
if low_key in ["pls", "page-load-strategy", "page_load_strategy"]:
464473
page_load_strategy = userdata[key].lower()

seleniumbase/core/browser_launcher.py

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,25 @@ def get_uc_driver_version():
153153
return uc_driver_version
154154

155155

156-
def find_chromedriver_version_to_use(use_version):
157-
# Because https://chromedriver.chromium.org/downloads stops at 114
158-
final_chromedriver = "114"
156+
def find_chromedriver_version_to_use(use_version, driver_version):
157+
# Note: https://chromedriver.chromium.org/downloads stops at 114.
158+
# Future drivers are part of the Chrome-for-Testing collection.
159159
if (
160-
use_version
161-
and use_version.isdigit()
162-
and int(use_version) > int(final_chromedriver)
160+
driver_version
161+
and str(driver_version).split(".")[0].isdigit()
162+
and int(str(driver_version).split(".")[0]) >= 72
163163
):
164-
use_version = final_chromedriver
164+
use_version = str(driver_version)
165+
return use_version
166+
167+
168+
def find_edgedriver_version_to_use(use_version, driver_version):
169+
if (
170+
driver_version
171+
and str(driver_version).split(".")[0].isdigit()
172+
and int(str(driver_version).split(".")[0]) >= 80
173+
):
174+
use_version = str(driver_version)
165175
return use_version
166176

167177

@@ -526,6 +536,7 @@ def _set_chrome_options(
526536
extension_zip,
527537
extension_dir,
528538
binary_location,
539+
driver_version,
529540
page_load_strategy,
530541
use_wire,
531542
external_pdf,
@@ -1088,6 +1099,7 @@ def get_driver(
10881099
extension_zip=None,
10891100
extension_dir=None,
10901101
binary_location=None,
1102+
driver_version=None,
10911103
page_load_strategy=None,
10921104
use_wire=False,
10931105
external_pdf=False,
@@ -1295,6 +1307,7 @@ def get_driver(
12951307
extension_zip,
12961308
extension_dir,
12971309
binary_location,
1310+
driver_version,
12981311
page_load_strategy,
12991312
use_wire,
13001313
external_pdf,
@@ -1347,6 +1360,7 @@ def get_driver(
13471360
extension_zip,
13481361
extension_dir,
13491362
binary_location,
1363+
driver_version,
13501364
page_load_strategy,
13511365
use_wire,
13521366
external_pdf,
@@ -1403,6 +1417,7 @@ def get_remote_driver(
14031417
extension_zip,
14041418
extension_dir,
14051419
binary_location,
1420+
driver_version,
14061421
page_load_strategy,
14071422
use_wire,
14081423
external_pdf,
@@ -1522,6 +1537,7 @@ def get_remote_driver(
15221537
extension_zip,
15231538
extension_dir,
15241539
binary_location,
1540+
driver_version,
15251541
page_load_strategy,
15261542
use_wire,
15271543
external_pdf,
@@ -1712,6 +1728,7 @@ def get_remote_driver(
17121728
extension_zip,
17131729
extension_dir,
17141730
binary_location,
1731+
driver_version,
17151732
page_load_strategy,
17161733
use_wire,
17171734
external_pdf,
@@ -1834,6 +1851,7 @@ def get_remote_driver(
18341851
extension_zip,
18351852
extension_dir,
18361853
binary_location,
1854+
driver_version,
18371855
page_load_strategy,
18381856
use_wire,
18391857
external_pdf,
@@ -1956,6 +1974,7 @@ def get_local_driver(
19561974
extension_zip,
19571975
extension_dir,
19581976
binary_location,
1977+
driver_version,
19591978
page_load_strategy,
19601979
use_wire,
19611980
external_pdf,
@@ -2229,7 +2248,10 @@ def get_local_driver(
22292248
major_edge_version = None
22302249
if major_edge_version:
22312250
use_version = major_edge_version
2232-
driver_version = None
2251+
use_version = find_edgedriver_version_to_use(
2252+
use_version, driver_version
2253+
)
2254+
edge_driver_version = None
22332255
edgedriver_upgrade_needed = False
22342256
if os.path.exists(LOCAL_EDGEDRIVER):
22352257
try:
@@ -2254,16 +2276,16 @@ def get_local_driver(
22542276
else:
22552277
output = 0
22562278
if int(output) >= 2:
2257-
driver_version = output
2279+
edge_driver_version = output
22582280
except Exception:
22592281
pass
22602282
local_edgedriver_exists = False
22612283
if LOCAL_EDGEDRIVER and os.path.exists(LOCAL_EDGEDRIVER):
22622284
local_edgedriver_exists = True
22632285
if (
22642286
use_version != "latest"
2265-
and driver_version
2266-
and use_version != driver_version
2287+
and edge_driver_version
2288+
and use_version != edge_driver_version
22672289
):
22682290
edgedriver_upgrade_needed = True
22692291
else:
@@ -2761,6 +2783,7 @@ def get_local_driver(
27612783
extension_zip,
27622784
extension_dir,
27632785
binary_location,
2786+
driver_version,
27642787
page_load_strategy,
27652788
use_wire,
27662789
external_pdf,
@@ -2817,6 +2840,7 @@ def get_local_driver(
28172840
extension_zip,
28182841
extension_dir,
28192842
binary_location,
2843+
driver_version,
28202844
page_load_strategy,
28212845
use_wire,
28222846
external_pdf,
@@ -2860,7 +2884,7 @@ def get_local_driver(
28602884
major_chrome_version = None
28612885
if major_chrome_version:
28622886
use_version = major_chrome_version
2863-
driver_version = None
2887+
ch_driver_version = None
28642888
path_chromedriver = chromedriver_on_path()
28652889
if os.path.exists(LOCAL_CHROMEDRIVER):
28662890
try:
@@ -2873,7 +2897,7 @@ def get_local_driver(
28732897
output = output.decode("utf-8")
28742898
output = output.split(" ")[1].split(".")[0]
28752899
if int(output) >= 2:
2876-
driver_version = output
2900+
ch_driver_version = output
28772901
except Exception:
28782902
pass
28792903
elif path_chromedriver:
@@ -2887,7 +2911,7 @@ def get_local_driver(
28872911
output = output.decode("utf-8")
28882912
output = output.split(" ")[1].split(".")[0]
28892913
if int(output) >= 2:
2890-
driver_version = output
2914+
ch_driver_version = output
28912915
except Exception:
28922916
pass
28932917
if headless2:
@@ -2922,12 +2946,14 @@ def get_local_driver(
29222946
from seleniumbase import config as sb_config
29232947

29242948
sb_config.multi_proxy = True
2925-
use_version = find_chromedriver_version_to_use(use_version)
2949+
use_version = find_chromedriver_version_to_use(
2950+
use_version, driver_version
2951+
)
29262952
if (
29272953
LOCAL_CHROMEDRIVER
29282954
and os.path.exists(LOCAL_CHROMEDRIVER)
29292955
and (
2930-
use_version == driver_version
2956+
use_version == ch_driver_version
29312957
or use_version == "latest"
29322958
)
29332959
and (
@@ -2951,11 +2977,11 @@ def get_local_driver(
29512977
not path_chromedriver
29522978
or (
29532979
use_version != "latest"
2954-
and driver_version
2955-
and use_version != driver_version
2980+
and ch_driver_version
2981+
and use_version != ch_driver_version
29562982
and (
29572983
selenium4_or_newer
2958-
or driver_version != "72"
2984+
or ch_driver_version != "72"
29592985
)
29602986
)
29612987
or (
@@ -3000,9 +3026,9 @@ def get_local_driver(
30003026
if (
30013027
not path_chromedriver
30023028
or (
3003-
driver_version
3029+
ch_driver_version
30043030
and (
3005-
int(driver_version)
3031+
int(ch_driver_version)
30063032
< int(d_latest_major)
30073033
)
30083034
)
@@ -3056,9 +3082,9 @@ def get_local_driver(
30563082
if (
30573083
not path_chromedriver
30583084
or (
3059-
driver_version
3085+
ch_driver_version
30603086
and (
3061-
int(driver_version)
3087+
int(ch_driver_version)
30623088
< int(d_latest_major)
30633089
)
30643090
)
@@ -3077,7 +3103,9 @@ def get_local_driver(
30773103
)
30783104
with uc_lock: # Avoid multithreaded issues
30793105
uc_driver_version = get_uc_driver_version()
3080-
use_version = find_chromedriver_version_to_use(use_version)
3106+
use_version = find_chromedriver_version_to_use(
3107+
use_version, driver_version
3108+
)
30813109
if (
30823110
(
30833111
uc_driver_version != use_version
@@ -3252,7 +3280,9 @@ def get_local_driver(
32523280
and int(major_chrome_version) >= 86
32533281
):
32543282
mcv = major_chrome_version
3255-
mcv = find_chromedriver_version_to_use(mcv)
3283+
mcv = find_chromedriver_version_to_use(
3284+
mcv, driver_version
3285+
)
32563286
headless = True
32573287
headless_options = _set_chrome_options(
32583288
browser_name,
@@ -3294,6 +3324,7 @@ def get_local_driver(
32943324
extension_zip,
32953325
extension_dir,
32963326
binary_location,
3327+
driver_version,
32973328
page_load_strategy,
32983329
use_wire,
32993330
external_pdf,

seleniumbase/fixtures/base_case.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3628,6 +3628,7 @@ def get_new_driver(
36283628
extension_zip=None,
36293629
extension_dir=None,
36303630
binary_location=None,
3631+
driver_version=None,
36313632
page_load_strategy=None,
36323633
use_wire=None,
36333634
external_pdf=None,
@@ -3683,6 +3684,7 @@ def get_new_driver(
36833684
extension_zip - A Chrome Extension ZIP file to use (Chrome-only)
36843685
extension_dir - A Chrome Extension folder to use (Chrome-only)
36853686
binary_location - the path of the browser binary to use (Chromium)
3687+
driver_version - the chromedriver or uc_driver version to force
36863688
page_load_strategy - the option to change pageLoadStrategy (Chrome)
36873689
use_wire - Use selenium-wire webdriver instead of the selenium one
36883690
external_pdf - "plugins.always_open_pdf_externally": True. (Chrome)
@@ -3807,6 +3809,8 @@ def get_new_driver(
38073809
extension_dir = self.extension_dir
38083810
if binary_location is None:
38093811
binary_location = self.binary_location
3812+
if driver_version is None:
3813+
driver_version = self.driver_version
38103814
if page_load_strategy is None:
38113815
page_load_strategy = self.page_load_strategy
38123816
if use_wire is None:
@@ -3886,6 +3890,7 @@ def get_new_driver(
38863890
extension_zip=extension_zip,
38873891
extension_dir=extension_dir,
38883892
binary_location=binary_location,
3893+
driver_version=driver_version,
38893894
page_load_strategy=page_load_strategy,
38903895
use_wire=use_wire,
38913896
external_pdf=external_pdf,
@@ -13882,6 +13887,7 @@ def setUp(self, masterqa_mode=False):
1388213887
self.extension_zip = sb_config.extension_zip
1388313888
self.extension_dir = sb_config.extension_dir
1388413889
self.binary_location = sb_config.binary_location
13890+
self.driver_version = sb_config.driver_version
1388513891
self.page_load_strategy = sb_config.page_load_strategy
1388613892
self.use_wire = sb_config.use_wire
1388713893
self.external_pdf = sb_config.external_pdf
@@ -14202,6 +14208,7 @@ def setUp(self, masterqa_mode=False):
1420214208
extension_zip=self.extension_zip,
1420314209
extension_dir=self.extension_dir,
1420414210
binary_location=self.binary_location,
14211+
driver_version=self.driver_version,
1420514212
page_load_strategy=self.page_load_strategy,
1420614213
use_wire=self.use_wire,
1420714214
external_pdf=self.external_pdf,

seleniumbase/plugins/driver_manager.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ def Driver(
9696
extension_zip=None, # Load a Chrome Extension .zip|.crx, comma-separated.)
9797
extension_dir=None, # Load a Chrome Extension directory, comma-separated.)
9898
binary_location=None, # Set path of the Chromium browser binary to use.
99+
driver_version=None, # Set the chromedriver or uc_driver version to use.
99100
page_load_strategy=None, # Set Chrome PLS to "normal", "eager", or "none".
100101
use_wire=None, # Use selenium-wire's webdriver over selenium webdriver.
101102
external_pdf=None, # Set Chrome "plugins.always_open_pdf_externally":True.
@@ -395,6 +396,16 @@ def Driver(
395396
ad_block_on = True
396397
else:
397398
ad_block_on = False
399+
if driver_version is None:
400+
arg_join = " ".join(sys_argv)
401+
if "--driver-version=" in arg_join:
402+
driver_version = (
403+
arg_join.split("--driver-version=")[1].split(" ")[0]
404+
)
405+
elif "--driver_version=" in arg_join:
406+
driver_version = (
407+
arg_join.split("--driver_version=")[1].split(" ")[0]
408+
)
398409
browser_name = browser
399410

400411
# Launch a web browser
@@ -444,6 +455,7 @@ def Driver(
444455
extension_zip=extension_zip,
445456
extension_dir=extension_dir,
446457
binary_location=binary_location,
458+
driver_version=driver_version,
447459
page_load_strategy=page_load_strategy,
448460
use_wire=use_wire,
449461
external_pdf=external_pdf,

0 commit comments

Comments
 (0)