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.
- seleniumbase/__version__.py +1 -1
- seleniumbase/behave/behave_sb.py +10 -2
- seleniumbase/console_scripts/run.py +6 -2
- seleniumbase/console_scripts/sb_install.py +235 -6
- seleniumbase/core/browser_launcher.py +152 -1
- seleniumbase/core/sb_cdp.py +1 -1
- seleniumbase/fixtures/base_case.py +10 -5
- seleniumbase/fixtures/constants.py +3 -0
- seleniumbase/plugins/driver_manager.py +38 -0
- seleniumbase/plugins/pytest_plugin.py +27 -0
- seleniumbase/plugins/sb_manager.py +38 -0
- seleniumbase/plugins/selenium_plugin.py +27 -0
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/METADATA +3 -3
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/RECORD +18 -18
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/LICENSE +0 -0
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/WHEEL +0 -0
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.34.1.dist-info → seleniumbase-4.34.3.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.34.
|
2
|
+
__version__ = "4.34.3"
|
seleniumbase/behave/behave_sb.py
CHANGED
@@ -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,
|
143
|
-
print(" edgedriver,
|
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,
|
65
|
-
exp += " edgedriver,
|
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
|
-
|
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,
|
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
|
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:
|
seleniumbase/core/sb_cdp.py
CHANGED
@@ -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
|
2498
|
-
|
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.
|
15170
|
-
|
15171
|
-
|
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.
|
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>=
|
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.
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
69
|
-
seleniumbase/fixtures/constants.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
139
|
-
seleniumbase-4.34.
|
140
|
-
seleniumbase-4.34.
|
141
|
-
seleniumbase-4.34.
|
142
|
-
seleniumbase-4.34.
|
143
|
-
seleniumbase-4.34.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|