seleniumbase 4.24.11__py3-none-any.whl → 4.33.15__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. sbase/__init__.py +1 -0
  2. sbase/steps.py +7 -0
  3. seleniumbase/__init__.py +16 -7
  4. seleniumbase/__version__.py +1 -1
  5. seleniumbase/behave/behave_sb.py +97 -32
  6. seleniumbase/common/decorators.py +16 -7
  7. seleniumbase/config/proxy_list.py +3 -3
  8. seleniumbase/config/settings.py +4 -0
  9. seleniumbase/console_scripts/logo_helper.py +47 -8
  10. seleniumbase/console_scripts/run.py +345 -335
  11. seleniumbase/console_scripts/sb_behave_gui.py +5 -12
  12. seleniumbase/console_scripts/sb_caseplans.py +6 -13
  13. seleniumbase/console_scripts/sb_commander.py +5 -12
  14. seleniumbase/console_scripts/sb_install.py +62 -54
  15. seleniumbase/console_scripts/sb_mkchart.py +13 -20
  16. seleniumbase/console_scripts/sb_mkdir.py +11 -17
  17. seleniumbase/console_scripts/sb_mkfile.py +69 -43
  18. seleniumbase/console_scripts/sb_mkpres.py +13 -20
  19. seleniumbase/console_scripts/sb_mkrec.py +88 -21
  20. seleniumbase/console_scripts/sb_objectify.py +30 -30
  21. seleniumbase/console_scripts/sb_print.py +5 -12
  22. seleniumbase/console_scripts/sb_recorder.py +16 -11
  23. seleniumbase/core/browser_launcher.py +1658 -221
  24. seleniumbase/core/log_helper.py +42 -27
  25. seleniumbase/core/mysql.py +1 -4
  26. seleniumbase/core/proxy_helper.py +35 -30
  27. seleniumbase/core/recorder_helper.py +24 -5
  28. seleniumbase/core/sb_cdp.py +1951 -0
  29. seleniumbase/core/sb_driver.py +162 -8
  30. seleniumbase/core/settings_parser.py +6 -0
  31. seleniumbase/core/style_sheet.py +10 -0
  32. seleniumbase/extensions/recorder.zip +0 -0
  33. seleniumbase/fixtures/base_case.py +1225 -614
  34. seleniumbase/fixtures/constants.py +10 -1
  35. seleniumbase/fixtures/js_utils.py +171 -144
  36. seleniumbase/fixtures/page_actions.py +177 -13
  37. seleniumbase/fixtures/page_utils.py +25 -53
  38. seleniumbase/fixtures/shared_utils.py +97 -11
  39. seleniumbase/js_code/active_css_js.py +1 -1
  40. seleniumbase/js_code/recorder_js.py +1 -1
  41. seleniumbase/plugins/base_plugin.py +2 -3
  42. seleniumbase/plugins/driver_manager.py +340 -65
  43. seleniumbase/plugins/pytest_plugin.py +276 -47
  44. seleniumbase/plugins/sb_manager.py +412 -99
  45. seleniumbase/plugins/selenium_plugin.py +122 -17
  46. seleniumbase/translate/translator.py +0 -7
  47. seleniumbase/undetected/__init__.py +59 -52
  48. seleniumbase/undetected/cdp.py +0 -1
  49. seleniumbase/undetected/cdp_driver/__init__.py +1 -0
  50. seleniumbase/undetected/cdp_driver/_contradict.py +110 -0
  51. seleniumbase/undetected/cdp_driver/browser.py +829 -0
  52. seleniumbase/undetected/cdp_driver/cdp_util.py +458 -0
  53. seleniumbase/undetected/cdp_driver/config.py +334 -0
  54. seleniumbase/undetected/cdp_driver/connection.py +639 -0
  55. seleniumbase/undetected/cdp_driver/element.py +1168 -0
  56. seleniumbase/undetected/cdp_driver/tab.py +1323 -0
  57. seleniumbase/undetected/dprocess.py +4 -7
  58. seleniumbase/undetected/options.py +6 -8
  59. seleniumbase/undetected/patcher.py +11 -13
  60. seleniumbase/undetected/reactor.py +0 -1
  61. seleniumbase/undetected/webelement.py +16 -3
  62. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/LICENSE +1 -1
  63. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/METADATA +299 -252
  64. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/RECORD +67 -69
  65. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/WHEEL +1 -1
  66. sbase/ReadMe.txt +0 -2
  67. seleniumbase/ReadMe.md +0 -25
  68. seleniumbase/common/ReadMe.md +0 -71
  69. seleniumbase/console_scripts/ReadMe.md +0 -731
  70. seleniumbase/drivers/ReadMe.md +0 -27
  71. seleniumbase/extensions/ReadMe.md +0 -12
  72. seleniumbase/masterqa/ReadMe.md +0 -61
  73. seleniumbase/resources/ReadMe.md +0 -31
  74. seleniumbase/resources/favicon.ico +0 -0
  75. seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
  76. seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
  77. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/entry_points.txt +0 -0
  78. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ Usage --> ``with DriverContext() as driver:``
