seleniumbase 4.33.4__py3-none-any.whl → 4.34.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. seleniumbase/__version__.py +1 -1
  2. seleniumbase/behave/behave_sb.py +10 -2
  3. seleniumbase/console_scripts/run.py +6 -2
  4. seleniumbase/console_scripts/sb_commander.py +5 -5
  5. seleniumbase/console_scripts/sb_install.py +235 -6
  6. seleniumbase/console_scripts/sb_mkdir.py +1 -0
  7. seleniumbase/core/browser_launcher.py +358 -105
  8. seleniumbase/core/log_helper.py +33 -12
  9. seleniumbase/core/proxy_helper.py +35 -30
  10. seleniumbase/core/sb_cdp.py +277 -74
  11. seleniumbase/core/settings_parser.py +2 -0
  12. seleniumbase/core/style_sheet.py +10 -0
  13. seleniumbase/fixtures/base_case.py +216 -127
  14. seleniumbase/fixtures/constants.py +3 -0
  15. seleniumbase/fixtures/js_utils.py +2 -0
  16. seleniumbase/fixtures/page_actions.py +7 -2
  17. seleniumbase/fixtures/shared_utils.py +25 -0
  18. seleniumbase/plugins/driver_manager.py +28 -0
  19. seleniumbase/plugins/pytest_plugin.py +110 -0
  20. seleniumbase/plugins/sb_manager.py +41 -0
  21. seleniumbase/plugins/selenium_plugin.py +9 -0
  22. seleniumbase/undetected/cdp_driver/_contradict.py +3 -3
  23. seleniumbase/undetected/cdp_driver/browser.py +8 -6
  24. seleniumbase/undetected/cdp_driver/cdp_util.py +3 -0
  25. seleniumbase/undetected/cdp_driver/config.py +0 -1
  26. seleniumbase/undetected/cdp_driver/element.py +22 -20
  27. seleniumbase/undetected/patcher.py +20 -5
  28. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/LICENSE +1 -1
  29. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/METADATA +111 -86
  30. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/RECORD +33 -33
  31. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/WHEEL +1 -1
  32. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/entry_points.txt +0 -0
  33. {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/top_level.txt +0 -0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.33.4"
2
+ __version__ = "4.34.2"
@@ -482,8 +482,8 @@ def get_configured_sb(context):
482
482
  extension_dir = sb.extension_dir # revert to default
483
483
  sb.extension_dir = extension_dir
484
484
  continue
485
- # Handle: -D binary-location=PATH / binary_location=PATH
486
- if low_key in ["binary-location", "binary_location"]:
485
+ # Handle: -D binary-location=PATH / binary_location=PATH / bl=PATH
486
+ if low_key in ["binary-location", "binary_location", "bl"]:
487
487
  binary_location = userdata[key]
488
488
  if binary_location == "true":
489
489
  binary_location = sb.binary_location # revert to default
@@ -884,6 +884,14 @@ def get_configured_sb(context):
884
884
  sb.headless = True # Firefox has regular headless
885
885
  elif sb.browser not in ["chrome", "edge"]:
886
886
  sb.headless2 = False # Only for Chromium browsers
887
+ if (
888
+ sb.binary_location
889
+ and sb.binary_location.lower() == "chs"
890
+ and sb.browser == "chrome"
891
+ ):
892
+ sb.headless = True
893
+ sb.headless1 = False
894
+ sb.headless2 = False
887
895
  # Recorder Mode only supports Chromium browsers.
888
896
  if sb.recorder_ext and (sb.browser not in ["chrome", "edge"]):
889
897
  raise Exception(
@@ -139,8 +139,8 @@ def show_install_usage():
139
139
  print(" OR: seleniumbase get [DRIVER_NAME] [OPTIONS]")
140
140
  print(" OR: sbase install [DRIVER_NAME] [OPTIONS]")
141
141
  print(" OR: sbase get [DRIVER_NAME] [OPTIONS]")
142
- print(" (Drivers: chromedriver, geckodriver,")
143
- print(" edgedriver, iedriver, uc_driver)")
142
+ print(" (Drivers: chromedriver, cft, uc_driver,")
143
+ print(" edgedriver, chs, geckodriver)")
144
144
  print(" Options:")
145
145
  print(" VERSION Specify the version to download.")
146
146
  print(" Tries to detect the needed version.")
@@ -157,11 +157,15 @@ def show_install_usage():
157
157
  print(" sbase get chromedriver stable")
158
158
  print(" sbase get chromedriver beta")
159
159
  print(" sbase get chromedriver -p")
160
+ print(" sbase get cft 131")
161
+ print(" sbase get chs")
160
162
  print(" Output:")
161
163
  print(" Downloads the webdriver to seleniumbase/drivers/")
162
164
  print(" (chromedriver is required for Chrome automation)")
163
165
  print(" (geckodriver is required for Firefox automation)")
164
166
  print(" (edgedriver is required for MS__Edge automation)")
167
+ print(" (cft is for the `Chrome for Testing` binary exe)")
168
+ print(" (chs is for the `Chrome-Headless-Shell` binary.)")
165
169
  print("")
166
170
 
167
171
 
@@ -156,9 +156,9 @@ def do_pytest_run(
156
156
  if save_screenshots:
157
157
  full_run_command += " --screenshot"
158
158
 
159
- dash_s_needed = False
160
- if "-s" not in additional_options.split(" "):
161
- dash_s_needed = True
159
+ capture_needed = False
160
+ if "--capture" not in additional_options:
161
+ capture_needed = True
162
162
 
163
163
  additional_options = additional_options.strip()
164
164
  if additional_options:
@@ -168,8 +168,8 @@ def do_pytest_run(
168
168
  if verbose:
169
169
  full_run_command += " -v"
170
170
 
171
- if dash_s_needed:
172
- full_run_command += " -s"
171
+ if capture_needed:
172
+ full_run_command += " --capture=tee-sys"
173
173
 
174
174
  print(full_run_command)
175
175
  subprocess.Popen(full_run_command, shell=True)
@@ -3,7 +3,7 @@ Downloads the specified webdriver to "seleniumbase/drivers/"
3
3
 
4
4
  Usage:
5
5
  sbase get {chromedriver|geckodriver|edgedriver|
6
- iedriver|uc_driver} [OPTIONS]
6
+ iedriver|uc_driver|cft|chs} [OPTIONS]
7
7
  Options:
8
8
  VERSION Specify the version.
9
9
  Tries to detect the needed version.
@@ -19,6 +19,8 @@ Examples:
19
19
  sbase get chromedriver stable
20
20
  sbase get chromedriver beta
21
21
  sbase get chromedriver -p
22
+ sbase get cft 131
23
+ sbase get chs
22
24
  Output:
23
25
  Downloads the webdriver to seleniumbase/drivers/
24
26
  (chromedriver is required for Chrome automation)
@@ -31,6 +33,7 @@ import os
31
33
  import platform
32
34
  import requests
33
35
  import shutil
36
+ import subprocess
34
37
  import sys
35
38
  import time
36
39
  import tarfile
@@ -61,8 +64,8 @@ def invalid_run_command():
61
64
  exp += " OR sbase install [DRIVER_NAME] [OPTIONS]\n"
62
65
  exp += " OR seleniumbase get [DRIVER_NAME] [OPTIONS]\n"
63
66
  exp += " OR sbase get [DRIVER_NAME] [OPTIONS]\n"
64
- exp += " (Drivers: chromedriver, geckodriver,\n"
65
- exp += " edgedriver, iedriver, uc_driver)\n"
67
+ exp += " (Drivers: chromedriver, cft, uc_driver,\n"
68
+ exp += " edgedriver, chs, geckodriver)\n"
66
69
  exp += " Options:\n"
67
70
  exp += " VERSION Specify the version.\n"
68
71
  exp += " Tries to detect the needed version.\n"
@@ -79,11 +82,15 @@ def invalid_run_command():
79
82
  exp += " sbase get chromedriver stable\n"
80
83
  exp += " sbase get chromedriver beta\n"
81
84
  exp += " sbase get chromedriver -p\n"
85
+ exp += " sbase get cft 131\n"
86
+ exp += " sbase get chs\n"
82
87
  exp += " Output:\n"
83
88
  exp += " Downloads the webdriver to seleniumbase/drivers/\n"
84
89
  exp += " (chromedriver is required for Chrome automation)\n"
85
90
  exp += " (geckodriver is required for Firefox automation)\n"
86
91
  exp += " (edgedriver is required for MS__Edge automation)\n"
92
+ exp += " (cft is for the `Chrome for Testing` binary exe)\n"
93
+ exp += " (chs is for the `Chrome-Headless-Shell` binary.)\n"
87
94
  print("")
88
95
  raise Exception("%s\n\n%s" % (constants.Warnings.INVALID_RUN_COMMAND, exp))
89
96
 
@@ -265,6 +272,16 @@ def main(override=None, intel_for_uc=None, force_uc=None):
265
272
  elif override.startswith("iedriver "):
266
273
  extra = override.split("iedriver ")[1]
267
274
  sys.argv = ["seleniumbase", "get", "iedriver", extra]
275
+ elif override == "cft":
276
+ sys.argv = ["seleniumbase", "get", "cft"]
277
+ elif override.startswith("cft "):
278
+ extra = override.split("cft ")[1]
279
+ sys.argv = ["seleniumbase", "get", "cft", extra]
280
+ elif override == "chs":
281
+ sys.argv = ["seleniumbase", "get", "chs"]
282
+ elif override.startswith("chs "):
283
+ extra = override.split("chs ")[1]
284
+ sys.argv = ["seleniumbase", "get", "chs", extra]
268
285
  if found_proxy:
269
286
  sys.argv.append(found_proxy)
270
287
 
@@ -550,6 +567,134 @@ def main(override=None, intel_for_uc=None, force_uc=None):
550
567
  raise Exception("Could not find chromedriver to download!\n")
551
568
  if not get_latest:
552
569
  pass
570
+ elif name == "chrome" or name == "cft":
571
+ set_version = None
572
+ found_version = None
573
+ use_version = None
574
+ major_version = None
575
+ if num_args >= 4:
576
+ set_version = sys.argv[3]
577
+ if (
578
+ set_version
579
+ and set_version.split(".")[0].isnumeric()
580
+ and int(set_version.split(".")[0]) >= 113
581
+ ):
582
+ major_version = set_version.split(".")[0]
583
+ elif (
584
+ not set_version
585
+ or set_version.lower() == "latest"
586
+ or set_version.lower() == "stable"
587
+ ):
588
+ found_version = get_latest_stable_chromedriver_version()
589
+ elif (
590
+ set_version and (
591
+ set_version.lower() == "latest-1"
592
+ or set_version.lower() == "previous"
593
+ )
594
+ ):
595
+ found_version = get_latest_stable_chromedriver_version()
596
+ major_version = str(int(found_version.split(".")[0]) - 1)
597
+ found_version = None
598
+ elif (set_version and set_version.lower() == "beta"):
599
+ found_version = get_latest_beta_chromedriver_version()
600
+ elif (set_version and set_version.lower() == "dev"):
601
+ found_version = get_latest_dev_chromedriver_version()
602
+ elif (set_version and set_version.lower() == "canary"):
603
+ found_version = get_latest_canary_chromedriver_version()
604
+ if found_version and found_version.split(".")[0].isnumeric():
605
+ major_version = found_version.split(".")[0]
606
+ use_version = found_version
607
+ if not use_version:
608
+ use_version = get_cft_latest_version_from_milestone(major_version)
609
+ msg = c2 + "Chrome for Testing to download" + cr
610
+ p_version = c3 + use_version + cr
611
+ log_d("\n*** %s = %s" % (msg, p_version))
612
+ if IS_MAC:
613
+ if IS_ARM_MAC:
614
+ platform_code = "mac-arm64"
615
+ file_name = "chrome-mac-arm64.zip"
616
+ else:
617
+ platform_code = "mac-x64"
618
+ file_name = "chrome-mac-x64.zip"
619
+ elif IS_LINUX:
620
+ platform_code = "linux64"
621
+ file_name = "chrome-linux64.zip"
622
+ elif IS_WINDOWS:
623
+ if "64" in ARCH:
624
+ platform_code = "win64"
625
+ file_name = "chrome-win64.zip"
626
+ else:
627
+ platform_code = "win32"
628
+ file_name = "chrome-win32.zip"
629
+ plat_arch = file_name.split(".zip")[0]
630
+ download_url = (
631
+ "https://storage.googleapis.com/chrome-for-testing-public/"
632
+ "%s/%s/%s" % (use_version, platform_code, file_name)
633
+ )
634
+ elif name == "chrome-headless-shell" or name == "chs":
635
+ set_version = None
636
+ found_version = None
637
+ use_version = None
638
+ major_version = None
639
+ if num_args >= 4:
640
+ set_version = sys.argv[3]
641
+ if (
642
+ set_version
643
+ and set_version.split(".")[0].isnumeric()
644
+ and int(set_version.split(".")[0]) >= 113
645
+ ):
646
+ major_version = set_version.split(".")[0]
647
+ elif (
648
+ not set_version
649
+ or set_version.lower() == "latest"
650
+ or set_version.lower() == "stable"
651
+ ):
652
+ found_version = get_latest_stable_chromedriver_version()
653
+ elif (
654
+ set_version and (
655
+ set_version.lower() == "latest-1"
656
+ or set_version.lower() == "previous"
657
+ )
658
+ ):
659
+ found_version = get_latest_stable_chromedriver_version()
660
+ major_version = str(int(found_version.split(".")[0]) - 1)
661
+ found_version = None
662
+ elif (set_version and set_version.lower() == "beta"):
663
+ found_version = get_latest_beta_chromedriver_version()
664
+ elif (set_version and set_version.lower() == "dev"):
665
+ found_version = get_latest_dev_chromedriver_version()
666
+ elif (set_version and set_version.lower() == "canary"):
667
+ found_version = get_latest_canary_chromedriver_version()
668
+ if found_version and found_version.split(".")[0].isnumeric():
669
+ major_version = found_version.split(".")[0]
670
+ use_version = found_version
671
+ if not use_version:
672
+ use_version = get_cft_latest_version_from_milestone(major_version)
673
+ msg = c2 + "Chrome-Headless-Shell to download" + cr
674
+ p_version = c3 + use_version + cr
675
+ log_d("\n*** %s = %s" % (msg, p_version))
676
+ if IS_MAC:
677
+ if IS_ARM_MAC:
678
+ platform_code = "mac-arm64"
679
+ file_name = "chrome-headless-shell-mac-arm64.zip"
680
+ else:
681
+ platform_code = "mac-x64"
682
+ file_name = "chrome-headless-shell-mac-x64.zip"
683
+ elif IS_LINUX:
684
+ platform_code = "linux64"
685
+ file_name = "chrome-headless-shell-linux64.zip"
686
+ elif IS_WINDOWS:
687
+ if "64" in ARCH:
688
+ platform_code = "win64"
689
+ file_name = "chrome-headless-shell-win64.zip"
690
+ else:
691
+ platform_code = "win32"
692
+ file_name = "chrome-headless-shell-win32.zip"
693
+ plat_arch = file_name.split(".zip")[0]
694
+ download_url = (
695
+ "https://storage.googleapis.com/chrome-for-testing-public/"
696
+ "%s/%s/%s" % (use_version, platform_code, file_name)
697
+ )
553
698
  elif name == "geckodriver" or name == "firefoxdriver":
554
699
  use_version = DEFAULT_GECKODRIVER_VERSION
555
700
  found_geckodriver = False
@@ -1029,10 +1174,14 @@ def main(override=None, intel_for_uc=None, force_uc=None):
1029
1174
  if os.path.exists(os.path.join(downloads_folder, "Driver_Notes/")):
1030
1175
  # Only works if the directory is empty
1031
1176
  os.rmdir(os.path.join(downloads_folder, "Driver_Notes/"))
1032
- pr_driver_path = c3 + driver_path + cr
1177
+ driver_base = os.sep.join(driver_path.split(os.sep)[:-1])
1178
+ driver_file = driver_path.split(os.sep)[-1]
1179
+ pr_driver_base = c3 + driver_base + cr
1180
+ pr_sep = c3 + os.sep + cr
1181
+ pr_driver_file = c3 + driver_file + cr
1033
1182
  log_d(
1034
- "The file [%s] was saved to:\n%s\n"
1035
- % (driver_file, pr_driver_path)
1183
+ "The file [%s] was saved to:\n%s%s\n%s\n"
1184
+ % (driver_file, pr_driver_base, pr_sep, pr_driver_file)
1036
1185
  )
1037
1186
  log_d("Making [%s %s] executable ..." % (driver_file, use_version))
1038
1187
  make_executable(driver_path)
@@ -1046,6 +1195,86 @@ def main(override=None, intel_for_uc=None, force_uc=None):
1046
1195
  make_executable(path_file)
1047
1196
  log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
1048
1197
  log_d("")
1198
+ elif name == "chrome" or name == "cft":
1199
+ # Zip file is valid. Proceed.
1200
+ driver_path = None
1201
+ driver_file = None
1202
+ base_path = os.sep.join(zip_file_path.split(os.sep)[:-1])
1203
+ folder_name = contents[0].split(os.sep)[0]
1204
+ folder_path = os.path.join(base_path, folder_name)
1205
+ if IS_MAC or IS_LINUX:
1206
+ if (
1207
+ "chrome-" in folder_path
1208
+ and "drivers" in folder_path
1209
+ and os.path.exists(folder_path)
1210
+ ):
1211
+ shutil.rmtree(folder_path)
1212
+ subprocess.run(
1213
+ ["unzip", zip_file_path, "-d", downloads_folder]
1214
+ )
1215
+ elif IS_WINDOWS:
1216
+ subprocess.run(
1217
+ [
1218
+ "powershell",
1219
+ "Expand-Archive",
1220
+ "-Path",
1221
+ zip_file_path,
1222
+ "-DestinationPath",
1223
+ downloads_folder,
1224
+ ]
1225
+ )
1226
+ else:
1227
+ zip_ref.extractall(downloads_folder)
1228
+ zip_ref.close()
1229
+ os.remove(zip_file_path)
1230
+ log_d("%sUnzip Complete!%s\n" % (c2, cr))
1231
+ pr_base_path = c3 + base_path + cr
1232
+ pr_sep = c3 + os.sep + cr
1233
+ pr_folder_name = c3 + folder_name + cr
1234
+ log_d(
1235
+ "Chrome for Testing was saved inside:\n%s%s\n%s\n"
1236
+ % (pr_base_path, pr_sep, pr_folder_name)
1237
+ )
1238
+ elif name == "chrome-headless-shell" or name == "chs":
1239
+ # Zip file is valid. Proceed.
1240
+ driver_path = None
1241
+ driver_file = None
1242
+ base_path = os.sep.join(zip_file_path.split(os.sep)[:-1])
1243
+ folder_name = contents[0].split(os.sep)[0]
1244
+ folder_path = os.path.join(base_path, folder_name)
1245
+ if IS_MAC or IS_LINUX:
1246
+ if (
1247
+ "chrome-headless-shell-" in folder_path
1248
+ and "drivers" in folder_path
1249
+ and os.path.exists(folder_path)
1250
+ ):
1251
+ shutil.rmtree(folder_path)
1252
+ subprocess.run(
1253
+ ["unzip", zip_file_path, "-d", downloads_folder]
1254
+ )
1255
+ elif IS_WINDOWS:
1256
+ subprocess.run(
1257
+ [
1258
+ "powershell",
1259
+ "Expand-Archive",
1260
+ "-Path",
1261
+ zip_file_path,
1262
+ "-DestinationPath",
1263
+ downloads_folder,
1264
+ ]
1265
+ )
1266
+ else:
1267
+ zip_ref.extractall(downloads_folder)
1268
+ zip_ref.close()
1269
+ os.remove(zip_file_path)
1270
+ log_d("%sUnzip Complete!%s\n" % (c2, cr))
1271
+ pr_base_path = c3 + base_path + cr
1272
+ pr_sep = c3 + os.sep + cr
1273
+ pr_folder_name = c3 + folder_name + cr
1274
+ log_d(
1275
+ "Chrome-Headless-Shell was saved inside:\n%s%s\n%s\n"
1276
+ % (pr_base_path, pr_sep, pr_folder_name)
1277
+ )
1049
1278
  elif len(contents) == 0:
1050
1279
  raise Exception("Zip file %s is empty!" % zip_file_path)
1051
1280
  else:
@@ -259,6 +259,7 @@ def main():
259
259
  data.append("report_archives")
260
260
  data.append("archived_reports")
261
261
  data.append("html_report.html")
262
+ data.append("last_report.html")
262
263
  data.append("report.html")
263
264
  data.append("report.xml")
264
265
  data.append("dashboard.html")