seleniumbase 4.34.1__py3-none-any.whl → 4.34.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.34.1"
2
+ __version__ = "4.34.3"
@@ -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
 
@@ -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:
@@ -1,6 +1,7 @@
1
1
  import fasteners
2
2
  import logging
3
3
  import os
4
+ import platform
4
5
  import re
5
6
  import shutil
6
7
  import subprocess
@@ -64,6 +65,7 @@ LOCAL_EDGEDRIVER = None
64
65
  LOCAL_IEDRIVER = None
65
66
  LOCAL_HEADLESS_IEDRIVER = None
66
67
  LOCAL_UC_DRIVER = None
68
+ ARCH = platform.architecture()[0]
67
69
  IS_ARM_MAC = shared_utils.is_arm_mac()
68
70
  IS_MAC = shared_utils.is_mac()
69
71
  IS_LINUX = shared_utils.is_linux()
@@ -2649,6 +2651,13 @@ def get_driver(
2649
2651
  if headless2 and browser_name == constants.Browser.FIREFOX:
2650
2652
  headless2 = False # Only for Chromium
2651
2653
  headless = True
2654
+ if (
2655
+ is_using_uc(undetectable, browser_name)
2656
+ and binary_location
2657
+ and isinstance(binary_location, str)
2658
+ and binary_location.lower() == "chs"
2659
+ ):
2660
+ raise Exception("UC Mode can't be used with Chrome-Headless-Shell!")
2652
2661
  if (
2653
2662
  binary_location
2654
2663
  and isinstance(binary_location, str)
@@ -2657,6 +2666,118 @@ def get_driver(
2657
2666
  or browser_name == constants.Browser.EDGE
2658
2667
  )
2659
2668
  ):
2669
+ if (
2670
+ binary_location.lower() == "cft"
2671
+ and browser_name == constants.Browser.GOOGLE_CHROME
2672
+ ):
2673
+ binary_folder = None
2674
+ if IS_MAC:
2675
+ if IS_ARM_MAC:
2676
+ binary_folder = "chrome-mac-arm64"
2677
+ else:
2678
+ binary_folder = "chrome-mac-x64"
2679
+ elif IS_LINUX:
2680
+ binary_folder = "chrome-linux64"
2681
+ elif IS_WINDOWS:
2682
+ if "64" in ARCH:
2683
+ binary_folder = "chrome-win64"
2684
+ else:
2685
+ binary_folder = "chrome-win32"
2686
+ if binary_folder:
2687
+ binary_location = os.path.join(DRIVER_DIR, binary_folder)
2688
+ if not os.path.exists(binary_location):
2689
+ from seleniumbase.console_scripts import sb_install
2690
+ args = " ".join(sys.argv)
2691
+ if not (
2692
+ "-n" in sys.argv or " -n=" in args or args == "-c"
2693
+ ):
2694
+ # (Not multithreaded)
2695
+ sys_args = sys.argv # Save a copy of current sys args
2696
+ log_d(
2697
+ "\nWarning: Chrome for Testing binary not found..."
2698
+ )
2699
+ try:
2700
+ sb_install.main(override="cft")
2701
+ except Exception as e:
2702
+ log_d("\nWarning: Chrome download failed: %s" % e)
2703
+ sys.argv = sys_args # Put back the original sys args
2704
+ else:
2705
+ chrome_fixing_lock = fasteners.InterProcessLock(
2706
+ constants.MultiBrowser.DRIVER_FIXING_LOCK
2707
+ )
2708
+ with chrome_fixing_lock:
2709
+ with suppress(Exception):
2710
+ shared_utils.make_writable(
2711
+ constants.MultiBrowser.DRIVER_FIXING_LOCK
2712
+ )
2713
+ if not os.path.exists(binary_location):
2714
+ sys_args = sys.argv # Save a copy of sys args
2715
+ log_d(
2716
+ "\nWarning: "
2717
+ "Chrome for Testing binary not found..."
2718
+ )
2719
+ sb_install.main(override="cft")
2720
+ sys.argv = sys_args # Put back original args
2721
+ else:
2722
+ binary_location = None
2723
+ if (
2724
+ binary_location.lower() == "chs"
2725
+ and browser_name == constants.Browser.GOOGLE_CHROME
2726
+ ):
2727
+ binary_folder = None
2728
+ if IS_MAC:
2729
+ if IS_ARM_MAC:
2730
+ binary_folder = "chrome-headless-shell-mac-arm64"
2731
+ else:
2732
+ binary_folder = "chrome-headless-shell-mac-x64"
2733
+ elif IS_LINUX:
2734
+ binary_folder = "chrome-headless-shell-linux64"
2735
+ elif IS_WINDOWS:
2736
+ if "64" in ARCH:
2737
+ binary_folder = "chrome-headless-shell-win64"
2738
+ else:
2739
+ binary_folder = "chrome-headless-shell-win32"
2740
+ if binary_folder:
2741
+ binary_location = os.path.join(DRIVER_DIR, binary_folder)
2742
+ if not os.path.exists(binary_location):
2743
+ from seleniumbase.console_scripts import sb_install
2744
+ args = " ".join(sys.argv)
2745
+ if not (
2746
+ "-n" in sys.argv or " -n=" in args or args == "-c"
2747
+ ):
2748
+ # (Not multithreaded)
2749
+ sys_args = sys.argv # Save a copy of current sys args
2750
+ log_d(
2751
+ "\nWarning: "
2752
+ "Chrome-Headless-Shell binary not found..."
2753
+ )
2754
+ try:
2755
+ sb_install.main(override="chs")
2756
+ except Exception as e:
2757
+ log_d(
2758
+ "\nWarning: "
2759
+ "Chrome-Headless-Shell download failed: %s" % e
2760
+ )
2761
+ sys.argv = sys_args # Put back the original sys args
2762
+ else:
2763
+ chrome_fixing_lock = fasteners.InterProcessLock(
2764
+ constants.MultiBrowser.DRIVER_FIXING_LOCK
2765
+ )
2766
+ with chrome_fixing_lock:
2767
+ with suppress(Exception):
2768
+ shared_utils.make_writable(
2769
+ constants.MultiBrowser.DRIVER_FIXING_LOCK
2770
+ )
2771
+ if not os.path.exists(binary_location):
2772
+ sys_args = sys.argv # Save a copy of sys args
2773
+ log_d(
2774
+ "\nWarning: "
2775
+ "Chrome-Headless-Shell binary not found..."
2776
+ )
2777
+ sb_install.main(override="chs")
2778
+ sys.argv = sys_args # Put back original args
2779
+ else:
2780
+ binary_location = None
2660
2781
  if not os.path.exists(binary_location):
2661
2782
  log_d(
2662
2783
  "\nWarning: The Chromium binary specified (%s) was NOT found!"
@@ -2666,7 +2787,7 @@ def get_driver(
2666
2787
  elif binary_location.endswith("/") or binary_location.endswith("\\"):
2667
2788
  log_d(
2668
2789
  "\nWarning: The Chromium binary path must be a full path "
2669
- "that includes the driver filename at the end of it!"
2790
+ "that includes the browser filename at the end of it!"
2670
2791
  "\n(Will use default settings...)\n" % binary_location
2671
2792
  )
2672
2793
  # Example of a valid binary location path - MacOS:
@@ -2675,6 +2796,34 @@ def get_driver(
2675
2796
  else:
2676
2797
  binary_name = binary_location.split("/")[-1].split("\\")[-1]
2677
2798
  valid_names = get_valid_binary_names_for_browser(browser_name)
2799
+ if binary_name == "Google Chrome for Testing.app":
2800
+ binary_name = "Google Chrome for Testing"
2801
+ binary_location += "/Contents/MacOS/Google Chrome for Testing"
2802
+ elif binary_name in ["chrome-mac-arm64", "chrome-mac-x64"]:
2803
+ binary_name = "Google Chrome for Testing"
2804
+ binary_location += "/Google Chrome for Testing.app"
2805
+ binary_location += "/Contents/MacOS/Google Chrome for Testing"
2806
+ elif binary_name == "chrome-linux64":
2807
+ binary_name = "chrome"
2808
+ binary_location += "/chrome"
2809
+ elif binary_name in ["chrome-win32", "chrome-win64"]:
2810
+ binary_name = "chrome.exe"
2811
+ binary_location += "\\chrome.exe"
2812
+ elif binary_name in [
2813
+ "chrome-headless-shell-mac-arm64",
2814
+ "chrome-headless-shell-mac-x64",
2815
+ ]:
2816
+ binary_name = "chrome-headless-shell"
2817
+ binary_location += "/chrome-headless-shell"
2818
+ elif binary_name == "chrome-headless-shell-linux64":
2819
+ binary_name = "chrome-headless-shell"
2820
+ binary_location += "/chrome-headless-shell"
2821
+ elif binary_name in [
2822
+ "chrome-headless-shell-win32",
2823
+ "chrome-headless-shell-win64",
2824
+ ]:
2825
+ binary_name = "chrome-headless-shell.exe"
2826
+ binary_location += "\\chrome-headless-shell.exe"
2678
2827
  if binary_name not in valid_names:
2679
2828
  log_d(
2680
2829
  "\nWarning: The Chromium binary specified is NOT valid!"
@@ -2683,6 +2832,8 @@ def get_driver(
2683
2832
  "" % (binary_name, valid_names)
2684
2833
  )
2685
2834
  binary_location = None
2835
+ elif binary_location.lower() == "chs":
2836
+ headless = True
2686
2837
  if (uc_cdp_events or uc_subprocess) and not undetectable:
2687
2838
  undetectable = True
2688
2839
  if mobile_emulator and not user_agent:
@@ -1604,7 +1604,7 @@ class CDPMethods():
1604
1604
  """Return True if checkbox (or radio button) is checked."""
1605
1605
  selector = self.__convert_to_css_if_xpath(selector)
1606
1606
  self.find_element(selector, timeout=settings.SMALL_TIMEOUT)
1607
- return self.get_element_attribute(selector, "checked")
1607
+ return bool(self.get_element_attribute(selector, "checked"))
1608
1608
 
1609
1609
  def is_selected(self, selector):
1610
1610
  selector = self.__convert_to_css_if_xpath(selector)
@@ -2494,8 +2494,10 @@ class BaseCase(unittest.TestCase):
2494
2494
  kind = self.get_attribute(selector, "type", by=by, timeout=timeout)
2495
2495
  if kind != "checkbox" and kind != "radio":
2496
2496
  raise Exception("Expecting a checkbox or a radio button element!")
2497
- return self.get_attribute(
2498
- selector, "checked", by=by, timeout=timeout, hard_fail=False
2497
+ return bool(
2498
+ self.get_attribute(
2499
+ selector, "checked", by=by, timeout=timeout, hard_fail=False
2500
+ )
2499
2501
  )
2500
2502
 
2501
2503
  def is_selected(self, selector, by="css selector", timeout=None):
@@ -15166,9 +15168,12 @@ class BaseCase(unittest.TestCase):
15166
15168
  self.driver.close()
15167
15169
  self.switch_to_window(0)
15168
15170
  if self._crumbs:
15169
- self.wait_for_ready_state_complete()
15170
- with suppress(Exception):
15171
- self.driver.delete_all_cookies()
15171
+ if self.binary_location == "chs":
15172
+ self.delete_session_storage()
15173
+ else:
15174
+ self.wait_for_ready_state_complete()
15175
+ with suppress(Exception):
15176
+ self.driver.delete_all_cookies()
15172
15177
  if self._reuse_session and sb_config.shared_driver and has_url:
15173
15178
  good_start_page = False
15174
15179
  if self.recorder_ext:
@@ -400,6 +400,7 @@ class ValidBinaries:
400
400
  "google-chrome-beta",
401
401
  "google-chrome-dev",
402
402
  "google-chrome-unstable",
403
+ "chrome-headless-shell",
403
404
  "brave-browser",
404
405
  "brave-browser-stable",
405
406
  "brave",
@@ -418,6 +419,7 @@ class ValidBinaries:
418
419
  "Google Chrome",
419
420
  "Chromium",
420
421
  "Google Chrome for Testing",
422
+ "chrome-headless-shell",
421
423
  "Google Chrome Beta",
422
424
  "Google Chrome Dev",
423
425
  "Brave Browser",
@@ -429,6 +431,7 @@ class ValidBinaries:
429
431
  valid_chrome_binaries_on_windows = [
430
432
  "chrome.exe",
431
433
  "chromium.exe",
434
+ "chrome-headless-shell.exe",
432
435
  "brave.exe",
433
436
  "opera.exe",
434
437
  ]
@@ -137,6 +137,8 @@ def Driver(
137
137
  guest=None, # Shortcut / Duplicate of "guest_mode".
138
138
  wire=None, # Shortcut / Duplicate of "use_wire".
139
139
  pls=None, # Shortcut / Duplicate of "page_load_strategy".
140
+ cft=None, # Use "Chrome for Testing"
141
+ chs=None, # Use "Chrome-Headless-Shell"
140
142
  ):
141
143
  """
142
144
  * SeleniumBase Driver as a Python Context Manager or a returnable object. *
@@ -530,6 +532,42 @@ def Driver(
530
532
  break
531
533
  count += 1
532
534
  user_agent = agent
535
+ found_bl = None
536
+ if binary_location is None and "--binary-location" in arg_join:
537
+ count = 0
538
+ for arg in sys_argv:
539
+ if arg.startswith("--binary-location="):
540
+ found_bl = arg.split("--binary-location=")[1]
541
+ break
542
+ elif arg == "--binary-location" and len(sys_argv) > count + 1:
543
+ found_bl = sys_argv[count + 1]
544
+ if found_bl.startswith("-"):
545
+ found_bl = None
546
+ break
547
+ count += 1
548
+ if found_bl:
549
+ binary_location = found_bl
550
+ if binary_location is None and "--bl=" in arg_join:
551
+ for arg in sys_argv:
552
+ if arg.startswith("--bl="):
553
+ binary_location = arg.split("--bl=")[1]
554
+ break
555
+ if cft and not binary_location:
556
+ binary_location = "cft"
557
+ elif chs and not binary_location:
558
+ binary_location = "chs"
559
+ if "--cft" in sys_argv and not binary_location:
560
+ binary_location = "cft"
561
+ elif "--chs" in sys_argv and not binary_location:
562
+ binary_location = "chs"
563
+ if (
564
+ binary_location
565
+ and binary_location.lower() == "chs"
566
+ and browser == "chrome"
567
+ ):
568
+ headless = True
569
+ headless1 = False
570
+ headless2 = False
533
571
  recorder_mode = False
534
572
  if recorder_ext:
535
573
  recorder_mode = True
@@ -184,6 +184,20 @@ def pytest_addoption(parser):
184
184
  default=False,
185
185
  help="""Shortcut for --browser=safari""",
186
186
  )
187
+ parser.addoption(
188
+ "--cft",
189
+ action="store_true",
190
+ dest="use_cft",
191
+ default=False,
192
+ help="""Shortcut for using `Chrome for Testing`""",
193
+ )
194
+ parser.addoption(
195
+ "--chs",
196
+ action="store_true",
197
+ dest="use_chs",
198
+ default=False,
199
+ help="""Shortcut for using `Chrome-Headless-Shell`""",
200
+ )
187
201
  parser.addoption(
188
202
  "--with-selenium",
189
203
  action="store_true",
@@ -656,6 +670,7 @@ def pytest_addoption(parser):
656
670
  parser.addoption(
657
671
  "--binary_location",
658
672
  "--binary-location",
673
+ "--bl",
659
674
  action="store",
660
675
  dest="binary_location",
661
676
  default=None,
@@ -1574,6 +1589,18 @@ def pytest_configure(config):
1574
1589
  sb_config.extension_dir = config.getoption("extension_dir")
1575
1590
  sb_config.disable_features = config.getoption("disable_features")
1576
1591
  sb_config.binary_location = config.getoption("binary_location")
1592
+ if config.getoption("use_cft") and not sb_config.binary_location:
1593
+ sb_config.binary_location = "cft"
1594
+ elif config.getoption("use_chs") and not sb_config.binary_location:
1595
+ sb_config.binary_location = "chs"
1596
+ if (
1597
+ sb_config.binary_location
1598
+ and sb_config.binary_location.lower() == "chs"
1599
+ and sb_config.browser == "chrome"
1600
+ ):
1601
+ sb_config.headless = True
1602
+ sb_config.headless1 = False
1603
+ sb_config.headless2 = False
1577
1604
  sb_config.driver_version = config.getoption("driver_version")
1578
1605
  sb_config.page_load_strategy = config.getoption("page_load_strategy")
1579
1606
  sb_config.with_testing_base = config.getoption("with_testing_base")
@@ -119,6 +119,8 @@ def SB(
119
119
  pls=None, # Shortcut / Duplicate of "page_load_strategy".
120
120
  sjw=None, # Shortcut / Duplicate of "skip_js_waits".
121
121
  wfa=None, # Shortcut / Duplicate of "wait_for_angularjs".
122
+ cft=None, # Use "Chrome for Testing"
123
+ chs=None, # Use "Chrome-Headless-Shell"
122
124
  save_screenshot=None, # Save a screenshot at the end of each test.
123
125
  no_screenshot=None, # No screenshots saved unless tests directly ask it.
124
126
  page_load_strategy=None, # Set Chrome PLS to "normal", "eager", or "none".
@@ -568,6 +570,42 @@ def SB(
568
570
  break
569
571
  count += 1
570
572
  user_agent = agent
573
+ found_bl = None
574
+ if binary_location is None and "--binary-location" in arg_join:
575
+ count = 0
576
+ for arg in sys_argv:
577
+ if arg.startswith("--binary-location="):
578
+ found_bl = arg.split("--binary-location=")[1]
579
+ break
580
+ elif arg == "--binary-location" and len(sys_argv) > count + 1:
581
+ found_bl = sys_argv[count + 1]
582
+ if found_bl.startswith("-"):
583
+ found_bl = None
584
+ break
585
+ count += 1
586
+ if found_bl:
587
+ binary_location = found_bl
588
+ if binary_location is None and "--bl=" in arg_join:
589
+ for arg in sys_argv:
590
+ if arg.startswith("--bl="):
591
+ binary_location = arg.split("--bl=")[1]
592
+ break
593
+ if cft and not binary_location:
594
+ binary_location = "cft"
595
+ elif chs and not binary_location:
596
+ binary_location = "chs"
597
+ if "--cft" in sys_argv and not binary_location:
598
+ binary_location = "cft"
599
+ elif "--chs" in sys_argv and not binary_location:
600
+ binary_location = "chs"
601
+ if (
602
+ binary_location
603
+ and binary_location.lower() == "chs"
604
+ and browser == "chrome"
605
+ ):
606
+ headless = True
607
+ headless1 = False
608
+ headless2 = False
571
609
  recorder_mode = False
572
610
  if recorder_ext:
573
611
  recorder_mode = True
@@ -144,6 +144,20 @@ class SeleniumBrowser(Plugin):
144
144
  default=False,
145
145
  help="""Shortcut for --browser=safari""",
146
146
  )
147
+ parser.addoption(
148
+ "--cft",
149
+ action="store_true",
150
+ dest="use_cft",
151
+ default=False,
152
+ help="""Shortcut for using `Chrome for Testing`""",
153
+ )
154
+ parser.addoption(
155
+ "--chs",
156
+ action="store_true",
157
+ dest="use_chs",
158
+ default=False,
159
+ help="""Shortcut for using `Chrome-Headless-Shell`""",
160
+ )
147
161
  parser.addoption(
148
162
  "--cap_file",
149
163
  "--cap-file",
@@ -397,6 +411,7 @@ class SeleniumBrowser(Plugin):
397
411
  parser.addoption(
398
412
  "--binary_location",
399
413
  "--binary-location",
414
+ "--bl",
400
415
  action="store",
401
416
  dest="binary_location",
402
417
  default=None,
@@ -1202,6 +1217,18 @@ class SeleniumBrowser(Plugin):
1202
1217
  test.test.extension_dir = self.options.extension_dir
1203
1218
  test.test.disable_features = self.options.disable_features
1204
1219
  test.test.binary_location = self.options.binary_location
1220
+ if self.options.use_cft and not test.test.binary_location:
1221
+ test.test.binary_location = "cft"
1222
+ elif self.options.use_chs and not test.test.binary_location:
1223
+ test.test.binary_location = "chs"
1224
+ if (
1225
+ test.test.binary_location
1226
+ and test.test.binary_location.lower() == "chs"
1227
+ and test.test.browser == "chrome"
1228
+ ):
1229
+ test.test.headless = True
1230
+ test.test.headless1 = False
1231
+ test.test.headless2 = False
1205
1232
  test.test.driver_version = self.options.driver_version
1206
1233
  test.test.page_load_strategy = self.options.page_load_strategy
1207
1234
  test.test.chromium_arg = self.options.chromium_arg
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.34.1
3
+ Version: 4.34.3
4
4
  Summary: A complete web automation framework for end-to-end testing.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -64,7 +64,7 @@ Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=75.8.0; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
- Requires-Dist: attrs>=24.3.0
67
+ Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2024.12.14
69
69
  Requires-Dist: exceptiongroup>=1.2.2
70
70
  Requires-Dist: websockets~=13.1; python_version < "3.9"
@@ -104,7 +104,7 @@ Requires-Dist: trio-websocket==0.11.1
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
107
- Requires-Dist: selenium==4.28.0; python_version >= "3.9"
107
+ Requires-Dist: selenium==4.28.1; python_version >= "3.9"
108
108
  Requires-Dist: cssselect==1.2.0
109
109
  Requires-Dist: sortedcontainers==2.4.0
110
110
  Requires-Dist: execnet==2.1.1
@@ -3,10 +3,10 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
3
3
  sbase/steps.py,sha256=_WvAjydKqZfTdnZW9LPKkRty-g-lfdUPmLqnZj6ulcs,43013
4
4
  seleniumbase/__init__.py,sha256=OtJh8nGKL4xtZpw8KPqmn7Q6R-86t4cWUDyVF5MbMTo,2398
5
5
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
6
- seleniumbase/__version__.py,sha256=9NkBpKTkUY1HsNuHVkpa9SnvLfFVQkjg3mYg5-ioJ8w,46
6
+ seleniumbase/__version__.py,sha256=Uuj5H1Y3skHSX7gCdgBcXPjSC2pPsbPi2kTBbJRhpDo,46
7
7
  seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  seleniumbase/behave/behave_helper.py,sha256=elkl8P9eLulRAioLstE9baYNM9N_PHBmAOcajX-pH_Y,24198
9
- seleniumbase/behave/behave_sb.py,sha256=-hza7Nx2U41mSObYiPMi48v3JlPh3sJO3yzP0kqZ1Gk,59174
9
+ seleniumbase/behave/behave_sb.py,sha256=qQF85LoohJBfrPK5ZcPi50v-pWtOrC9qcN1B3Ki_3tY,59401
10
10
  seleniumbase/behave/steps.py,sha256=8-N-NB2tnDsxaP4LSg-uSBgbwZYMS6ZEL1oggO1PCoU,390
11
11
  seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  seleniumbase/common/decorators.py,sha256=DYdjtF8Y7YJj0JS33WtmsIn4yddPoniNwcPyrgt522o,7857
@@ -21,11 +21,11 @@ seleniumbase/config/settings.py,sha256=cAMmoFBQ6g8GCJIsRsSwGsP1_fJxhADxjHq30lFB1
21
21
  seleniumbase/console_scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  seleniumbase/console_scripts/logo_helper.py,sha256=ZqS9TAwpcu5mM5ll-a0wTbXLs2Sbcsyo3EoC4jwtnME,2927
23
23
  seleniumbase/console_scripts/rich_helper.py,sha256=U_zvXpalxVV8rtg8c8EnNNmnh45tii3AV5ZV3O3KbGA,2234
24
- seleniumbase/console_scripts/run.py,sha256=t_mpBUIJLBrUtzJ5RQL5y8UVCTm7DhNyS94rHwIOnRs,58850
24
+ seleniumbase/console_scripts/run.py,sha256=6Q9kbpOY40kTczcQVrD-x6thb3QO9-2wfse7DpL3Hik,59052
25
25
  seleniumbase/console_scripts/sb_behave_gui.py,sha256=3Zl7_QQczvkkQW_UuaqYEUlEjiZ6AJzHR9GeNyVVXkc,15147
26
26
  seleniumbase/console_scripts/sb_caseplans.py,sha256=qlmvjQ49bOBE1Q29fVmabimkVibCVr25GNtJhFPTMrc,18145
27
27
  seleniumbase/console_scripts/sb_commander.py,sha256=exQGKzqRAoGqRmQtDmlmoHnSG9eSy9eh8HVy-tXw6s4,13343
28
- seleniumbase/console_scripts/sb_install.py,sha256=y84Zk-rcp554kcF_g97Xwl0Rn38pyH9wO5OKHX879RI,45831
28
+ seleniumbase/console_scripts/sb_install.py,sha256=GgOqQZZhjwbSle9aB-6Fyf3x6Xlj78uKQ6PkPq-3VEE,55346
29
29
  seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApyN8-Dr129cNXwQ,10941
30
30
  seleniumbase/console_scripts/sb_mkdir.py,sha256=SaI2wnjE5eQLxX8RPdjFjM_ghBbMm4r_vBUzU5t5dzY,29819
31
31
  seleniumbase/console_scripts/sb_mkfile.py,sha256=OWYd4yFccmjrd-gNn1t1una-HDRU2_N2-r4Tg3nHsj0,17744
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
36
36
  seleniumbase/console_scripts/sb_recorder.py,sha256=fnHb5-kh11Hit-E9Ha-e4QXzqLcZvtij6mb5qNd4B1Q,11032
37
37
  seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
39
- seleniumbase/core/browser_launcher.py,sha256=s0bd8iY09o1jhEYqGh9xez79mPH-bVy4ffHWKwDuAAQ,226424
39
+ seleniumbase/core/browser_launcher.py,sha256=yBXCddbmRF7LXkM4I67KvYCYIMJovN9_5NucacfaTxk,233695
40
40
  seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
41
41
  seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
42
42
  seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
@@ -50,7 +50,7 @@ seleniumbase/core/proxy_helper.py,sha256=kZnfkflB3XhuL2h-3inmx3UOLS8VAZ385BGCc4H
50
50
  seleniumbase/core/recorder_helper.py,sha256=fNGjbapXmEsht54x1o6Igk198QdnPxDDnjUOzQxNhNQ,25055
51
51
  seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
52
52
  seleniumbase/core/s3_manager.py,sha256=bkeI8I4y19ebWuQG1oEZV5qJbotC6eN8vin31OCNWJk,3521
53
- seleniumbase/core/sb_cdp.py,sha256=f6l4GUJP-jg-ivukpbwVLyFNvnlzUnXjm5Y2oUw0I88,76028
53
+ seleniumbase/core/sb_cdp.py,sha256=5MVZ21faTNm6v_Yc11ZXVdVQgfimEjMZvgLFp0EEw9Q,76034
54
54
  seleniumbase/core/sb_driver.py,sha256=NGa4adi8OAi2WFtFkEguXg3JCd1p-JuZweIpGNifEfU,13488
55
55
  seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
56
56
  seleniumbase/core/settings_parser.py,sha256=gqVohHVlE_5L5Cqe2L24uYrRzvoK-saX8E_Df7_-_3I,7609
@@ -65,8 +65,8 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
65
65
  seleniumbase/extensions/recorder.zip,sha256=OOyzF-Ize2cSRu1CqhzSAq5vusI9hqLLd2OIApUHesI,11918
66
66
  seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
67
67
  seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- seleniumbase/fixtures/base_case.py,sha256=cAPiEkviPoV0cn7FEa9RsNqkK6gNw2DHN0W4-vaQJg8,720631
69
- seleniumbase/fixtures/constants.py,sha256=e1LppavlrAcI4XBJMq7u5j8SffaQ7SPQps1y0YvZYfY,13649
68
+ seleniumbase/fixtures/base_case.py,sha256=Pj28EBINaL1gL8O--YyCfn8YhmcH2jaQrJm5uiMZB20,720825
69
+ seleniumbase/fixtures/constants.py,sha256=WMrItuNyKq3XVJ64NluLIRc4gJCxDw8K8qXED0b9S2w,13752
70
70
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
71
71
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
72
72
  seleniumbase/fixtures/js_utils.py,sha256=asZJ0LDFv2BPQOzUVKK_9ie8ToGcmFousDnGdb3Vabg,51534
@@ -86,13 +86,13 @@ seleniumbase/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
86
86
  seleniumbase/plugins/base_plugin.py,sha256=FemdftNhOaTfQIw5bWcJQPPPGQ3P0_sMEI_YYDuzZgU,14972
87
87
  seleniumbase/plugins/basic_test_info.py,sha256=8ov6n417gPbqqvrlT4zrch7l2XcRt-GF2ny6rR9AMWk,2108
88
88
  seleniumbase/plugins/db_reporting_plugin.py,sha256=En09qUCoojrk9-vbcnsoHdSELoGmag2GDIyu3jTiJas,7331
89
- seleniumbase/plugins/driver_manager.py,sha256=s20s0pJYaNrG0WNwyIC04oUMRVFjtm6V_nS1-EvFm7g,34492
89
+ seleniumbase/plugins/driver_manager.py,sha256=QGGekWvcj58VMGr87UyXl1OvVTMjZDEdt8jaq7K13u8,35863
90
90
  seleniumbase/plugins/page_source.py,sha256=loTnXxOj4kxEukuTZEiGyvKBhY3KDVDMnNlHHheTBDE,1889
91
- seleniumbase/plugins/pytest_plugin.py,sha256=uSfHTgeI30RpyGxXPzszvKpBJ5epGi1WDJobEtXEjBk,107389
91
+ seleniumbase/plugins/pytest_plugin.py,sha256=SKCHzUFSd8dHPQwYQTJp-6AX7YD6Kce-MemvNguNgYs,108249
92
92
  seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
93
- seleniumbase/plugins/sb_manager.py,sha256=Z19CfRSaqcxdn_YvzXVt4B9Nu3Bhs97QIO5tHlvbuyk,54871
93
+ seleniumbase/plugins/sb_manager.py,sha256=aOaP5ZxLM7EfpLml4f_iBXkidKtFA1KcZQQIGm4aSQQ,56242
94
94
  seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
95
- seleniumbase/plugins/selenium_plugin.py,sha256=GhGW2ATy2kM7UH7NrZ2je402nN2LMlVHpM-yxlU3I9E,59069
95
+ seleniumbase/plugins/selenium_plugin.py,sha256=qpbP4pMGGdM2s_YWWNzgZQx9pLGETW6H3_Gbx2FQ57o,60023
96
96
  seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
97
  seleniumbase/translate/__init__.py,sha256=N2i5XntTwJZmwr9-qvdX5gC6Rdm5-ClIbnQ8yyPn4Oo,459
98
98
  seleniumbase/translate/chinese.py,sha256=0QhK2eadtsdN4KCvwki1J7jBCe8I4xxWbKzteJKJozY,24698
@@ -135,9 +135,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
135
135
  seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
136
136
  seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
138
- seleniumbase-4.34.1.dist-info/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
- seleniumbase-4.34.1.dist-info/METADATA,sha256=v3jsZX-fuPQUcvFX0qyJJa6cOykZBtDYaOAKJ443Af8,86522
140
- seleniumbase-4.34.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
141
- seleniumbase-4.34.1.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
- seleniumbase-4.34.1.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
- seleniumbase-4.34.1.dist-info/RECORD,,
138
+ seleniumbase-4.34.3.dist-info/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
+ seleniumbase-4.34.3.dist-info/METADATA,sha256=aAlgc-ToqhxQPG4_MV_F8SMOctlsV0rgAILYhaPFU1c,86522
140
+ seleniumbase-4.34.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
141
+ seleniumbase-4.34.3.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
+ seleniumbase-4.34.3.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
+ seleniumbase-4.34.3.dist-info/RECORD,,