seleniumbase 4.33.4__py3-none-any.whl → 4.34.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seleniumbase/__version__.py +1 -1
- seleniumbase/behave/behave_sb.py +10 -2
- seleniumbase/console_scripts/run.py +6 -2
- seleniumbase/console_scripts/sb_commander.py +5 -5
- seleniumbase/console_scripts/sb_install.py +235 -6
- seleniumbase/console_scripts/sb_mkdir.py +1 -0
- seleniumbase/core/browser_launcher.py +358 -105
- seleniumbase/core/log_helper.py +33 -12
- seleniumbase/core/proxy_helper.py +35 -30
- seleniumbase/core/sb_cdp.py +277 -74
- seleniumbase/core/settings_parser.py +2 -0
- seleniumbase/core/style_sheet.py +10 -0
- seleniumbase/fixtures/base_case.py +216 -127
- seleniumbase/fixtures/constants.py +3 -0
- seleniumbase/fixtures/js_utils.py +2 -0
- seleniumbase/fixtures/page_actions.py +7 -2
- seleniumbase/fixtures/shared_utils.py +25 -0
- seleniumbase/plugins/driver_manager.py +28 -0
- seleniumbase/plugins/pytest_plugin.py +110 -0
- seleniumbase/plugins/sb_manager.py +41 -0
- seleniumbase/plugins/selenium_plugin.py +9 -0
- seleniumbase/undetected/cdp_driver/_contradict.py +3 -3
- seleniumbase/undetected/cdp_driver/browser.py +8 -6
- seleniumbase/undetected/cdp_driver/cdp_util.py +3 -0
- seleniumbase/undetected/cdp_driver/config.py +0 -1
- seleniumbase/undetected/cdp_driver/element.py +22 -20
- seleniumbase/undetected/patcher.py +20 -5
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/LICENSE +1 -1
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/METADATA +111 -86
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/RECORD +33 -33
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/WHEEL +1 -1
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.33.4.dist-info → seleniumbase-4.34.2.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.
|
2
|
+
__version__ = "4.34.2"
|
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
|
|
@@ -156,9 +156,9 @@ def do_pytest_run(
|
|
156
156
|
if save_screenshots:
|
157
157
|
full_run_command += " --screenshot"
|
158
158
|
|
159
|
-
|
160
|
-
if "
|
161
|
-
|
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
|
172
|
-
full_run_command += " -
|
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,
|
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:
|