7
7
 
8
8
  Example -->
9
9
 
10
- ```
10
+ ```python
11
11
  from seleniumbase import DriverContext
12
12
 
13
13
  with DriverContext() as driver:
@@ -27,7 +27,7 @@ Usage --> ``driver = Driver()``
27
27
 
28
28
  Example -->
29
29
 
30
- ```
30
+ ```python
31
31
  from seleniumbase import Driver
32
32
 
33
33
  driver = Driver()
@@ -36,6 +36,7 @@ driver.get("https://google.com/ncr")
36
36
 
37
37
  ###########################################################################
38
38
  """
39
+ import os
39
40
  import sys
40
41
 
41
42
 
@@ -64,8 +65,9 @@ class DriverContext():
64
65
 
65
66
  def Driver(
66
67
  browser=None, # Choose from "chrome", "edge", "firefox", or "safari".
67
- headless=None, # The original headless mode for Chromium and Firefox.
68
- headless2=None, # Chromium's new headless mode. (Has more features)
68
+ headless=None, # Use the default headless mode for Chromium and Firefox.
69
+ headless1=None, # Use Chromium's old headless mode. (Fast, but limited)
70
+ headless2=None, # Use Chromium's new headless mode. (Has more features)
69
71
  headed=None, # Run tests in headed/GUI mode on Linux, where not default.
70
72
  locale_code=None, # Set the Language Locale Code for the web browser.
71
73
  protocol=None, # The Selenium Grid protocol: "http" or "https".
@@ -74,12 +76,13 @@ def Driver(
74
76
  proxy=None, # Use proxy. Format: "SERVER:PORT" or "USER:PASS@SERVER:PORT".
75
77
  proxy_bypass_list=None, # Skip proxy when using the listed domains.
76
78
  proxy_pac_url=None, # Use PAC file. (Format: URL or USERNAME:PASSWORD@URL)
77
- multi_proxy=False, # Allow multiple proxies with auth when multi-threaded.
79
+ multi_proxy=None, # Allow multiple proxies with auth when multi-threaded.
78
80
  agent=None, # Modify the web browser's User-Agent string.
79
81
  cap_file=None, # The desired capabilities to use with a Selenium Grid.
80
82
  cap_string=None, # The desired capabilities to use with a Selenium Grid.
81
83
  recorder_ext=None, # Enables the SeleniumBase Recorder Chromium extension.
82
- disable_js=None, # Disable JavaScript on websites. Pages might break!
84
+ disable_cookies=None, # Disable Cookies on websites. (Pages might break!)
85
+ disable_js=None, # Disable JavaScript on websites. (Pages might break!)
83
86
  disable_csp=None, # Disable the Content Security Policy of websites.
84
87
  enable_ws=None, # Enable Web Security on Chromium-based browsers.
85
88
  disable_ws=None, # Reverse of "enable_ws". (None and False are different)
@@ -114,20 +117,125 @@ def Driver(
114
117
  page_load_strategy=None, # Set Chrome PLS to "normal", "eager", or "none".
115
118
  use_wire=None, # Use selenium-wire's webdriver over selenium webdriver.
116
119
  external_pdf=None, # Set Chrome "plugins.always_open_pdf_externally":True.
120
+ window_position=None, # Set the browser's starting window position: "X,Y"
121
+ window_size=None, # Set the browser's starting window size: "Width,Height"
117
122
  is_mobile=None, # Use the mobile device emulator while running tests.
118
123
  mobile=None, # Shortcut / Duplicate of "is_mobile".
119
124
  d_width=None, # Set device width
120
125
  d_height=None, # Set device height
121
126
  d_p_r=None, # Set device pixel ratio
127
+ position=None, # Shortcut / Duplicate of "window_position".
128
+ size=None, # Shortcut / Duplicate of "window_size".
122
129
  uc=None, # Shortcut / Duplicate of "undetectable".
123
130
  undetected=None, # Shortcut / Duplicate of "undetectable".
124
131
  uc_cdp=None, # Shortcut / Duplicate of "uc_cdp_events".
125
132
  uc_sub=None, # Shortcut / Duplicate of "uc_subprocess".
133
+ locale=None, # Shortcut / Duplicate of "locale_code".
126
134
  log_cdp=None, # Shortcut / Duplicate of "log_cdp_events".
135
+ ad_block=None, # Shortcut / Duplicate of "ad_block_on".
136
+ server=None, # Shortcut / Duplicate of "servername".
137
+ guest=None, # Shortcut / Duplicate of "guest_mode".
127
138
  wire=None, # Shortcut / Duplicate of "use_wire".
128
139
  pls=None, # Shortcut / Duplicate of "page_load_strategy".
129
140
  ):
141
+ """
142
+ * SeleniumBase Driver as a Python Context Manager or a returnable object. *
143
+
144
+ Example 1: (context manager format)
145
+ -----------------------------------
146
+ .. code-block:: python
147
+ from seleniumbase import DriverContext
148
+
149
+ with DriverContext() as driver:
150
+ driver.get("https://google.com/ncr")
151
+
152
+ Example 2: (as a Python returnable)
153
+ -----------------------------------
154
+ .. code-block:: python
155
+ from seleniumbase import Driver
156
+
157
+ driver = Driver()
158
+ driver.get("https://google.com/ncr")
159
+
160
+ Optional Parameters:
161
+ --------------------
162
+ browser (str): Choose from "chrome", "edge", "firefox", or "safari".
163
+ headless (bool): Use the default headless mode for Chromium and Firefox.
164
+ headless1 (bool): Use Chromium's old headless mode. (Fast, but limited)
165
+ headless2 (bool): Use Chromium's new headless mode. (Has more features)
166
+ headed (bool): Run tests in headed/GUI mode on Linux, where not default.
167
+ locale_code (str): Set the Language Locale Code for the web browser.
168
+ protocol (str): The Selenium Grid protocol: "http" or "https".
169
+ servername (str): The Selenium Grid server/IP used for tests.
170
+ port (int): The Selenium Grid port used by the test server.
171
+ proxy (str): Use proxy. Format: "SERVER:PORT" or "USER:PASS@SERVER:PORT".
172
+ proxy_bypass_list (str): Skip proxy when using the listed domains.
173
+ proxy_pac_url (str): Use PAC file. (Format: URL or USERNAME:PASSWORD@URL)
174
+ multi_proxy (bool): Allow multiple proxies with auth when multi-threaded.
175
+ agent (str): Modify the web browser's User-Agent string.
176
+ cap_file (str): The desired capabilities to use with a Selenium Grid.
177
+ cap_string (str): The desired capabilities to use with a Selenium Grid.
178
+ recorder_ext (bool): Enables the SeleniumBase Recorder Chromium extension.
179
+ disable_cookies (bool): Disable Cookies on websites. (Pages might break!)
180
+ disable_js (bool): Disable JavaScript on websites. (Pages might break!)
181
+ disable_csp (bool): Disable the Content Security Policy of websites.
182
+ enable_ws (bool): Enable Web Security on Chromium-based browsers.
183
+ disable_ws (bool): Reverse of "enable_ws". (None and False are different)
184
+ enable_sync (bool): Enable "Chrome Sync" on websites.
185
+ use_auto_ext (bool): Use Chrome's automation extension.
186
+ undetectable (bool): Use undetected-chromedriver to evade bot-detection.
187
+ uc_cdp_events (bool): Capture CDP events in undetected-chromedriver mode.
188
+ uc_subprocess (bool): Use undetected-chromedriver as a subprocess.
189
+ log_cdp_events (bool): Capture {"performance": "ALL", "browser": "ALL"}
190
+ no_sandbox (bool): (DEPRECATED) - "--no-sandbox" is always used now.
191
+ disable_gpu (bool): (DEPRECATED) - GPU is disabled if not "swiftshader".
192
+ incognito (bool): Enable Chromium's Incognito mode.
193
+ guest_mode (bool): Enable Chromium's Guest mode.
194
+ dark_mode (bool): Enable Chromium's Dark mode.
195
+ devtools (bool): Open Chromium's DevTools when the browser opens.
196
+ remote_debug (bool): Enable Chrome's Debugger on "http://localhost:9222".
197
+ enable_3d_apis (bool): Enable WebGL and 3D APIs.
198
+ swiftshader (bool): Chrome: --use-gl=angle / --use-angle=swiftshader-webgl
199
+ ad_block_on (bool): Block some types of display ads from loading.
200
+ host_resolver_rules (str): Set host-resolver-rules, comma-separated.
201
+ block_images (bool): Block images from loading during tests.
202
+ do_not_track (bool): Tell websites that you don't want to be tracked.
203
+ chromium_arg (str): "ARG=N,ARG2" (Set Chromium args, ","-separated.)
204
+ firefox_arg (str): "ARG=N,ARG2" (Set Firefox args, comma-separated.)
205
+ firefox_pref (str): SET (Set Firefox PREFERENCE:VALUE set, ","-separated)
206
+ user_data_dir (str): Set the Chrome user data directory to use.
207
+ extension_zip (str): Load a Chrome Extension .zip|.crx, comma-separated.
208
+ extension_dir (str): Load a Chrome Extension directory, comma-separated.
209
+ disable_features (str): "F1,F2" (Disable Chrome features, ","-separated.)
210
+ binary_location (str): Set path of the Chromium browser binary to use.
211
+ driver_version (str): Set the chromedriver or uc_driver version to use.
212
+ page_load_strategy (str): Set Chrome PLS to "normal", "eager", or "none".
213
+ use_wire (bool): Use selenium-wire's webdriver over selenium webdriver.
214
+ external_pdf (bool): Set Chrome "plugins.always_open_pdf_externally":True
215
+ window_position (x,y): Set the browser's starting window position: "X,Y"
216
+ window_size (w,h): Set the browser's starting window size: "Width,Height"
217
+ is_mobile (bool): Use the mobile device emulator while running tests.
218
+ mobile (bool): Shortcut / Duplicate of "is_mobile".
219
+ d_width (int): Set device width
220
+ d_height (int): Set device height
221
+ d_p_r (float): Set device pixel ratio
222
+ position (x,y): Shortcut / Duplicate of "window_position".
223
+ size (w,h): Shortcut / Duplicate of "window_size".
224
+ uc (bool): Shortcut / Duplicate of "undetectable".
225
+ undetected (bool): Shortcut / Duplicate of "undetectable".
226
+ uc_cdp (bool): Shortcut / Duplicate of "uc_cdp_events".
227
+ uc_sub (bool): Shortcut / Duplicate of "uc_subprocess".
228
+ locale (str): Shortcut / Duplicate of "locale_code".
229
+ log_cdp (bool): Shortcut / Duplicate of "log_cdp_events".
230
+ ad_block (bool): Shortcut / Duplicate of "ad_block_on".
231
+ server (str): Shortcut / Duplicate of "servername".
232
+ guest (bool): Shortcut / Duplicate of "guest_mode".
233
+ wire (bool): Shortcut / Duplicate of "use_wire".
234
+ pls (str): Shortcut / Duplicate of "page_load_strategy".
235
+ """
130
236
  from seleniumbase import config as sb_config
237
+ from seleniumbase.config import settings
238
+ from seleniumbase.core import browser_launcher
131
239
  from seleniumbase.fixtures import constants
132
240
  from seleniumbase.fixtures import shared_utils
133
241
 
@@ -239,6 +347,13 @@ def Driver(
239
347
  headless = True
240
348
  else:
241
349
  headless = False
350
+ if headless1 is None:
351
+ if "--headless1" in sys_argv:
352
+ headless1 = True
353
+ else:
354
+ headless1 = False
355
+ if headless1:
356
+ headless = True
242
357
  if headless2 is None:
243
358
  if "--headless2" in sys_argv:
244
359
  headless2 = True
@@ -246,6 +361,8 @@ def Driver(
246
361
  headless2 = False
247
362
  if protocol is None:
248
363
  protocol = "http" # For the Selenium Grid only!
364
+ if server is not None and servername is None:
365
+ servername = server
249
366
  if servername is None:
250
367
  servername = "localhost" # For the Selenium Grid only!
251
368
  use_grid = False
@@ -259,6 +376,8 @@ def Driver(
259
376
  incognito = True
260
377
  else:
261
378
  incognito = False
379
+ if guest is not None and guest_mode is None:
380
+ guest_mode = guest
262
381
  if guest_mode is None:
263
382
  if "--guest" in sys_argv:
264
383
  guest_mode = True
@@ -295,28 +414,121 @@ def Driver(
295
414
  proxy_string = proxy_string[1:-1]
296
415
  c_a = chromium_arg
297
416
  if c_a is None and "--chromium-arg" in arg_join:
298
- if "--chromium-arg=" in arg_join:
299
- c_a = arg_join.split("--chromium-arg=")[1].split(" ")[0]
300
- elif "--chromium-arg " in arg_join:
301
- c_a = arg_join.split("--chromium-arg ")[1].split(" ")[0]
302
- if c_a:
303
- if c_a.startswith('"') and c_a.endswith('"'):
304
- c_a = c_a[1:-1]
305
- elif c_a.startswith("'") and c_a.endswith("'"):
306
- c_a = c_a[1:-1]
417
+ count = 0
418
+ for arg in sys_argv:
419
+ if arg.startswith("--chromium-arg="):
420
+ c_a = arg.split("--chromium-arg=")[1]
421
+ break
422
+ elif arg == "--chromium-arg" and len(sys_argv) > count + 1:
423
+ c_a = sys_argv[count + 1]
424
+ if c_a.startswith("-"):
425
+ c_a = None
426
+ break
427
+ count += 1
307
428
  chromium_arg = c_a
308
429
  d_f = disable_features
309
430
  if d_f is None and "--disable-features" in arg_join:
310
- if "--disable-features=" in arg_join:
311
- d_f = arg_join.split("--disable-features=")[1].split(" ")[0]
312
- elif "--disable-features " in arg_join:
313
- d_f = arg_join.split("--disable-features ")[1].split(" ")[0]
314
- if d_f:
315
- if d_f.startswith('"') and d_f.endswith('"'):
316
- d_f = d_f[1:-1]
317
- elif c_a.startswith("'") and d_f.endswith("'"):
318
- d_f = d_f[1:-1]
431
+ count = 0
432
+ for arg in sys_argv:
433
+ if arg.startswith("--disable-features="):
434
+ d_f = arg.split("--disable-features=")[1]
435
+ break
436
+ elif arg == "--disable-features" and len(sys_argv) > count + 1:
437
+ d_f = sys_argv[count + 1]
438
+ if d_f.startswith("-"):
439
+ d_f = None
440
+ break
441
+ count += 1
319
442
  disable_features = d_f
443
+ if window_position is None and position is not None:
444
+ window_position = position
445
+ w_p = window_position
446
+ if w_p is None and "--window-position" in arg_join:
447
+ count = 0
448
+ for arg in sys_argv:
449
+ if arg.startswith("--window-position="):
450
+ w_p = arg.split("--window-position=")[1]
451
+ break
452
+ elif arg == "--window-position" and len(sys_argv) > count + 1:
453
+ w_p = sys_argv[count + 1]
454
+ if w_p.startswith("-"):
455
+ w_p = None
456
+ break
457
+ count += 1
458
+ window_position = w_p
459
+ if window_position:
460
+ if window_position.count(",") != 1:
461
+ message = (
462
+ '\n\n window_position expects an "x,y" string!'
463
+ '\n (Your input was: "%s")\n' % window_position
464
+ )
465
+ raise Exception(message)
466
+ window_position = window_position.replace(" ", "")
467
+ win_x = None
468
+ win_y = None
469
+ try:
470
+ win_x = int(window_position.split(",")[0])
471
+ win_y = int(window_position.split(",")[1])
472
+ except Exception:
473
+ message = (
474
+ '\n\n Expecting integer values for "x,y"!'
475
+ '\n (window_position input was: "%s")\n'
476
+ % window_position
477
+ )
478
+ raise Exception(message)
479
+ settings.WINDOW_START_X = win_x
480
+ settings.WINDOW_START_Y = win_y
481
+ if window_size is None and size is not None:
482
+ window_size = size
483
+ w_s = window_size
484
+ if w_s is None and "--window-size" in arg_join:
485
+ count = 0
486
+ for arg in sys_argv:
487
+ if arg.startswith("--window-size="):
488
+ w_s = arg.split("--window-size=")[1]
489
+ break
490
+ elif arg == "--window-size" and len(sys_argv) > count + 1:
491
+ w_s = sys_argv[count + 1]
492
+ if w_s.startswith("-"):
493
+ w_s = None
494
+ break
495
+ count += 1
496
+ window_size = w_s
497
+ if window_size:
498
+ if window_size.count(",") != 1:
499
+ message = (
500
+ '\n\n window_size expects a "width,height" string!'
501
+ '\n (Your input was: "%s")\n' % window_size
502
+ )
503
+ raise Exception(message)
504
+ window_size = window_size.replace(" ", "")
505
+ width = None
506
+ height = None
507
+ try:
508
+ width = int(window_size.split(",")[0])
509
+ height = int(window_size.split(",")[1])
510
+ except Exception:
511
+ message = (
512
+ '\n\n Expecting integer values for "width,height"!'
513
+ '\n (window_size input was: "%s")\n' % window_size
514
+ )
515
+ raise Exception(message)
516
+ settings.CHROME_START_WIDTH = width
517
+ settings.CHROME_START_HEIGHT = height
518
+ settings.HEADLESS_START_WIDTH = width
519
+ settings.HEADLESS_START_HEIGHT = height
520
+ if agent is None and "--agent" in arg_join:
521
+ count = 0
522
+ for arg in sys_argv:
523
+ if arg.startswith("--agent="):
524
+ agent = arg.split("--agent=")[1]
525
+ break
526
+ elif arg == "--agent" and len(sys_argv) > count + 1:
527
+ agent = sys_argv[count + 1]
528
+ if agent.startswith("-"):
529
+ agent = None
530
+ break
531
+ count += 1
320
532
  user_agent = agent
321
533
  recorder_mode = False
322
534
  if recorder_ext:
@@ -328,31 +540,6 @@ def Driver(
328
540
  ):
329
541
  recorder_mode = True
330
542
  recorder_ext = True
331
- if (
332
- shared_utils.is_linux()
333
- and not headed
334
- and not headless
335
- and not headless2
336
- ):
337
- headless = True
338
- if recorder_mode and headless:
339
- headless = False
340
- headless2 = True
341
- if headless2 and browser == "firefox":
342
- headless2 = False # Only for Chromium browsers
343
- headless = True # Firefox has regular headless
344
- elif browser not in ["chrome", "edge"]:
345
- headless2 = False # Only for Chromium browsers
346
- if disable_csp is None:
347
- disable_csp = False
348
- if (
349
- (enable_ws is None and disable_ws is None)
350
- or (disable_ws is not None and not disable_ws)
351
- or (enable_ws is not None and enable_ws)
352
- ):
353
- enable_ws = True
354
- else:
355
- enable_ws = False
356
543
  if (
357
544
  undetectable
358
545
  or undetected
@@ -363,11 +550,7 @@ def Driver(
363
550
  or uc_sub
364
551
  ):
365
552
  undetectable = True
366
- if (
367
- (undetectable or undetected or uc)
368
- and (uc_subprocess is None)
369
- and (uc_sub is None)
370
- ):
553
+ if undetectable or undetected or uc:
371
554
  uc_subprocess = True # Use UC as a subprocess by default.
372
555
  elif (
373
556
  "--undetectable" in sys_argv
@@ -408,6 +591,67 @@ def Driver(
408
591
  uc_cdp_events = True
409
592
  else:
410
593
  uc_cdp_events = False
594
+ if undetectable and browser != "chrome":
595
+ message = (
596
+ '\n Undetected-Chromedriver Mode ONLY supports Chrome!'
597
+ '\n ("uc=True" / "undetectable=True" / "--uc")'
598
+ '\n (Your browser choice was: "%s".)'
599
+ '\n (Will use "%s" without UC Mode.)\n' % (browser, browser)
600
+ )
601
+ print(message)
602
+ if headed is None:
603
+ # Override the default headless mode on Linux if set.
604
+ if "--gui" in sys_argv or "--headed" in sys_argv:
605
+ headed = True
606
+ else:
607
+ headed = False
608
+ if (
609
+ shared_utils.is_linux()
610
+ and not headed
611
+ and not headless
612
+ and not headless2
613
+ and (
614
+ not undetectable
615
+ or "DISPLAY" not in os.environ.keys()
616
+ or not os.environ["DISPLAY"]
617
+ )
618
+ ):
619
+ headless = True
620
+ if recorder_mode and headless:
621
+ headless = False
622
+ headless1 = False
623
+ headless2 = True
624
+ if headless2 and browser == "firefox":
625
+ headless2 = False # Only for Chromium browsers
626
+ headless = True # Firefox has regular headless
627
+ elif browser not in ["chrome", "edge"]:
628
+ headless2 = False # Only for Chromium browsers
629
+ if disable_csp is None:
630
+ if (
631
+ "--disable-csp" in sys_argv
632
+ or "--no-csp" in sys_argv
633
+ or "--dcsp" in sys_argv
634
+ ):
635
+ disable_csp = True
636
+ else:
637
+ disable_csp = False
638
+ if (
639
+ (enable_ws is None and disable_ws is None)
640
+ and (
641
+ "--disable-web-security" in sys_argv
642
+ or "--disable-ws" in sys_argv
643
+ or "--dws" in sys_argv
644
+ )
645
+ ):
646
+ enable_ws = False
647
+ elif (
648
+ (enable_ws is None and disable_ws is None)
649
+ or (disable_ws is not None and not disable_ws)
650
+ or (enable_ws is not None and enable_ws)
651
+ ):
652
+ enable_ws = True
653
+ else:
654
+ enable_ws = False
411
655
  if log_cdp_events is None and log_cdp is None:
412
656
  if (
413
657
  "--log-cdp-events" in sys_argv
@@ -427,6 +671,11 @@ def Driver(
427
671
  use_auto_ext = True
428
672
  else:
429
673
  use_auto_ext = False
674
+ if disable_cookies is None:
675
+ if "--disable-cookies" in sys_argv:
676
+ disable_cookies = True
677
+ else:
678
+ disable_cookies = False
430
679
  if disable_js is None:
431
680
  if "--disable-js" in sys_argv:
432
681
  disable_js = True
@@ -434,6 +683,13 @@ def Driver(
434
683
  disable_js = False
435
684
  if pls is not None and page_load_strategy is None:
436
685
  page_load_strategy = pls
686
+ if not page_load_strategy and "--pls=" in arg_join:
687
+ if "--pls=none" in sys_argv or '--pls="none"' in sys_argv:
688
+ page_load_strategy = "none"
689
+ elif "--pls=eager" in sys_argv or '--pls="eager"' in sys_argv:
690
+ page_load_strategy = "eager"
691
+ elif "--pls=normal" in sys_argv or '--pls="normal"' in sys_argv:
692
+ page_load_strategy = "normal"
437
693
  if page_load_strategy is not None:
438
694
  if page_load_strategy.lower() not in ["normal", "eager", "none"]:
439
695
  raise Exception(
@@ -485,6 +741,10 @@ def Driver(
485
741
  swiftshader = True
486
742
  else:
487
743
  swiftshader = False
744
+ if locale is not None and locale_code is None:
745
+ locale_code = locale
746
+ if ad_block is not None and ad_block_on is None:
747
+ ad_block_on = ad_block
488
748
  if ad_block_on is None:
489
749
  if "--ad-block" in sys_argv or "--ad_block" in sys_argv:
490
750
  ad_block_on = True
@@ -499,20 +759,33 @@ def Driver(
499
759
  host_resolver_rules = (
500
760
  arg_join.split("--host_resolver_rules=")[1].split('"')[0]
501
761
  )
502
- if driver_version is None:
503
- if "--driver-version=" in arg_join:
504
- driver_version = (
505
- arg_join.split("--driver-version=")[1].split(" ")[0]
506
- )
507
- elif "--driver_version=" in arg_join:
508
- driver_version = (
509
- arg_join.split("--driver_version=")[1].split(" ")[0]
510
- )
762
+ if driver_version is None and "--driver-version" in arg_join:
763
+ count = 0
764
+ for arg in sys_argv:
765
+ if arg.startswith("--driver-version="):
766
+ driver_version = arg.split("--driver-version=")[1]
767
+ break
768
+ elif arg == "--driver-version" and len(sys_argv) > count + 1:
769
+ driver_version = sys_argv[count + 1]
770
+ if driver_version.startswith("-"):
771
+ driver_version = None
772
+ break
773
+ count += 1
774
+ if driver_version is None and "--driver_version" in arg_join:
775
+ count = 0
776
+ for arg in sys_argv:
777
+ if arg.startswith("--driver_version="):
778
+ driver_version = arg.split("--driver_version=")[1]
779
+ break
780
+ elif arg == "--driver_version" and len(sys_argv) > count + 1:
781
+ driver_version = sys_argv[count + 1]
782
+ if driver_version.startswith("-"):
783
+ driver_version = None
784
+ break
785
+ count += 1
511
786
  browser_name = browser
512
787
 
513
788
  # Launch a web browser
514
- from seleniumbase.core import browser_launcher
515
-
516
789
  driver = browser_launcher.get_driver(
517
790
  browser_name=browser_name,
518
791
  headless=headless,
@@ -529,6 +802,7 @@ def Driver(
529
802
  cap_file=cap_file,
530
803
  cap_string=cap_string,
531
804
  recorder_ext=recorder_ext,
805
+ disable_cookies=disable_cookies,
532
806
  disable_js=disable_js,
533
807
  disable_csp=disable_csp,
534
808
  enable_ws=enable_ws,
@@ -540,6 +814,7 @@ def Driver(
540
814
  log_cdp_events=log_cdp_events,
541
815
  no_sandbox=no_sandbox,
542
816
  disable_gpu=disable_gpu,
817
+ headless1=headless1,
543
818
  headless2=headless2,
544
819
  incognito=incognito,
545
820
  guest_mode=guest_mode,