seleniumbase 4.33.4__py3-none-any.whl → 4.34.2__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|