seleniumbase 4.30.8__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.
Files changed (45) hide show
  1. sbase/__init__.py +1 -0
  2. seleniumbase/__init__.py +2 -3
  3. seleniumbase/__version__.py +1 -1
  4. seleniumbase/behave/behave_sb.py +47 -9
  5. seleniumbase/config/settings.py +4 -0
  6. seleniumbase/console_scripts/sb_behave_gui.py +5 -5
  7. seleniumbase/console_scripts/sb_caseplans.py +6 -6
  8. seleniumbase/console_scripts/sb_commander.py +5 -5
  9. seleniumbase/console_scripts/sb_install.py +10 -2
  10. seleniumbase/console_scripts/sb_recorder.py +4 -4
  11. seleniumbase/core/browser_launcher.py +138 -103
  12. seleniumbase/core/mysql.py +1 -4
  13. seleniumbase/core/recorder_helper.py +24 -5
  14. seleniumbase/core/sb_driver.py +2 -3
  15. seleniumbase/core/settings_parser.py +4 -0
  16. seleniumbase/fixtures/base_case.py +307 -492
  17. seleniumbase/fixtures/js_utils.py +19 -52
  18. seleniumbase/fixtures/page_actions.py +3 -6
  19. seleniumbase/fixtures/page_utils.py +20 -58
  20. seleniumbase/plugins/base_plugin.py +2 -3
  21. seleniumbase/plugins/driver_manager.py +169 -3
  22. seleniumbase/plugins/pytest_plugin.py +34 -21
  23. seleniumbase/plugins/sb_manager.py +170 -3
  24. seleniumbase/plugins/selenium_plugin.py +52 -6
  25. seleniumbase/undetected/__init__.py +13 -38
  26. seleniumbase/undetected/dprocess.py +4 -6
  27. seleniumbase/undetected/options.py +3 -6
  28. seleniumbase/undetected/patcher.py +2 -3
  29. {seleniumbase-4.30.8.dist-info → seleniumbase-4.31.0.dist-info}/METADATA +108 -123
  30. {seleniumbase-4.30.8.dist-info → seleniumbase-4.31.0.dist-info}/RECORD +34 -45
  31. {seleniumbase-4.30.8.dist-info → seleniumbase-4.31.0.dist-info}/WHEEL +1 -1
  32. sbase/ReadMe.txt +0 -2
  33. seleniumbase/ReadMe.md +0 -25
  34. seleniumbase/common/ReadMe.md +0 -71
  35. seleniumbase/console_scripts/ReadMe.md +0 -734
  36. seleniumbase/drivers/ReadMe.md +0 -27
  37. seleniumbase/extensions/ReadMe.md +0 -12
  38. seleniumbase/masterqa/ReadMe.md +0 -61
  39. seleniumbase/resources/ReadMe.md +0 -31
  40. seleniumbase/resources/favicon.ico +0 -0
  41. seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
  42. seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
  43. {seleniumbase-4.30.8.dist-info → seleniumbase-4.31.0.dist-info}/LICENSE +0 -0
  44. {seleniumbase-4.30.8.dist-info → seleniumbase-4.31.0.dist-info}/entry_points.txt +0 -0
  45. {seleniumbase-4.30.8.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
- try:
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
- try:
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
- try:
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
- try:
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
- try:
431
+ with suppress(Exception):
441
432
  self.service.start()
442
- except Exception:
443
- pass
444
433
  time.sleep(0.012)
445
- try:
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
- try:
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
- try:
450
+ with suppress(Exception):
466
451
  self.service.start()
467
- except Exception:
468
- pass
469
452
  time.sleep(0.012)
470
- try:
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
- try:
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
- try:
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
- except Exception:
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
- try:
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
- try:
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
- except Exception:
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
- try:
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.30.8
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.7
59
+ Requires-Python: >=3.8
59
60
  Description-Content-Type: text/markdown
60
61
  License-File: LICENSE
61
- Requires-Dist: attrs >=24.2.0
62
- Requires-Dist: certifi >=2024.8.30
63
- Requires-Dist: exceptiongroup >=1.2.2
64
- Requires-Dist: parse >=1.20.2
65
- Requires-Dist: parse-type >=0.6.3
66
- Requires-Dist: six ==1.16.0
67
- Requires-Dist: idna ==3.8
68
- Requires-Dist: chardet ==5.2.0
69
- Requires-Dist: charset-normalizer ==3.3.2
70
- Requires-Dist: requests ==2.31.0
71
- Requires-Dist: pynose ==1.5.2
72
- Requires-Dist: sniffio ==1.3.1
73
- Requires-Dist: h11 ==0.14.0
74
- Requires-Dist: outcome ==1.3.0.post0
75
- Requires-Dist: trio-websocket ==0.11.1
76
- Requires-Dist: wsproto ==1.2.0
77
- Requires-Dist: cssselect ==1.2.0
78
- Requires-Dist: sortedcontainers ==2.4.0
79
- Requires-Dist: fasteners ==0.19
80
- Requires-Dist: iniconfig ==2.0.0
81
- Requires-Dist: py ==1.11.0
82
- Requires-Dist: pytest-html ==2.0.1
83
- Requires-Dist: pytest-ordering ==0.6
84
- Requires-Dist: parameterized ==0.9.0
85
- Requires-Dist: sbvirtualdisplay ==1.3.0
86
- Requires-Dist: behave ==1.2.6
87
- Requires-Dist: beautifulsoup4 ==4.12.3
88
- Requires-Dist: tabcompleter ==1.3.3
89
- Requires-Dist: pdbp ==1.5.4
90
- Requires-Dist: colorama ==0.4.6
91
- Requires-Dist: pyotp ==2.9.0
92
- Requires-Dist: mdurl ==0.1.2
93
- Requires-Dist: rich ==13.8.1
94
- Requires-Dist: python-xlib ==0.33 ; platform_system == "Linux"
95
- Requires-Dist: pyreadline3 ==3.4.1 ; platform_system == "Windows"
96
- Requires-Dist: urllib3 <2,>=1.26.20 ; python_version < "3.10"
97
- Requires-Dist: pip >=24.0 ; python_version < "3.8"
98
- Requires-Dist: packaging >=24.0 ; python_version < "3.8"
99
- Requires-Dist: setuptools >=68.0.0 ; python_version < "3.8"
100
- Requires-Dist: wheel >=0.42.0 ; python_version < "3.8"
101
- Requires-Dist: filelock >=3.12.2 ; python_version < "3.8"
102
- Requires-Dist: platformdirs >=4.0.0 ; python_version < "3.8"
103
- Requires-Dist: pyyaml ==6.0.1 ; python_version < "3.8"
104
- Requires-Dist: trio ==0.22.2 ; python_version < "3.8"
105
- Requires-Dist: selenium ==4.11.2 ; python_version < "3.8"
106
- Requires-Dist: execnet ==2.0.2 ; python_version < "3.8"
107
- Requires-Dist: pluggy ==1.2.0 ; python_version < "3.8"
108
- Requires-Dist: pytest ==7.4.4 ; python_version < "3.8"
109
- Requires-Dist: pytest-metadata ==3.0.0 ; python_version < "3.8"
110
- Requires-Dist: pytest-rerunfailures ==13.0 ; python_version < "3.8"
111
- Requires-Dist: pytest-xdist ==3.5.0 ; python_version < "3.8"
112
- Requires-Dist: soupsieve ==2.4.1 ; python_version < "3.8"
113
- Requires-Dist: pygments ==2.17.2 ; python_version < "3.8"
114
- Requires-Dist: markdown-it-py ==2.2.0 ; python_version < "3.8"
115
- Requires-Dist: setuptools >=70.2.0 ; python_version >= "3.10"
116
- Requires-Dist: urllib3 <2.3.0,>=1.26.20 ; python_version >= "3.10"
117
- Requires-Dist: pip >=24.1.2 ; python_version >= "3.8"
118
- Requires-Dist: packaging >=24.1 ; python_version >= "3.8"
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 >=2.13.5 ; extra == 'allure'
139
- Requires-Dist: allure-python-commons >=2.13.5 ; extra == 'allure'
140
- Requires-Dist: allure-behave >=2.13.5 ; extra == 'allure'
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 ==7.2.7 ; (python_version < "3.8") and extra == 'coverage'
143
- Requires-Dist: pytest-cov ==4.1.0 ; (python_version < "3.8") and extra == 'coverage'
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 ==0.7.0 ; extra == 'flake8'
148
- Requires-Dist: flake8 ==5.0.4 ; (python_version < "3.9") and extra == 'flake8'
149
- Requires-Dist: pyflakes ==2.5.0 ; (python_version < "3.9") and extra == 'flake8'
150
- Requires-Dist: pycodestyle ==2.9.1 ; (python_version < "3.9") and extra == 'flake8'
151
- Requires-Dist: flake8 ==7.1.1 ; (python_version >= "3.9") and extra == 'flake8'
152
- Requires-Dist: pyflakes ==3.2.0 ; (python_version >= "3.9") and extra == 'flake8'
153
- Requires-Dist: pycodestyle ==2.12.1 ; (python_version >= "3.9") and extra == 'flake8'
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 ==0.13.13 ; extra == 'ipdb'
156
- Requires-Dist: ipython ==7.34.0 ; extra == 'ipdb'
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: pycparser ==2.22 ; extra == 'pdfminer'
159
- Requires-Dist: pdfminer.six ==20221105 ; (python_version < "3.8") and extra == 'pdfminer'
160
- Requires-Dist: cffi ==1.15.1 ; (python_version < "3.8") and extra == 'pdfminer'
161
- Requires-Dist: cryptography ==39.0.2 ; (python_version < "3.9") and extra == 'pdfminer'
162
- Requires-Dist: pdfminer.six ==20240706 ; (python_version >= "3.8") and extra == 'pdfminer'
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 ==9.5.0 ; (python_version < "3.8") and extra == '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 ==4.0 ; (platform_system == "Windows") and extra == '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 ==2.4.3 ; extra == 'proxy'
149
+ Requires-Dist: proxy.py==2.4.3; extra == "proxy"
172
150
  Provides-Extra: psutil
173
- Requires-Dist: psutil ==6.0.0 ; extra == 'psutil'
151
+ Requires-Dist: psutil==6.0.0; extra == "psutil"
174
152
  Provides-Extra: pyautogui
175
- Requires-Dist: PyAutoGUI ==0.9.54 ; extra == 'pyautogui'
153
+ Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
176
154
  Provides-Extra: selenium-stealth
177
- Requires-Dist: selenium-stealth ==1.0.6 ; extra == 'selenium-stealth'
155
+ Requires-Dist: selenium-stealth==1.0.6; extra == "selenium-stealth"
178
156
  Provides-Extra: selenium-wire
179
- Requires-Dist: selenium-wire ==5.1.0 ; extra == 'selenium-wire'
180
- Requires-Dist: pyOpenSSL ==24.2.1 ; extra == 'selenium-wire'
181
- Requires-Dist: pyparsing >=3.1.4 ; extra == 'selenium-wire'
182
- Requires-Dist: Brotli ==1.1.0 ; extra == 'selenium-wire'
183
- Requires-Dist: blinker ==1.7.0 ; extra == 'selenium-wire'
184
- Requires-Dist: h2 ==4.1.0 ; extra == 'selenium-wire'
185
- Requires-Dist: hpack ==4.0.0 ; extra == 'selenium-wire'
186
- Requires-Dist: hyperframe ==6.0.1 ; extra == 'selenium-wire'
187
- Requires-Dist: kaitaistruct ==0.10 ; extra == 'selenium-wire'
188
- Requires-Dist: zstandard ==0.23.0 ; extra == 'selenium-wire'
189
- Requires-Dist: pyasn1 ==0.5.1 ; (python_version < "3.8") and extra == 'selenium-wire'
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