@@ -295,45 +295,74 @@ def _was_driver_repaired():
295
295
return os .path .exists (file_path )
296
296
297
297
298
+ def _set_proxy_filenames ():
299
+ DOWNLOADS_DIR = constants .Files .DOWNLOADS_FOLDER
300
+ for num in range (1000 ):
301
+ PROXY_ZIP_PATH = os .path .join (DOWNLOADS_DIR , "proxy_%s.zip" % num )
302
+ PROXY_DIR_PATH = os .path .join (DOWNLOADS_DIR , "proxy_ext_dir_%s" % num )
303
+ if os .path .exists (PROXY_ZIP_PATH ) or os .path .exists (PROXY_DIR_PATH ):
304
+ continue
305
+ proxy_helper .PROXY_ZIP_PATH = PROXY_ZIP_PATH
306
+ proxy_helper .PROXY_DIR_PATH = PROXY_DIR_PATH
307
+ return
308
+ # Exceeded upper bound. Use Defaults:
309
+ PROXY_ZIP_PATH = os .path .join (DOWNLOADS_DIR , "proxy.zip" )
310
+ PROXY_DIR_PATH = os .path .join (DOWNLOADS_DIR , "proxy_ext_dir" )
311
+ proxy_helper .PROXY_ZIP_PATH = PROXY_ZIP_PATH
312
+ proxy_helper .PROXY_DIR_PATH = PROXY_DIR_PATH
313
+
314
+
298
315
def _add_chrome_proxy_extension (
299
- chrome_options , proxy_string , proxy_user , proxy_pass , zip_it = True
316
+ chrome_options ,
317
+ proxy_string ,
318
+ proxy_user ,
319
+ proxy_pass ,
320
+ zip_it = True ,
321
+ multi_proxy = False ,
300
322
):
301
323
"""Implementation of https://stackoverflow.com/a/35293284 for
302
324
https://stackoverflow.com/questions/12848327/
303
325
(Run Selenium on a proxy server that requires authentication.)"""
304
326
arg_join = " " .join (sys .argv )
305
- if not ("-n" in sys .argv or " -n=" in arg_join or arg_join == "-c" ):
327
+ if (
328
+ not ("-n" in sys .argv or " -n=" in arg_join or arg_join == "-c" )
329
+ and not multi_proxy
330
+ ):
306
331
# Single-threaded
307
332
if zip_it :
308
333
proxy_helper .create_proxy_ext (proxy_string , proxy_user , proxy_pass )
309
- proxy_zip = PROXY_ZIP_PATH
334
+ proxy_zip = proxy_helper . PROXY_ZIP_PATH
310
335
chrome_options .add_extension (proxy_zip )
311
336
else :
312
337
proxy_helper .create_proxy_ext (
313
338
proxy_string , proxy_user , proxy_pass , zip_it = False
314
339
)
315
- chrome_options = add_chrome_ext_dir ( chrome_options , PROXY_DIR_PATH )
316
-
340
+ proxy_dir_path = proxy_helper . PROXY_DIR_PATH
341
+ chrome_options = add_chrome_ext_dir ( chrome_options , proxy_dir_path )
317
342
else :
318
- # Pytest multithreaded test
343
+ # Multi-threaded
319
344
if zip_it :
320
345
proxy_zip_lock = fasteners .InterProcessLock (PROXY_ZIP_LOCK )
321
346
with proxy_zip_lock :
322
- if not os .path .exists (PROXY_ZIP_PATH ):
347
+ if multi_proxy :
348
+ _set_proxy_filenames ()
349
+ if not os .path .exists (proxy_helper .PROXY_ZIP_PATH ):
323
350
proxy_helper .create_proxy_ext (
324
351
proxy_string , proxy_user , proxy_pass
325
352
)
326
- proxy_zip = PROXY_ZIP_PATH
353
+ proxy_zip = proxy_helper . PROXY_ZIP_PATH
327
354
chrome_options .add_extension (proxy_zip )
328
355
else :
329
356
proxy_dir_lock = fasteners .InterProcessLock (PROXY_DIR_LOCK )
330
357
with proxy_dir_lock :
331
- if not os .path .exists (PROXY_DIR_PATH ):
358
+ if multi_proxy :
359
+ _set_proxy_filenames ()
360
+ if not os .path .exists (proxy_helper .PROXY_DIR_PATH ):
332
361
proxy_helper .create_proxy_ext (
333
362
proxy_string , proxy_user , proxy_pass , False
334
363
)
335
364
chrome_options = add_chrome_ext_dir (
336
- chrome_options , PROXY_DIR_PATH
365
+ chrome_options , proxy_helper . PROXY_DIR_PATH
337
366
)
338
367
return chrome_options
339
368
@@ -406,6 +435,7 @@ def _set_chrome_options(
406
435
proxy_pass ,
407
436
proxy_bypass_list ,
408
437
proxy_pac_url ,
438
+ multi_proxy ,
409
439
user_agent ,
410
440
recorder_ext ,
411
441
disable_js ,
@@ -656,7 +686,12 @@ def _set_chrome_options(
656
686
if is_using_uc (undetectable , browser_name ):
657
687
zip_it = False # undetected-chromedriver needs a folder ext
658
688
chrome_options = _add_chrome_proxy_extension (
659
- chrome_options , proxy_string , proxy_user , proxy_pass , zip_it
689
+ chrome_options ,
690
+ proxy_string ,
691
+ proxy_user ,
692
+ proxy_pass ,
693
+ zip_it ,
694
+ multi_proxy ,
660
695
)
661
696
chrome_options .add_argument ("--proxy-server=%s" % proxy_string )
662
697
if proxy_bypass_list :
@@ -669,7 +704,12 @@ def _set_chrome_options(
669
704
if is_using_uc (undetectable , browser_name ):
670
705
zip_it = False
671
706
chrome_options = _add_chrome_proxy_extension (
672
- chrome_options , None , proxy_user , proxy_pass , zip_it
707
+ chrome_options ,
708
+ None ,
709
+ proxy_user ,
710
+ proxy_pass ,
711
+ zip_it ,
712
+ multi_proxy ,
673
713
)
674
714
chrome_options .add_argument ("--proxy-pac-url=%s" % proxy_pac_url )
675
715
if browser_name != constants .Browser .OPERA :
@@ -1000,6 +1040,7 @@ def get_driver(
1000
1040
proxy_string = None ,
1001
1041
proxy_bypass_list = None ,
1002
1042
proxy_pac_url = None ,
1043
+ multi_proxy = None ,
1003
1044
user_agent = None ,
1004
1045
cap_file = None ,
1005
1046
cap_string = None ,
@@ -1205,6 +1246,7 @@ def get_driver(
1205
1246
proxy_pass ,
1206
1247
proxy_bypass_list ,
1207
1248
proxy_pac_url ,
1249
+ multi_proxy ,
1208
1250
user_agent ,
1209
1251
cap_file ,
1210
1252
cap_string ,
@@ -1257,6 +1299,7 @@ def get_driver(
1257
1299
proxy_pass ,
1258
1300
proxy_bypass_list ,
1259
1301
proxy_pac_url ,
1302
+ multi_proxy ,
1260
1303
user_agent ,
1261
1304
recorder_ext ,
1262
1305
disable_js ,
@@ -1309,6 +1352,7 @@ def get_remote_driver(
1309
1352
proxy_pass ,
1310
1353
proxy_bypass_list ,
1311
1354
proxy_pac_url ,
1355
+ multi_proxy ,
1312
1356
user_agent ,
1313
1357
cap_file ,
1314
1358
cap_string ,
@@ -1430,6 +1474,7 @@ def get_remote_driver(
1430
1474
proxy_pass ,
1431
1475
proxy_bypass_list ,
1432
1476
proxy_pac_url ,
1477
+ multi_proxy ,
1433
1478
user_agent ,
1434
1479
recorder_ext ,
1435
1480
disable_js ,
@@ -1618,6 +1663,7 @@ def get_remote_driver(
1618
1663
proxy_pass ,
1619
1664
proxy_bypass_list ,
1620
1665
proxy_pac_url ,
1666
+ multi_proxy ,
1621
1667
user_agent ,
1622
1668
recorder_ext ,
1623
1669
disable_js ,
@@ -1738,6 +1784,7 @@ def get_remote_driver(
1738
1784
proxy_pass ,
1739
1785
proxy_bypass_list ,
1740
1786
proxy_pac_url ,
1787
+ multi_proxy ,
1741
1788
user_agent ,
1742
1789
recorder_ext ,
1743
1790
disable_js ,
@@ -1856,6 +1903,7 @@ def get_local_driver(
1856
1903
proxy_pass ,
1857
1904
proxy_bypass_list ,
1858
1905
proxy_pac_url ,
1906
+ multi_proxy ,
1859
1907
user_agent ,
1860
1908
recorder_ext ,
1861
1909
disable_js ,
@@ -2389,7 +2437,12 @@ def get_local_driver(
2389
2437
if proxy_string :
2390
2438
if proxy_auth :
2391
2439
edge_options = _add_chrome_proxy_extension (
2392
- edge_options , proxy_string , proxy_user , proxy_pass
2440
+ edge_options ,
2441
+ proxy_string ,
2442
+ proxy_user ,
2443
+ proxy_pass ,
2444
+ zip_it = True ,
2445
+ multi_proxy = multi_proxy ,
2393
2446
)
2394
2447
edge_options .add_argument ("--proxy-server=%s" % proxy_string )
2395
2448
if proxy_bypass_list :
@@ -2399,7 +2452,12 @@ def get_local_driver(
2399
2452
elif proxy_pac_url :
2400
2453
if proxy_auth :
2401
2454
edge_options = _add_chrome_proxy_extension (
2402
- edge_options , None , proxy_user , proxy_pass
2455
+ edge_options ,
2456
+ None ,
2457
+ proxy_user ,
2458
+ proxy_pass ,
2459
+ zip_it = True ,
2460
+ multi_proxy = multi_proxy ,
2403
2461
)
2404
2462
edge_options .add_argument ("--proxy-pac-url=%s" % proxy_pac_url )
2405
2463
edge_options .add_argument ("--test-type" )
@@ -2614,6 +2672,7 @@ def get_local_driver(
2614
2672
proxy_pass ,
2615
2673
proxy_bypass_list ,
2616
2674
proxy_pac_url ,
2675
+ multi_proxy ,
2617
2676
user_agent ,
2618
2677
recorder_ext ,
2619
2678
disable_js ,
@@ -2668,6 +2727,7 @@ def get_local_driver(
2668
2727
proxy_pass ,
2669
2728
proxy_bypass_list ,
2670
2729
proxy_pac_url ,
2730
+ multi_proxy ,
2671
2731
user_agent ,
2672
2732
recorder_ext ,
2673
2733
disable_js ,
@@ -2796,6 +2856,10 @@ def get_local_driver(
2796
2856
uc_driver_version = None
2797
2857
if is_using_uc (undetectable , browser_name ):
2798
2858
uc_driver_version = get_uc_driver_version ()
2859
+ if multi_proxy :
2860
+ from seleniumbase import config as sb_config
2861
+
2862
+ sb_config .multi_proxy = True
2799
2863
if (
2800
2864
LOCAL_CHROMEDRIVER
2801
2865
and os .path .exists (LOCAL_CHROMEDRIVER )
@@ -3133,6 +3197,7 @@ def get_local_driver(
3133
3197
proxy_pass ,
3134
3198
proxy_bypass_list ,
3135
3199
proxy_pac_url ,
3200
+ multi_proxy ,
3136
3201
user_agent ,
3137
3202
recorder_ext ,
3138
3203
disable_js ,
0 commit comments