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/core/log_helper.py
CHANGED
@@ -7,6 +7,7 @@ from contextlib import suppress
|
|
7
7
|
from seleniumbase import config as sb_config
|
8
8
|
from seleniumbase.config import settings
|
9
9
|
from seleniumbase.fixtures import constants
|
10
|
+
from seleniumbase.fixtures import shared_utils
|
10
11
|
|
11
12
|
python3_11_or_newer = False
|
12
13
|
if sys.version_info >= (3, 11):
|
@@ -14,6 +15,11 @@ if sys.version_info >= (3, 11):
|
|
14
15
|
py311_patch2 = constants.PatchPy311.PATCH
|
15
16
|
|
16
17
|
|
18
|
+
def __is_cdp_swap_needed(driver):
|
19
|
+
"""If the driver is disconnected, use a CDP method when available."""
|
20
|
+
return shared_utils.is_cdp_swap_needed(driver)
|
21
|
+
|
22
|
+
|
17
23
|
def log_screenshot(test_logpath, driver, screenshot=None, get=False):
|
18
24
|
screenshot_name = settings.SCREENSHOT_NAME
|
19
25
|
screenshot_path = os.path.join(test_logpath, screenshot_name)
|
@@ -33,6 +39,8 @@ def log_screenshot(test_logpath, driver, screenshot=None, get=False):
|
|
33
39
|
if screenshot != screenshot_warning:
|
34
40
|
with open(screenshot_path, "wb") as file:
|
35
41
|
file.write(screenshot)
|
42
|
+
with suppress(Exception):
|
43
|
+
shared_utils.make_writable(screenshot_path)
|
36
44
|
else:
|
37
45
|
print("WARNING: %s" % screenshot_warning)
|
38
46
|
if get:
|
@@ -282,13 +290,14 @@ def log_test_failure_data(test, test_logpath, driver, browser, url=None):
|
|
282
290
|
sb_config._report_time = the_time
|
283
291
|
sb_config._report_traceback = traceback_message
|
284
292
|
sb_config._report_exception = exc_message
|
285
|
-
|
286
|
-
|
293
|
+
if not os.path.exists(test_logpath):
|
294
|
+
with suppress(Exception):
|
287
295
|
os.makedirs(test_logpath)
|
288
296
|
with suppress(Exception):
|
289
297
|
log_file = codecs.open(basic_file_path, "w+", encoding="utf-8")
|
290
298
|
log_file.writelines("\r\n".join(data_to_save))
|
291
299
|
log_file.close()
|
300
|
+
shared_utils.make_writable(basic_file_path)
|
292
301
|
|
293
302
|
|
294
303
|
def log_skipped_test_data(test, test_logpath, driver, browser, reason):
|
@@ -339,9 +348,11 @@ def log_skipped_test_data(test, test_logpath, driver, browser, reason):
|
|
339
348
|
data_to_save.append(" * Skip Reason: %s" % reason)
|
340
349
|
data_to_save.append("")
|
341
350
|
file_path = os.path.join(test_logpath, "skip_reason.txt")
|
342
|
-
|
343
|
-
|
344
|
-
|
351
|
+
with suppress(Exception):
|
352
|
+
log_file = codecs.open(file_path, "w+", encoding="utf-8")
|
353
|
+
log_file.writelines("\r\n".join(data_to_save))
|
354
|
+
log_file.close()
|
355
|
+
shared_utils.make_writable(file_path)
|
345
356
|
|
346
357
|
|
347
358
|
def log_page_source(test_logpath, driver, source=None):
|
@@ -350,7 +361,11 @@ def log_page_source(test_logpath, driver, source=None):
|
|
350
361
|
page_source = source
|
351
362
|
else:
|
352
363
|
try:
|
353
|
-
page_source =
|
364
|
+
page_source = None
|
365
|
+
if __is_cdp_swap_needed(driver):
|
366
|
+
page_source = driver.cdp.get_page_source()
|
367
|
+
else:
|
368
|
+
page_source = driver.page_source
|
354
369
|
page_source = get_html_source_with_base_href(driver, page_source)
|
355
370
|
except Exception:
|
356
371
|
source = constants.Warnings.PAGE_SOURCE_UNDEFINED
|
@@ -364,13 +379,15 @@ def log_page_source(test_logpath, driver, source=None):
|
|
364
379
|
"unresponsive, or closed prematurely!</h4>"
|
365
380
|
)
|
366
381
|
)
|
367
|
-
|
368
|
-
|
382
|
+
if not os.path.exists(test_logpath):
|
383
|
+
with suppress(Exception):
|
369
384
|
os.makedirs(test_logpath)
|
370
385
|
html_file_path = os.path.join(test_logpath, html_file_name)
|
371
|
-
|
372
|
-
|
373
|
-
|
386
|
+
with suppress(Exception):
|
387
|
+
html_file = codecs.open(html_file_path, "w+", encoding="utf-8")
|
388
|
+
html_file.write(page_source)
|
389
|
+
html_file.close()
|
390
|
+
shared_utils.make_writable(html_file_path)
|
374
391
|
|
375
392
|
|
376
393
|
def get_test_id(test):
|
@@ -440,7 +457,11 @@ def get_test_name(test):
|
|
440
457
|
|
441
458
|
def get_last_page(driver):
|
442
459
|
try:
|
443
|
-
last_page =
|
460
|
+
last_page = None
|
461
|
+
if __is_cdp_swap_needed(driver):
|
462
|
+
last_page = driver.cdp.get_current_url()
|
463
|
+
else:
|
464
|
+
last_page = driver.current_url
|
444
465
|
except Exception:
|
445
466
|
last_page = "[WARNING! Browser Not Open!]"
|
446
467
|
if len(last_page) < 5:
|
@@ -2,10 +2,12 @@ import os
|
|
2
2
|
import re
|
3
3
|
import warnings
|
4
4
|
import zipfile
|
5
|
+
from contextlib import suppress
|
5
6
|
from seleniumbase.config import proxy_list
|
6
7
|
from seleniumbase.config import settings
|
7
8
|
from seleniumbase.fixtures import constants
|
8
9
|
from seleniumbase.fixtures import page_utils
|
10
|
+
from seleniumbase.fixtures import shared_utils
|
9
11
|
|
10
12
|
DOWNLOADS_DIR = constants.Files.DOWNLOADS_FOLDER
|
11
13
|
PROXY_ZIP_PATH = os.path.join(DOWNLOADS_DIR, "proxy.zip")
|
@@ -109,31 +111,35 @@ def create_proxy_ext(
|
|
109
111
|
""""minimum_chrome_version":"22.0.0"\n"""
|
110
112
|
"""}"""
|
111
113
|
)
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
proxy_ext_dir
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
114
|
+
abs_path = os.path.abspath(".")
|
115
|
+
downloads_path = os.path.join(abs_path, DOWNLOADS_DIR)
|
116
|
+
if not os.path.exists(downloads_path):
|
117
|
+
os.mkdir(downloads_path)
|
118
|
+
if zip_it:
|
119
|
+
zf = zipfile.ZipFile(PROXY_ZIP_PATH, mode="w")
|
120
|
+
zf.writestr("background.js", background_js)
|
121
|
+
zf.writestr("manifest.json", manifest_json)
|
122
|
+
zf.close()
|
123
|
+
with suppress(Exception):
|
124
|
+
shared_utils.make_writable(PROXY_ZIP_PATH)
|
125
|
+
else:
|
126
|
+
proxy_ext_dir = PROXY_DIR_PATH
|
127
|
+
if not os.path.exists(proxy_ext_dir):
|
128
|
+
os.mkdir(proxy_ext_dir)
|
129
|
+
with suppress(Exception):
|
130
|
+
shared_utils.make_writable(proxy_ext_dir)
|
131
|
+
manifest_file = os.path.join(proxy_ext_dir, "manifest.json")
|
132
|
+
with open(manifest_file, mode="w") as f:
|
133
|
+
f.write(manifest_json)
|
134
|
+
with suppress(Exception):
|
135
|
+
shared_utils.make_writable(manifest_json)
|
136
|
+
proxy_host = proxy_string.split(":")[0]
|
137
|
+
proxy_port = proxy_string.split(":")[1]
|
138
|
+
background_file = os.path.join(proxy_ext_dir, "background.js")
|
139
|
+
with open(background_file, mode="w") as f:
|
140
|
+
f.write(background_js)
|
141
|
+
with suppress(Exception):
|
142
|
+
shared_utils.make_writable(background_js)
|
137
143
|
|
138
144
|
|
139
145
|
def remove_proxy_zip_if_present():
|
@@ -141,13 +147,12 @@ def remove_proxy_zip_if_present():
|
|
141
147
|
Used in the implementation of https://stackoverflow.com/a/35293284
|
142
148
|
for https://stackoverflow.com/questions/12848327/
|
143
149
|
"""
|
144
|
-
|
145
|
-
|
150
|
+
if os.path.exists(PROXY_ZIP_PATH):
|
151
|
+
with suppress(Exception):
|
146
152
|
os.remove(PROXY_ZIP_PATH)
|
147
|
-
|
153
|
+
if os.path.exists(PROXY_ZIP_LOCK):
|
154
|
+
with suppress(Exception):
|
148
155
|
os.remove(PROXY_ZIP_LOCK)
|
149
|
-
except Exception:
|
150
|
-
pass
|
151
156
|
|
152
157
|
|
153
158
|
def validate_proxy_string(proxy_string):
|