seleniumbase 4.30.7__py3-none-any.whl → 4.31.0__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.
- sbase/__init__.py +1 -0
- seleniumbase/__init__.py +2 -3
- seleniumbase/__version__.py +1 -1
- seleniumbase/behave/behave_sb.py +47 -9
- seleniumbase/config/settings.py +4 -0
- seleniumbase/console_scripts/sb_behave_gui.py +5 -5
- seleniumbase/console_scripts/sb_caseplans.py +6 -6
- seleniumbase/console_scripts/sb_commander.py +5 -5
- seleniumbase/console_scripts/sb_install.py +10 -2
- seleniumbase/console_scripts/sb_recorder.py +4 -4
- seleniumbase/core/browser_launcher.py +153 -104
- seleniumbase/core/mysql.py +1 -4
- seleniumbase/core/recorder_helper.py +24 -5
- seleniumbase/core/sb_driver.py +2 -3
- seleniumbase/core/settings_parser.py +4 -0
- seleniumbase/fixtures/base_case.py +307 -492
- seleniumbase/fixtures/js_utils.py +19 -52
- seleniumbase/fixtures/page_actions.py +3 -6
- seleniumbase/fixtures/page_utils.py +20 -58
- seleniumbase/plugins/base_plugin.py +2 -3
- seleniumbase/plugins/driver_manager.py +169 -3
- seleniumbase/plugins/pytest_plugin.py +34 -21
- seleniumbase/plugins/sb_manager.py +170 -3
- seleniumbase/plugins/selenium_plugin.py +52 -6
- seleniumbase/undetected/__init__.py +13 -38
- seleniumbase/undetected/dprocess.py +4 -6
- seleniumbase/undetected/options.py +3 -6
- seleniumbase/undetected/patcher.py +2 -3
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/METADATA +108 -123
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/RECORD +34 -45
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/WHEEL +1 -1
- sbase/ReadMe.txt +0 -2
- seleniumbase/ReadMe.md +0 -25
- seleniumbase/common/ReadMe.md +0 -71
- seleniumbase/console_scripts/ReadMe.md +0 -734
- seleniumbase/drivers/ReadMe.md +0 -27
- seleniumbase/extensions/ReadMe.md +0 -12
- seleniumbase/masterqa/ReadMe.md +0 -61
- seleniumbase/resources/ReadMe.md +0 -31
- seleniumbase/resources/favicon.ico +0 -0
- seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
- seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/LICENSE +0 -0
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.30.7.dist-info → seleniumbase-4.31.0.dist-info}/top_level.txt +0 -0
@@ -10,6 +10,7 @@ import selenium.webdriver.chrome.service
|
|
10
10
|
import selenium.webdriver.chrome.webdriver
|
11
11
|
import selenium.webdriver.common.service
|
12
12
|
import selenium.webdriver.remote.command
|
13
|
+
from contextlib import suppress
|
13
14
|
from .cdp import CDP
|
14
15
|
from .cdp import PageElement
|
15
16
|
from .dprocess import start_detached
|
@@ -201,11 +202,9 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
201
202
|
# Create a temporary folder for the user-data profile.
|
202
203
|
options.add_argument(arg)
|
203
204
|
if not language:
|
204
|
-
|
205
|
+
with suppress(Exception):
|
205
206
|
import locale
|
206
207
|
language = locale.getlocale()[0].replace("_", "-")
|
207
|
-
except Exception:
|
208
|
-
pass
|
209
208
|
if (
|
210
209
|
not language
|
211
210
|
or "English" in language
|
@@ -242,7 +241,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
242
241
|
)
|
243
242
|
if hasattr(options, 'handle_prefs'):
|
244
243
|
options.handle_prefs(user_data_dir)
|
245
|
-
|
244
|
+
with suppress(Exception):
|
246
245
|
import json
|
247
246
|
with open(
|
248
247
|
os.path.join(
|
@@ -263,8 +262,6 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
263
262
|
fs.seek(0, 0)
|
264
263
|
fs.truncate()
|
265
264
|
json.dump(config, fs)
|
266
|
-
except Exception:
|
267
|
-
pass
|
268
265
|
creationflags = 0
|
269
266
|
if "win32" in sys.platform:
|
270
267
|
creationflags = subprocess.CREATE_NO_WINDOW
|
@@ -293,8 +290,6 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
293
290
|
self.browser_pid = browser.pid
|
294
291
|
service_ = None
|
295
292
|
log_output = subprocess.PIPE
|
296
|
-
if sys.version_info < (3, 8):
|
297
|
-
log_output = os.devnull
|
298
293
|
if patch_driver:
|
299
294
|
service_ = selenium.webdriver.chrome.service.Service(
|
300
295
|
executable_path=self.patcher.executable_path,
|
@@ -342,7 +337,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
342
337
|
|
343
338
|
def _get_cdc_props(self):
|
344
339
|
cdc_props = []
|
345
|
-
|
340
|
+
with suppress(Exception):
|
346
341
|
cdc_props = self.execute_script(
|
347
342
|
"""
|
348
343
|
let objectToInspect = window,
|
@@ -355,8 +350,6 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
355
350
|
return result.filter(i => i.match(/^[a-z]{3}_[a-z]{22}_.*/i))
|
356
351
|
"""
|
357
352
|
)
|
358
|
-
except Exception:
|
359
|
-
pass
|
360
353
|
return cdc_props
|
361
354
|
|
362
355
|
def _hook_remove_cdc_props(self, cdc_props):
|
@@ -427,50 +420,38 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
427
420
|
- Starts the chromedriver service that runs in the background.
|
428
421
|
- Recreates the session."""
|
429
422
|
if hasattr(self, "service"):
|
430
|
-
|
423
|
+
with suppress(Exception):
|
431
424
|
self.service.stop()
|
432
|
-
except Exception:
|
433
|
-
pass
|
434
425
|
if isinstance(timeout, str):
|
435
426
|
if timeout.lower() == "breakpoint":
|
436
427
|
breakpoint() # To continue:
|
437
428
|
pass # Type "c" & press ENTER!
|
438
429
|
else:
|
439
430
|
time.sleep(timeout)
|
440
|
-
|
431
|
+
with suppress(Exception):
|
441
432
|
self.service.start()
|
442
|
-
except Exception:
|
443
|
-
pass
|
444
433
|
time.sleep(0.012)
|
445
|
-
|
434
|
+
with suppress(Exception):
|
446
435
|
self.start_session()
|
447
|
-
except Exception:
|
448
|
-
pass
|
449
436
|
time.sleep(0.012)
|
450
437
|
|
451
438
|
def disconnect(self):
|
452
439
|
"""Stops the chromedriver service that runs in the background.
|
453
440
|
To use driver methods again, you MUST call driver.connect()"""
|
454
441
|
if hasattr(self, "service"):
|
455
|
-
|
442
|
+
with suppress(Exception):
|
456
443
|
self.service.stop()
|
457
|
-
except Exception:
|
458
|
-
pass
|
459
444
|
time.sleep(0.012)
|
460
445
|
|
461
446
|
def connect(self):
|
462
447
|
"""Starts the chromedriver service that runs in the background
|
463
448
|
and recreates the session."""
|
464
449
|
if hasattr(self, "service"):
|
465
|
-
|
450
|
+
with suppress(Exception):
|
466
451
|
self.service.start()
|
467
|
-
except Exception:
|
468
|
-
pass
|
469
452
|
time.sleep(0.012)
|
470
|
-
|
453
|
+
with suppress(Exception):
|
471
454
|
self.start_session()
|
472
|
-
except Exception:
|
473
|
-
pass
|
474
455
|
time.sleep(0.012)
|
475
456
|
|
476
457
|
def start_session(self, capabilities=None):
|
@@ -496,12 +477,10 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
496
477
|
if hasattr(self, "service") and getattr(self.service, "process", None):
|
497
478
|
logger.debug("Stopping webdriver service")
|
498
479
|
self.service.stop()
|
499
|
-
|
480
|
+
with suppress(Exception):
|
500
481
|
if self.reactor and isinstance(self.reactor, Reactor):
|
501
482
|
logger.debug("Shutting down Reactor")
|
502
483
|
self.reactor.event.set()
|
503
|
-
except Exception:
|
504
|
-
pass
|
505
484
|
if (
|
506
485
|
hasattr(self, "keep_user_data_dir")
|
507
486
|
and hasattr(self, "user_data_dir")
|
@@ -530,18 +509,14 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
530
509
|
self.patcher = None
|
531
510
|
|
532
511
|
def __del__(self):
|
533
|
-
|
512
|
+
with suppress(Exception):
|
534
513
|
if "win32" in sys.platform:
|
535
514
|
self.stop_client()
|
536
515
|
self.command_executor.close()
|
537
516
|
else:
|
538
517
|
super().quit()
|
539
|
-
|
540
|
-
pass
|
541
|
-
try:
|
518
|
+
with suppress(Exception):
|
542
519
|
self.quit()
|
543
|
-
except Exception:
|
544
|
-
pass
|
545
520
|
|
546
521
|
def __enter__(self):
|
547
522
|
return self
|
@@ -3,7 +3,10 @@ import os
|
|
3
3
|
import sys
|
4
4
|
import atexit
|
5
5
|
import logging
|
6
|
+
import platform
|
7
|
+
from contextlib import suppress
|
6
8
|
from subprocess import PIPE
|
9
|
+
from subprocess import Popen
|
7
10
|
|
8
11
|
CREATE_NEW_PROCESS_GROUP = 0x00000200
|
9
12
|
DETACHED_PROCESS = 0x00000008
|
@@ -37,9 +40,6 @@ def start_detached(executable, *args):
|
|
37
40
|
def _start_detached(executable, *args, writer=None):
|
38
41
|
# Configure Launch
|
39
42
|
kwargs = {}
|
40
|
-
import platform
|
41
|
-
from subprocess import Popen
|
42
|
-
|
43
43
|
if platform.system() == "Windows":
|
44
44
|
kwargs.update(
|
45
45
|
creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP
|
@@ -58,11 +58,9 @@ def _cleanup():
|
|
58
58
|
import signal
|
59
59
|
|
60
60
|
for pid in REGISTERED:
|
61
|
-
|
61
|
+
with suppress(Exception):
|
62
62
|
logging.getLogger(__name__).debug("cleaning up pid %d " % pid)
|
63
63
|
os.kill(pid, signal.SIGTERM)
|
64
|
-
except Exception:
|
65
|
-
pass
|
66
64
|
|
67
65
|
|
68
66
|
atexit.register(_cleanup)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
import json
|
3
3
|
import os
|
4
|
+
from contextlib import suppress
|
4
5
|
from selenium.webdriver.chromium.options import ChromiumOptions
|
5
6
|
|
6
7
|
|
@@ -49,7 +50,7 @@ class ChromeOptions(ChromiumOptions):
|
|
49
50
|
undot_prefs, self._undot_key(key, value)
|
50
51
|
)
|
51
52
|
prefs_file = os.path.join(default_path, "Preferences")
|
52
|
-
|
53
|
+
with suppress(Exception):
|
53
54
|
if os.path.exists(prefs_file):
|
54
55
|
with open(
|
55
56
|
prefs_file, encoding="utf-8", mode="r", errors="ignore"
|
@@ -57,13 +58,9 @@ class ChromeOptions(ChromiumOptions):
|
|
57
58
|
undot_prefs = self._merge_nested(
|
58
59
|
json.load(f), undot_prefs
|
59
60
|
)
|
60
|
-
|
61
|
-
pass
|
62
|
-
try:
|
61
|
+
with suppress(Exception):
|
63
62
|
with open(prefs_file, encoding="utf-8", mode="w") as f:
|
64
63
|
json.dump(undot_prefs, f)
|
65
|
-
except Exception:
|
66
|
-
pass
|
67
64
|
# Remove experimental_options to avoid errors
|
68
65
|
del self._experimental_options["prefs"]
|
69
66
|
exclude_switches = self.experimental_options.get("excludeSwitches")
|
@@ -8,6 +8,7 @@ import string
|
|
8
8
|
import sys
|
9
9
|
import time
|
10
10
|
import zipfile
|
11
|
+
from contextlib import suppress
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
13
14
|
IS_POSIX = sys.platform.startswith(("darwin", "cygwin", "linux"))
|
@@ -53,10 +54,8 @@ class Patcher(object):
|
|
53
54
|
self.executable_path = None
|
54
55
|
prefix = "undetected"
|
55
56
|
if not os.path.exists(self.data_path):
|
56
|
-
|
57
|
+
with suppress(Exception):
|
57
58
|
os.makedirs(self.data_path, exist_ok=True)
|
58
|
-
except Exception:
|
59
|
-
pass
|
60
59
|
if not executable_path:
|
61
60
|
self.executable_path = os.path.join(
|
62
61
|
self.data_path, "_".join([prefix, self.exe_name])
|
@@ -1,18 +1,20 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.31.0
|
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
|
7
7
|
Author-email: mdmintz@gmail.com
|
8
8
|
Maintainer: Michael Mintz
|
9
9
|
License: MIT
|
10
|
+
Project-URL: Homepage, https://github.com/seleniumbase/SeleniumBase
|
10
11
|
Project-URL: Changelog, https://github.com/seleniumbase/SeleniumBase/releases
|
11
12
|
Project-URL: Download, https://pypi.org/project/seleniumbase/#files
|
12
|
-
Project-URL: Gitter, https://gitter.im/seleniumbase/SeleniumBase
|
13
13
|
Project-URL: Blog, https://seleniumbase.com/
|
14
|
+
Project-URL: Discord, https://discord.gg/EdhQTn3EyE
|
14
15
|
Project-URL: PyPI, https://pypi.org/project/seleniumbase/
|
15
16
|
Project-URL: Source, https://github.com/seleniumbase/SeleniumBase
|
17
|
+
Project-URL: Repository, https://github.com/seleniumbase/SeleniumBase
|
16
18
|
Project-URL: Documentation, https://seleniumbase.io/
|
17
19
|
Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,crawling,scraping
|
18
20
|
Platform: Windows
|
@@ -32,7 +34,6 @@ Classifier: Operating System :: Microsoft :: Windows
|
|
32
34
|
Classifier: Operating System :: POSIX :: Linux
|
33
35
|
Classifier: Programming Language :: Python
|
34
36
|
Classifier: Programming Language :: Python :: 3
|
35
|
-
Classifier: Programming Language :: Python :: 3.7
|
36
37
|
Classifier: Programming Language :: Python :: 3.8
|
37
38
|
Classifier: Programming Language :: Python :: 3.9
|
38
39
|
Classifier: Programming Language :: Python :: 3.10
|
@@ -55,142 +56,124 @@ Classifier: Topic :: Software Development :: Testing
|
|
55
56
|
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
56
57
|
Classifier: Topic :: Software Development :: Testing :: Traffic Generation
|
57
58
|
Classifier: Topic :: Utilities
|
58
|
-
Requires-Python: >=3.
|
59
|
+
Requires-Python: >=3.8
|
59
60
|
Description-Content-Type: text/markdown
|
60
61
|
License-File: LICENSE
|
61
|
-
Requires-Dist:
|
62
|
-
Requires-Dist:
|
63
|
-
Requires-Dist:
|
64
|
-
Requires-Dist:
|
65
|
-
Requires-Dist:
|
66
|
-
Requires-Dist:
|
67
|
-
Requires-Dist:
|
68
|
-
Requires-Dist:
|
69
|
-
Requires-Dist:
|
70
|
-
Requires-Dist:
|
71
|
-
Requires-Dist:
|
72
|
-
Requires-Dist:
|
73
|
-
Requires-Dist:
|
74
|
-
Requires-Dist:
|
75
|
-
Requires-Dist:
|
76
|
-
Requires-Dist:
|
77
|
-
Requires-Dist:
|
78
|
-
Requires-Dist:
|
79
|
-
Requires-Dist:
|
80
|
-
Requires-Dist:
|
81
|
-
Requires-Dist:
|
82
|
-
Requires-Dist:
|
83
|
-
Requires-Dist:
|
84
|
-
Requires-Dist:
|
85
|
-
Requires-Dist:
|
86
|
-
Requires-Dist:
|
87
|
-
Requires-Dist:
|
88
|
-
Requires-Dist:
|
89
|
-
Requires-Dist:
|
90
|
-
Requires-Dist:
|
91
|
-
Requires-Dist:
|
92
|
-
Requires-Dist:
|
93
|
-
Requires-Dist:
|
94
|
-
Requires-Dist:
|
95
|
-
Requires-Dist:
|
96
|
-
Requires-Dist:
|
97
|
-
Requires-Dist:
|
98
|
-
Requires-Dist:
|
99
|
-
Requires-Dist:
|
100
|
-
Requires-Dist:
|
101
|
-
Requires-Dist:
|
102
|
-
Requires-Dist:
|
103
|
-
Requires-Dist:
|
104
|
-
Requires-Dist:
|
105
|
-
Requires-Dist:
|
106
|
-
Requires-Dist:
|
107
|
-
Requires-Dist:
|
108
|
-
Requires-Dist:
|
109
|
-
Requires-Dist:
|
110
|
-
Requires-Dist:
|
111
|
-
Requires-Dist:
|
112
|
-
Requires-Dist:
|
113
|
-
Requires-Dist:
|
114
|
-
Requires-Dist:
|
115
|
-
Requires-Dist: setuptools
|
116
|
-
Requires-Dist: urllib3
|
117
|
-
Requires-Dist:
|
118
|
-
Requires-Dist:
|
119
|
-
Requires-Dist: wheel >=0.44.0 ; python_version >= "3.8"
|
120
|
-
Requires-Dist: filelock >=3.16.0 ; python_version >= "3.8"
|
121
|
-
Requires-Dist: platformdirs >=4.3.2 ; python_version >= "3.8"
|
122
|
-
Requires-Dist: typing-extensions >=4.12.2 ; python_version >= "3.8"
|
123
|
-
Requires-Dist: pyyaml >=6.0.2 ; python_version >= "3.8"
|
124
|
-
Requires-Dist: trio ==0.26.2 ; python_version >= "3.8"
|
125
|
-
Requires-Dist: websocket-client ==1.8.0 ; python_version >= "3.8"
|
126
|
-
Requires-Dist: selenium ==4.24.0 ; python_version >= "3.8"
|
127
|
-
Requires-Dist: execnet ==2.1.1 ; python_version >= "3.8"
|
128
|
-
Requires-Dist: pluggy ==1.5.0 ; python_version >= "3.8"
|
129
|
-
Requires-Dist: pytest ==8.3.3 ; python_version >= "3.8"
|
130
|
-
Requires-Dist: pytest-metadata ==3.1.1 ; python_version >= "3.8"
|
131
|
-
Requires-Dist: pytest-rerunfailures ==14.0 ; python_version >= "3.8"
|
132
|
-
Requires-Dist: pytest-xdist ==3.6.1 ; python_version >= "3.8"
|
133
|
-
Requires-Dist: soupsieve ==2.6 ; python_version >= "3.8"
|
134
|
-
Requires-Dist: pygments ==2.18.0 ; python_version >= "3.8"
|
135
|
-
Requires-Dist: markdown-it-py ==3.0.0 ; python_version >= "3.8"
|
136
|
-
Requires-Dist: setuptools ~=70.2 ; python_version >= "3.8" and python_version < "3.10"
|
62
|
+
Requires-Dist: pip>=24.1.2
|
63
|
+
Requires-Dist: packaging>=24.1
|
64
|
+
Requires-Dist: wheel>=0.44.0
|
65
|
+
Requires-Dist: attrs>=24.2.0
|
66
|
+
Requires-Dist: certifi>=2024.8.30
|
67
|
+
Requires-Dist: exceptiongroup>=1.2.2
|
68
|
+
Requires-Dist: filelock>=3.16.1
|
69
|
+
Requires-Dist: fasteners>=0.19
|
70
|
+
Requires-Dist: pynose>=1.5.3
|
71
|
+
Requires-Dist: platformdirs>=4.3.6
|
72
|
+
Requires-Dist: typing-extensions>=4.12.2
|
73
|
+
Requires-Dist: sbvirtualdisplay>=1.3.0
|
74
|
+
Requires-Dist: six>=1.16.0
|
75
|
+
Requires-Dist: parse>=1.20.2
|
76
|
+
Requires-Dist: parse-type>=0.6.3
|
77
|
+
Requires-Dist: colorama>=0.4.6
|
78
|
+
Requires-Dist: pyyaml>=6.0.2
|
79
|
+
Requires-Dist: pygments>=2.18.0
|
80
|
+
Requires-Dist: tabcompleter>=1.3.3
|
81
|
+
Requires-Dist: pdbp>=1.5.4
|
82
|
+
Requires-Dist: idna==3.10
|
83
|
+
Requires-Dist: chardet==5.2.0
|
84
|
+
Requires-Dist: charset-normalizer==3.3.2
|
85
|
+
Requires-Dist: requests==2.31.0
|
86
|
+
Requires-Dist: sniffio==1.3.1
|
87
|
+
Requires-Dist: h11==0.14.0
|
88
|
+
Requires-Dist: outcome==1.3.0.post0
|
89
|
+
Requires-Dist: trio==0.26.2
|
90
|
+
Requires-Dist: trio-websocket==0.11.1
|
91
|
+
Requires-Dist: wsproto==1.2.0
|
92
|
+
Requires-Dist: websocket-client==1.8.0
|
93
|
+
Requires-Dist: selenium==4.25.0
|
94
|
+
Requires-Dist: cssselect==1.2.0
|
95
|
+
Requires-Dist: sortedcontainers==2.4.0
|
96
|
+
Requires-Dist: execnet==2.1.1
|
97
|
+
Requires-Dist: iniconfig==2.0.0
|
98
|
+
Requires-Dist: pluggy==1.5.0
|
99
|
+
Requires-Dist: py==1.11.0
|
100
|
+
Requires-Dist: pytest==8.3.3
|
101
|
+
Requires-Dist: pytest-html==2.0.1
|
102
|
+
Requires-Dist: pytest-metadata==3.1.1
|
103
|
+
Requires-Dist: pytest-ordering==0.6
|
104
|
+
Requires-Dist: pytest-rerunfailures==14.0
|
105
|
+
Requires-Dist: pytest-xdist==3.6.1
|
106
|
+
Requires-Dist: parameterized==0.9.0
|
107
|
+
Requires-Dist: behave==1.2.6
|
108
|
+
Requires-Dist: soupsieve==2.6
|
109
|
+
Requires-Dist: beautifulsoup4==4.12.3
|
110
|
+
Requires-Dist: pyotp==2.9.0
|
111
|
+
Requires-Dist: markdown-it-py==3.0.0
|
112
|
+
Requires-Dist: mdurl==0.1.2
|
113
|
+
Requires-Dist: rich==13.8.1
|
114
|
+
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
115
|
+
Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
|
116
|
+
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
117
|
+
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
118
|
+
Requires-Dist: setuptools>=70.2.0; python_version >= "3.10"
|
119
|
+
Requires-Dist: urllib3<2.3.0,>=1.26.20; python_version >= "3.10"
|
137
120
|
Provides-Extra: allure
|
138
|
-
Requires-Dist: allure-pytest
|
139
|
-
Requires-Dist: allure-python-commons
|
140
|
-
Requires-Dist: allure-behave
|
121
|
+
Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
|
122
|
+
Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
123
|
+
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
141
124
|
Provides-Extra: coverage
|
142
|
-
Requires-Dist: coverage
|
143
|
-
Requires-Dist: pytest-cov
|
144
|
-
Requires-Dist: coverage >=7.6.1 ; (python_version >= "3.8") and extra == 'coverage'
|
145
|
-
Requires-Dist: pytest-cov >=5.0.0 ; (python_version >= "3.8") and extra == 'coverage'
|
125
|
+
Requires-Dist: coverage>=7.6.1; extra == "coverage"
|
126
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "coverage"
|
146
127
|
Provides-Extra: flake8
|
147
|
-
Requires-Dist: mccabe
|
148
|
-
Requires-Dist: flake8
|
149
|
-
Requires-Dist: pyflakes
|
150
|
-
Requires-Dist: pycodestyle
|
151
|
-
Requires-Dist: flake8
|
152
|
-
Requires-Dist: pyflakes
|
153
|
-
Requires-Dist: pycodestyle
|
128
|
+
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
129
|
+
Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
|
130
|
+
Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
|
131
|
+
Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
|
132
|
+
Requires-Dist: flake8==7.1.1; python_version >= "3.9" and extra == "flake8"
|
133
|
+
Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
|
134
|
+
Requires-Dist: pycodestyle==2.12.1; python_version >= "3.9" and extra == "flake8"
|
154
135
|
Provides-Extra: ipdb
|
155
|
-
Requires-Dist: ipdb
|
156
|
-
Requires-Dist: ipython
|
136
|
+
Requires-Dist: ipdb==0.13.13; extra == "ipdb"
|
137
|
+
Requires-Dist: ipython==7.34.0; extra == "ipdb"
|
157
138
|
Provides-Extra: pdfminer
|
158
|
-
Requires-Dist:
|
159
|
-
Requires-Dist:
|
160
|
-
Requires-Dist:
|
161
|
-
Requires-Dist: cryptography
|
162
|
-
Requires-Dist:
|
163
|
-
Requires-Dist: cffi ==1.17.1 ; (python_version >= "3.8") and extra == 'pdfminer'
|
164
|
-
Requires-Dist: cryptography ==43.0.1 ; (python_version >= "3.9") and extra == 'pdfminer'
|
139
|
+
Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
|
140
|
+
Requires-Dist: cffi==1.17.1; extra == "pdfminer"
|
141
|
+
Requires-Dist: pycparser==2.22; extra == "pdfminer"
|
142
|
+
Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
|
143
|
+
Requires-Dist: cryptography==43.0.1; python_version >= "3.9" and extra == "pdfminer"
|
165
144
|
Provides-Extra: pillow
|
166
|
-
Requires-Dist: Pillow
|
167
|
-
Requires-Dist: Pillow >=10.4.0 ; (python_version >= "3.8") and extra == 'pillow'
|
145
|
+
Requires-Dist: Pillow>=10.4.0; extra == "pillow"
|
168
146
|
Provides-Extra: pip-system-certs
|
169
|
-
Requires-Dist: pip-system-certs
|
147
|
+
Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
|
170
148
|
Provides-Extra: proxy
|
171
|
-
Requires-Dist: proxy.py
|
149
|
+
Requires-Dist: proxy.py==2.4.3; extra == "proxy"
|
172
150
|
Provides-Extra: psutil
|
173
|
-
Requires-Dist: psutil
|
151
|
+
Requires-Dist: psutil==6.0.0; extra == "psutil"
|
174
152
|
Provides-Extra: pyautogui
|
175
|
-
Requires-Dist: PyAutoGUI
|
153
|
+
Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
|
176
154
|
Provides-Extra: selenium-stealth
|
177
|
-
Requires-Dist: selenium-stealth
|
155
|
+
Requires-Dist: selenium-stealth==1.0.6; extra == "selenium-stealth"
|
178
156
|
Provides-Extra: selenium-wire
|
179
|
-
Requires-Dist: selenium-wire
|
180
|
-
Requires-Dist: pyOpenSSL
|
181
|
-
Requires-Dist: pyparsing
|
182
|
-
Requires-Dist: Brotli
|
183
|
-
Requires-Dist: blinker
|
184
|
-
Requires-Dist: h2
|
185
|
-
Requires-Dist: hpack
|
186
|
-
Requires-Dist: hyperframe
|
187
|
-
Requires-Dist: kaitaistruct
|
188
|
-
Requires-Dist:
|
189
|
-
Requires-Dist:
|
190
|
-
Requires-Dist: pyasn1 ==0.6.1 ; (python_version >= "3.8") and extra == 'selenium-wire'
|
157
|
+
Requires-Dist: selenium-wire==5.1.0; extra == "selenium-wire"
|
158
|
+
Requires-Dist: pyOpenSSL==24.2.1; extra == "selenium-wire"
|
159
|
+
Requires-Dist: pyparsing>=3.1.4; extra == "selenium-wire"
|
160
|
+
Requires-Dist: Brotli==1.1.0; extra == "selenium-wire"
|
161
|
+
Requires-Dist: blinker==1.7.0; extra == "selenium-wire"
|
162
|
+
Requires-Dist: h2==4.1.0; extra == "selenium-wire"
|
163
|
+
Requires-Dist: hpack==4.0.0; extra == "selenium-wire"
|
164
|
+
Requires-Dist: hyperframe==6.0.1; extra == "selenium-wire"
|
165
|
+
Requires-Dist: kaitaistruct==0.10; extra == "selenium-wire"
|
166
|
+
Requires-Dist: pyasn1==0.6.1; extra == "selenium-wire"
|
167
|
+
Requires-Dist: zstandard==0.23.0; extra == "selenium-wire"
|
191
168
|
|
192
169
|
<!-- SeleniumBase Docs -->
|
193
170
|
|
171
|
+
<meta property="og:site_name" content="SeleniumBase">
|
172
|
+
<meta property="og:title" content="SeleniumBase: Python Web Automation and E2E Testing" />
|
173
|
+
<meta property="og:description" content="Fast, easy, and reliable Web/UI testing with Python." />
|
174
|
+
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots">
|
175
|
+
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
176
|
+
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
194
177
|
|
195
178
|
<h1>SeleniumBase</h1>
|
196
179
|
|
@@ -842,6 +825,7 @@ pytest test_coffee_cart.py --trace
|
|
842
825
|
--headless2 # (Use the new headless mode, which supports extensions.)
|
843
826
|
--headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
|
844
827
|
--xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
|
828
|
+
--xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
|
845
829
|
--locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
|
846
830
|
--interval=SECONDS # (The autoplay interval for presentations & tour steps)
|
847
831
|
--start-page=URL # (The starting URL for the web browser when tests begin.)
|
@@ -886,6 +870,7 @@ pytest test_coffee_cart.py --trace
|
|
886
870
|
--rcs | --reuse-class-session # (Reuse session for tests in class.)
|
887
871
|
--crumbs # (Delete all cookies between tests reusing a session.)
|
888
872
|
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
|
873
|
+
--window-position=X,Y # (Set the browser's starting window position.)
|
889
874
|
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
|
890
875
|
--maximize # (Start tests with the browser window maximized.)
|
891
876
|
--screenshot # (Save a screenshot at the end of each test.)
|
@@ -1054,7 +1039,7 @@ pytest test_suite.py --dashboard --html=report.html
|
|
1054
1039
|
|
1055
1040
|
<img src="https://seleniumbase.github.io/cdn/img/dash_report.jpg" alt="Dashboard Pytest HTML Report" title="Dashboard Pytest HTML Report" width="520" />
|
1056
1041
|
|
1057
|
-
If viewing pytest html reports in [Jenkins](https://www.jenkins.io/), you may need to [configure Jenkins settings](https://stackoverflow.com/a/46197356) for the html to render correctly. This is due to [Jenkins CSP changes](https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/).
|
1042
|
+
If viewing pytest html reports in [Jenkins](https://www.jenkins.io/), you may need to [configure Jenkins settings](https://stackoverflow.com/a/46197356/7058266) for the html to render correctly. This is due to [Jenkins CSP changes](https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/).
|
1058
1043
|
|
1059
1044
|
You can also use ``--junit-xml=report.xml`` to get an xml report instead. Jenkins can use this file to display better reporting for your tests.
|
1060
1045
|
|