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

Sign up to get free protection for your applications and to get access to all the features.
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")