seleniumbase 4.24.10__py3-none-any.whl → 4.33.15__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 (79) hide show
  1. sbase/__init__.py +1 -0
  2. sbase/steps.py +7 -0
  3. seleniumbase/__init__.py +16 -7
  4. seleniumbase/__version__.py +1 -1
  5. seleniumbase/behave/behave_sb.py +97 -32
  6. seleniumbase/common/decorators.py +16 -7
  7. seleniumbase/config/proxy_list.py +3 -3
  8. seleniumbase/config/settings.py +4 -0
  9. seleniumbase/console_scripts/logo_helper.py +47 -8
  10. seleniumbase/console_scripts/run.py +345 -335
  11. seleniumbase/console_scripts/sb_behave_gui.py +5 -12
  12. seleniumbase/console_scripts/sb_caseplans.py +6 -13
  13. seleniumbase/console_scripts/sb_commander.py +5 -12
  14. seleniumbase/console_scripts/sb_install.py +62 -54
  15. seleniumbase/console_scripts/sb_mkchart.py +13 -20
  16. seleniumbase/console_scripts/sb_mkdir.py +11 -17
  17. seleniumbase/console_scripts/sb_mkfile.py +69 -43
  18. seleniumbase/console_scripts/sb_mkpres.py +13 -20
  19. seleniumbase/console_scripts/sb_mkrec.py +88 -21
  20. seleniumbase/console_scripts/sb_objectify.py +30 -30
  21. seleniumbase/console_scripts/sb_print.py +5 -12
  22. seleniumbase/console_scripts/sb_recorder.py +16 -11
  23. seleniumbase/core/browser_launcher.py +1658 -221
  24. seleniumbase/core/detect_b_ver.py +7 -8
  25. seleniumbase/core/log_helper.py +42 -27
  26. seleniumbase/core/mysql.py +1 -4
  27. seleniumbase/core/proxy_helper.py +35 -30
  28. seleniumbase/core/recorder_helper.py +24 -5
  29. seleniumbase/core/sb_cdp.py +1951 -0
  30. seleniumbase/core/sb_driver.py +162 -8
  31. seleniumbase/core/settings_parser.py +6 -0
  32. seleniumbase/core/style_sheet.py +10 -0
  33. seleniumbase/extensions/recorder.zip +0 -0
  34. seleniumbase/fixtures/base_case.py +1234 -632
  35. seleniumbase/fixtures/constants.py +10 -1
  36. seleniumbase/fixtures/js_utils.py +171 -144
  37. seleniumbase/fixtures/page_actions.py +177 -13
  38. seleniumbase/fixtures/page_utils.py +25 -53
  39. seleniumbase/fixtures/shared_utils.py +97 -11
  40. seleniumbase/js_code/active_css_js.py +1 -1
  41. seleniumbase/js_code/recorder_js.py +1 -1
  42. seleniumbase/plugins/base_plugin.py +2 -3
  43. seleniumbase/plugins/driver_manager.py +340 -65
  44. seleniumbase/plugins/pytest_plugin.py +276 -47
  45. seleniumbase/plugins/sb_manager.py +412 -99
  46. seleniumbase/plugins/selenium_plugin.py +122 -17
  47. seleniumbase/translate/translator.py +0 -7
  48. seleniumbase/undetected/__init__.py +59 -52
  49. seleniumbase/undetected/cdp.py +0 -1
  50. seleniumbase/undetected/cdp_driver/__init__.py +1 -0
  51. seleniumbase/undetected/cdp_driver/_contradict.py +110 -0
  52. seleniumbase/undetected/cdp_driver/browser.py +829 -0
  53. seleniumbase/undetected/cdp_driver/cdp_util.py +458 -0
  54. seleniumbase/undetected/cdp_driver/config.py +334 -0
  55. seleniumbase/undetected/cdp_driver/connection.py +639 -0
  56. seleniumbase/undetected/cdp_driver/element.py +1168 -0
  57. seleniumbase/undetected/cdp_driver/tab.py +1323 -0
  58. seleniumbase/undetected/dprocess.py +4 -7
  59. seleniumbase/undetected/options.py +6 -8
  60. seleniumbase/undetected/patcher.py +11 -13
  61. seleniumbase/undetected/reactor.py +0 -1
  62. seleniumbase/undetected/webelement.py +16 -3
  63. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/LICENSE +1 -1
  64. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/METADATA +299 -252
  65. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/RECORD +68 -70
  66. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/WHEEL +1 -1
  67. sbase/ReadMe.txt +0 -2
  68. seleniumbase/ReadMe.md +0 -25
  69. seleniumbase/common/ReadMe.md +0 -71
  70. seleniumbase/console_scripts/ReadMe.md +0 -731
  71. seleniumbase/drivers/ReadMe.md +0 -27
  72. seleniumbase/extensions/ReadMe.md +0 -12
  73. seleniumbase/masterqa/ReadMe.md +0 -61
  74. seleniumbase/resources/ReadMe.md +0 -31
  75. seleniumbase/resources/favicon.ico +0 -0
  76. seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
  77. seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
  78. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/entry_points.txt +0 -0
  79. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,20 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.24.10
3
+ Version: 4.33.15
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,161 +56,185 @@ 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: pip >=24.0
62
- Requires-Dist: packaging >=24.0
63
- Requires-Dist: attrs >=23.2.0
64
- Requires-Dist: certifi >=2024.2.2
65
- Requires-Dist: parse >=1.20.1
66
- Requires-Dist: parse-type >=0.6.2
67
- Requires-Dist: pyyaml >=6.0.1
68
- Requires-Dist: six ==1.16.0
69
- Requires-Dist: idna ==3.6
70
- Requires-Dist: chardet ==5.2.0
71
- Requires-Dist: charset-normalizer ==3.3.2
72
- Requires-Dist: requests ==2.31.0
73
- Requires-Dist: pynose ==1.5.0
74
- Requires-Dist: sniffio ==1.3.1
75
- Requires-Dist: h11 ==0.14.0
76
- Requires-Dist: outcome ==1.3.0.post0
77
- Requires-Dist: trio-websocket ==0.11.1
78
- Requires-Dist: wsproto ==1.2.0
79
- Requires-Dist: cssselect ==1.2.0
80
- Requires-Dist: sortedcontainers ==2.4.0
81
- Requires-Dist: fasteners ==0.19
82
- Requires-Dist: execnet ==2.0.2
83
- Requires-Dist: iniconfig ==2.0.0
84
- Requires-Dist: py ==1.11.0
85
- Requires-Dist: pytest-html ==2.0.1
86
- Requires-Dist: pytest-ordering ==0.6
87
- Requires-Dist: pytest-xdist ==3.5.0
88
- Requires-Dist: parameterized ==0.9.0
89
- Requires-Dist: sbvirtualdisplay ==1.3.0
90
- Requires-Dist: behave ==1.2.6
91
- Requires-Dist: beautifulsoup4 ==4.12.3
92
- Requires-Dist: pygments ==2.17.2
93
- Requires-Dist: tabcompleter ==1.3.0
94
- Requires-Dist: pdbp ==1.5.0
95
- Requires-Dist: colorama ==0.4.6
96
- Requires-Dist: exceptiongroup ==1.2.0
97
- Requires-Dist: pyotp ==2.9.0
98
- Requires-Dist: mdurl ==0.1.2
99
- Requires-Dist: rich ==13.7.1
100
- Requires-Dist: pyreadline3 ==3.4.1 ; platform_system == "Windows"
101
- Requires-Dist: urllib3 <2,>=1.26.18 ; python_version < "3.10"
102
- Requires-Dist: setuptools >=68.0.0 ; python_version < "3.8"
103
- Requires-Dist: wheel >=0.42.0 ; python_version < "3.8"
104
- Requires-Dist: filelock >=3.12.2 ; python_version < "3.8"
105
- Requires-Dist: platformdirs >=4.0.0 ; python_version < "3.8"
106
- Requires-Dist: trio ==0.22.2 ; python_version < "3.8"
107
- Requires-Dist: selenium ==4.11.2 ; python_version < "3.8"
108
- Requires-Dist: pluggy ==1.2.0 ; python_version < "3.8"
109
- Requires-Dist: pytest ==7.4.4 ; python_version < "3.8"
110
- Requires-Dist: pytest-metadata ==3.0.0 ; python_version < "3.8"
111
- Requires-Dist: pytest-rerunfailures ==13.0 ; python_version < "3.8"
112
- Requires-Dist: soupsieve ==2.4.1 ; python_version < "3.8"
113
- Requires-Dist: markdown-it-py ==2.2.0 ; python_version < "3.8"
114
- Requires-Dist: urllib3 <2.3.0,>=1.26.18 ; python_version >= "3.10"
115
- Requires-Dist: setuptools >=69.2.0 ; python_version >= "3.8"
116
- Requires-Dist: wheel >=0.43.0 ; python_version >= "3.8"
117
- Requires-Dist: filelock >=3.13.1 ; python_version >= "3.8"
118
- Requires-Dist: platformdirs >=4.2.0 ; python_version >= "3.8"
119
- Requires-Dist: typing-extensions >=4.10.0 ; python_version >= "3.8"
120
- Requires-Dist: trio ==0.24.0 ; python_version >= "3.8"
121
- Requires-Dist: selenium ==4.18.1 ; python_version >= "3.8"
122
- Requires-Dist: pluggy ==1.4.0 ; python_version >= "3.8"
123
- Requires-Dist: pytest ==8.1.1 ; python_version >= "3.8"
124
- Requires-Dist: pytest-metadata ==3.1.1 ; python_version >= "3.8"
125
- Requires-Dist: pytest-rerunfailures ==14.0 ; python_version >= "3.8"
126
- Requires-Dist: soupsieve ==2.5 ; python_version >= "3.8"
127
- Requires-Dist: markdown-it-py ==3.0.0 ; python_version >= "3.8"
62
+ Requires-Dist: pip>=24.3.1
63
+ Requires-Dist: packaging>=24.2
64
+ Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
+ Requires-Dist: setuptools>=75.8.0; python_version >= "3.10"
66
+ Requires-Dist: wheel>=0.45.1
67
+ Requires-Dist: attrs>=24.3.0
68
+ Requires-Dist: certifi>=2024.12.14
69
+ Requires-Dist: exceptiongroup>=1.2.2
70
+ Requires-Dist: websockets~=13.1; python_version < "3.9"
71
+ Requires-Dist: websockets>=14.1; python_version >= "3.9"
72
+ Requires-Dist: filelock>=3.16.1
73
+ Requires-Dist: fasteners>=0.19
74
+ Requires-Dist: mycdp>=1.1.0
75
+ Requires-Dist: pynose>=1.5.3
76
+ Requires-Dist: platformdirs>=4.3.6
77
+ Requires-Dist: typing-extensions>=4.12.2
78
+ Requires-Dist: sbvirtualdisplay>=1.4.0
79
+ Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
80
+ Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
81
+ Requires-Dist: Jinja2>=3.1.5
82
+ Requires-Dist: six>=1.17.0
83
+ Requires-Dist: parse>=1.20.2
84
+ Requires-Dist: parse-type>=0.6.4
85
+ Requires-Dist: colorama>=0.4.6
86
+ Requires-Dist: pyyaml>=6.0.2
87
+ Requires-Dist: pygments>=2.19.1
88
+ Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
89
+ Requires-Dist: tabcompleter>=1.4.0
90
+ Requires-Dist: pdbp>=1.6.1
91
+ Requires-Dist: idna==3.10
92
+ Requires-Dist: chardet==5.2.0
93
+ Requires-Dist: charset-normalizer==3.4.1
94
+ Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
95
+ Requires-Dist: urllib3<2.4.0,>=1.26.20; python_version >= "3.10"
96
+ Requires-Dist: requests==2.32.3
97
+ Requires-Dist: sniffio==1.3.1
98
+ Requires-Dist: h11==0.14.0
99
+ Requires-Dist: outcome==1.3.0.post0
100
+ Requires-Dist: trio==0.27.0; python_version < "3.9"
101
+ Requires-Dist: trio==0.28.0; python_version >= "3.9"
102
+ Requires-Dist: trio-websocket==0.11.1
103
+ Requires-Dist: wsproto==1.2.0
104
+ Requires-Dist: websocket-client==1.8.0
105
+ Requires-Dist: selenium==4.27.1
106
+ Requires-Dist: cssselect==1.2.0
107
+ Requires-Dist: sortedcontainers==2.4.0
108
+ Requires-Dist: execnet==2.1.1
109
+ Requires-Dist: iniconfig==2.0.0
110
+ Requires-Dist: pluggy==1.5.0
111
+ Requires-Dist: pytest==8.3.4
112
+ Requires-Dist: pytest-html==4.0.2
113
+ Requires-Dist: pytest-metadata==3.1.1
114
+ Requires-Dist: pytest-ordering==0.6
115
+ Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
116
+ Requires-Dist: pytest-rerunfailures==15.0; python_version >= "3.9"
117
+ Requires-Dist: pytest-xdist==3.6.1
118
+ Requires-Dist: parameterized==0.9.0
119
+ Requires-Dist: behave==1.2.6
120
+ Requires-Dist: soupsieve==2.6
121
+ Requires-Dist: beautifulsoup4==4.12.3
122
+ Requires-Dist: pyotp==2.9.0
123
+ Requires-Dist: python-xlib==0.33; platform_system == "Linux"
124
+ Requires-Dist: markdown-it-py==3.0.0
125
+ Requires-Dist: mdurl==0.1.2
126
+ Requires-Dist: rich==13.9.4
128
127
  Provides-Extra: allure
129
- Requires-Dist: allure-pytest ==2.13.3 ; extra == 'allure'
130
- Requires-Dist: allure-python-commons ==2.13.3 ; extra == 'allure'
131
- Requires-Dist: allure-behave ==2.13.3 ; extra == 'allure'
128
+ Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
129
+ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
130
+ Requires-Dist: allure-behave>=2.13.5; extra == "allure"
132
131
  Provides-Extra: coverage
133
- Requires-Dist: pytest-cov ==4.1.0 ; extra == 'coverage'
134
- Requires-Dist: coverage ==7.2.7 ; (python_version < "3.8") and extra == 'coverage'
135
- Requires-Dist: coverage ==7.4.4 ; (python_version >= "3.8") and extra == 'coverage'
132
+ Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
133
+ Requires-Dist: coverage>=7.6.10; python_version >= "3.9" and extra == "coverage"
134
+ Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
135
+ Requires-Dist: pytest-cov>=6.0.0; python_version >= "3.9" and extra == "coverage"
136
136
  Provides-Extra: flake8
137
- Requires-Dist: mccabe ==0.7.0 ; extra == 'flake8'
138
- Requires-Dist: flake8 ==5.0.4 ; (python_version < "3.9") and extra == 'flake8'
139
- Requires-Dist: pyflakes ==2.5.0 ; (python_version < "3.9") and extra == 'flake8'
140
- Requires-Dist: pycodestyle ==2.9.1 ; (python_version < "3.9") and extra == 'flake8'
141
- Requires-Dist: flake8 ==7.0.0 ; (python_version >= "3.9") and extra == 'flake8'
142
- Requires-Dist: pyflakes ==3.2.0 ; (python_version >= "3.9") and extra == 'flake8'
143
- Requires-Dist: pycodestyle ==2.11.1 ; (python_version >= "3.9") and extra == 'flake8'
137
+ Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
138
+ Requires-Dist: flake8==7.1.1; python_version >= "3.9" and extra == "flake8"
139
+ Requires-Dist: mccabe==0.7.0; extra == "flake8"
140
+ Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
141
+ Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
142
+ Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
143
+ Requires-Dist: pycodestyle==2.12.1; python_version >= "3.9" and extra == "flake8"
144
144
  Provides-Extra: ipdb
145
- Requires-Dist: ipdb ==0.13.13 ; extra == 'ipdb'
146
- Requires-Dist: ipython ==7.34.0 ; extra == 'ipdb'
145
+ Requires-Dist: ipdb==0.13.13; extra == "ipdb"
146
+ Requires-Dist: ipython==7.34.0; extra == "ipdb"
147
+ Provides-Extra: mss
148
+ Requires-Dist: mss==9.0.2; extra == "mss"
147
149
  Provides-Extra: pdfminer
148
- Requires-Dist: pycparser ==2.21 ; extra == 'pdfminer'
149
- Requires-Dist: pdfminer.six ==20221105 ; (python_version < "3.8") and extra == 'pdfminer'
150
- Requires-Dist: cffi ==1.15.1 ; (python_version < "3.8") and extra == 'pdfminer'
151
- Requires-Dist: cryptography ==39.0.2 ; (python_version < "3.9") and extra == 'pdfminer'
152
- Requires-Dist: pdfminer.six ==20231228 ; (python_version >= "3.8") and extra == 'pdfminer'
153
- Requires-Dist: cffi ==1.16.0 ; (python_version >= "3.8") and extra == 'pdfminer'
154
- Requires-Dist: cryptography ==42.0.5 ; (python_version >= "3.9") and extra == 'pdfminer'
150
+ Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
151
+ Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
152
+ Requires-Dist: cryptography==44.0.0; python_version >= "3.9" and extra == "pdfminer"
153
+ Requires-Dist: cffi==1.17.1; extra == "pdfminer"
154
+ Requires-Dist: pycparser==2.22; extra == "pdfminer"
155
155
  Provides-Extra: pillow
156
- Requires-Dist: Pillow ==9.5.0 ; (python_version < "3.8") and extra == 'pillow'
157
- Requires-Dist: Pillow ==10.2.0 ; (python_version >= "3.8") and extra == 'pillow'
156
+ Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
157
+ Requires-Dist: Pillow>=11.1.0; python_version >= "3.9" and extra == "pillow"
158
+ Provides-Extra: pip-system-certs
159
+ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
158
160
  Provides-Extra: proxy
159
- Requires-Dist: proxy.py ==2.4.3 ; extra == 'proxy'
161
+ Requires-Dist: proxy.py==2.4.3; extra == "proxy"
160
162
  Provides-Extra: psutil
161
- Requires-Dist: psutil ==5.9.8 ; extra == 'psutil'
163
+ Requires-Dist: psutil==6.0.0; extra == "psutil"
164
+ Provides-Extra: pyautogui
165
+ Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
162
166
  Provides-Extra: selenium-stealth
163
- Requires-Dist: selenium-stealth ==1.0.6 ; extra == 'selenium-stealth'
167
+ Requires-Dist: selenium-stealth==1.0.6; extra == "selenium-stealth"
164
168
  Provides-Extra: selenium-wire
165
- Requires-Dist: selenium-wire ==5.1.0 ; extra == 'selenium-wire'
166
- Requires-Dist: Brotli ==1.1.0 ; extra == 'selenium-wire'
167
- Requires-Dist: blinker ==1.7.0 ; extra == 'selenium-wire'
168
- Requires-Dist: h2 ==4.1.0 ; extra == 'selenium-wire'
169
- Requires-Dist: hpack ==4.0.0 ; extra == 'selenium-wire'
170
- Requires-Dist: hyperframe ==6.0.1 ; extra == 'selenium-wire'
171
- Requires-Dist: kaitaistruct ==0.10 ; extra == 'selenium-wire'
172
- Requires-Dist: pyasn1 ==0.5.1 ; extra == 'selenium-wire'
173
- Requires-Dist: zstandard ==0.22.0 ; extra == 'selenium-wire'
169
+ Requires-Dist: selenium-wire==5.1.0; extra == "selenium-wire"
170
+ Requires-Dist: pyOpenSSL==24.2.1; extra == "selenium-wire"
171
+ Requires-Dist: pyparsing>=3.1.4; extra == "selenium-wire"
172
+ Requires-Dist: Brotli==1.1.0; extra == "selenium-wire"
173
+ Requires-Dist: blinker==1.7.0; extra == "selenium-wire"
174
+ Requires-Dist: h2==4.1.0; extra == "selenium-wire"
175
+ Requires-Dist: hpack==4.0.0; extra == "selenium-wire"
176
+ Requires-Dist: hyperframe==6.0.1; extra == "selenium-wire"
177
+ Requires-Dist: kaitaistruct==0.10; extra == "selenium-wire"
178
+ Requires-Dist: pyasn1==0.6.1; extra == "selenium-wire"
179
+ Requires-Dist: zstandard==0.23.0; extra == "selenium-wire"
180
+ Dynamic: author
181
+ Dynamic: author-email
182
+ Dynamic: classifier
183
+ Dynamic: home-page
184
+ Dynamic: keywords
185
+ Dynamic: license
186
+ Dynamic: maintainer
187
+ Dynamic: platform
188
+ Dynamic: provides-extra
189
+ Dynamic: requires-dist
190
+ Dynamic: requires-python
191
+ Dynamic: summary
174
192
 
175
193
  <!-- SeleniumBase Docs -->
176
194
 
195
+ <meta property="og:site_name" content="SeleniumBase">
196
+ <meta property="og:title" content="SeleniumBase: Python Web Automation and E2E Testing" />
197
+ <meta property="og:description" content="Fast, easy, and reliable Web/UI testing with Python." />
198
+ <meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots">
199
+ <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
200
+ <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
177
201
 
178
202
  <h1>SeleniumBase</h1>
179
203
 
180
- <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="266" /></a></p>
204
+ <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
181
205
 
182
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Scraping / Testing / Reporting</b></p>
183
206
 
184
- <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></p>
207
+ <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
208
+
209
+ <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
185
210
 
186
211
  <p align="center">
187
212
  <a href="#python_installation">🚀 Start</a> |
188
213
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
189
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
190
214
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
215
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
191
216
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🌠 Scripts</a> |
192
217
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
193
218
  <br />
194
219
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 APIs</a> |
195
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔡 Formats</a> |
196
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
220
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Formats</a> |
197
221
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
222
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
198
223
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locales</a> |
199
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
224
+ <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
200
225
  <br />
201
226
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
202
227
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
203
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CasePlans</a> |
204
228
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
205
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
206
- <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
229
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
230
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
231
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
207
232
  <br />
208
233
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
209
234
  <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migrate</a> |
210
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/boilerplates">♻️ Templates</a> |
211
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/integrations/node_js">🚉 NodeGUI</a> |
212
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
235
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CasePlans</a> |
236
+ <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/boilerplates">♻️ Template</a> |
237
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
213
238
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
214
239
  <br />
215
240
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
@@ -221,19 +246,82 @@ Requires-Dist: zstandard ==0.22.0 ; extra == 'selenium-wire'
221
246
  <br />
222
247
  </p>
223
248
 
249
+ <p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
250
+
224
251
  --------
225
252
 
226
- 📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/**](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.
253
+ 📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
227
254
 
228
- <p align="left">📗 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>, which covers login, shopping, and checkout:</p>
255
+ 🐙 Note that <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> / <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> (Stealth Mode) have their own ReadMe files.
229
256
 
230
- ```bash
231
- pytest my_first_test.py
257
+ ℹ️ Most scripts run with raw <code translate="no"><b>python</b></code>, although some scripts use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
258
+
259
+ --------
260
+
261
+ <p align="left">📗 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">raw_google.py</a>, which performs a Google search:</p>
262
+
263
+ ```python
264
+ from seleniumbase import SB
265
+
266
+ with SB(test=True) as sb:
267
+ sb.open("https://google.com/ncr")
268
+ sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
269
+ sb.click('[href*="github.com/seleniumbase/"]')
270
+ sb.save_screenshot_to_logs() # ./latest_logs/
271
+ print(sb.get_page_title())
232
272
  ```
233
273
 
234
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
274
+ > `python raw_google.py`
275
+
276
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="420" /></a>
277
+
278
+ --------
279
+
280
+ <p align="left">📗 Here's an example of bypassing Cloudflare's challenge page: <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py">SeleniumBase/examples/cdp_mode/raw_gitlab.py</a></p>
235
281
 
236
- > ``pytest`` uses ``--chrome`` by default unless set differently.
282
+ ```python
283
+ from seleniumbase import SB
284
+
285
+ with SB(uc=True, test=True, locale_code="en") as sb:
286
+ url = "https://gitlab.com/users/sign_in"
287
+ sb.activate_cdp_mode(url)
288
+ sb.uc_gui_click_captcha()
289
+ sb.sleep(2)
290
+ ```
291
+
292
+ <img src="https://seleniumbase.github.io/other/cf_sec.jpg" title="SeleniumBase" width="332"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" title="SeleniumBase" width="288">
293
+
294
+ --------
295
+
296
+ <p align="left">📗 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py">test_get_swag.py</a>, which tests an e-commerce site:</p>
297
+
298
+ ```python
299
+ from seleniumbase import BaseCase
300
+ BaseCase.main(__name__, __file__) # Call pytest
301
+
302
+ class MyTestClass(BaseCase):
303
+ def test_swag_labs(self):
304
+ self.open("https://www.saucedemo.com")
305
+ self.type("#user-name", "standard_user")
306
+ self.type("#password", "secret_sauce\n")
307
+ self.assert_element("div.inventory_list")
308
+ self.click('button[name*="backpack"]')
309
+ self.click("#shopping_cart_container a")
310
+ self.assert_text("Backpack", "div.cart_item")
311
+ self.click("button#checkout")
312
+ self.type("input#first-name", "SeleniumBase")
313
+ self.type("input#last-name", "Automation")
314
+ self.type("input#postal-code", "77123")
315
+ self.click("input#continue")
316
+ self.click("button#finish")
317
+ self.assert_text("Thank you for your order!")
318
+ ```
319
+
320
+ > `pytest test_get_swag.py`
321
+
322
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
323
+
324
+ > (The default browser is ``--chrome`` if not set.)
237
325
 
238
326
  --------
239
327
 
@@ -265,7 +353,7 @@ pytest test_demo_site.py
265
353
 
266
354
  --------
267
355
 
268
- <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb2.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
356
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
269
357
 
270
358
  <blockquote>
271
359
  <p dir="auto"><strong>Explore the README:</strong></p>
@@ -327,7 +415,7 @@ With raw Selenium, that requires more code:<br />
327
415
 
328
416
  <p>📚 <b>Learn about different ways of writing tests:</b></p>
329
417
 
330
- <p align="left">📘📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_simple_login.py">test_simple_login.py</a>, which uses <code translate="no"><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/fixtures/base_case.py">BaseCase</a></code> class inheritance, and runs with <a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a> or <a href="https://github.com/mdmintz/pynose">pynose</a>. (Use <code translate="no">self.driver</code> to access Selenium's raw <code translate="no">driver</code>.)</p>
418
+ <p align="left">📗📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_simple_login.py">test_simple_login.py</a>, which uses <code translate="no"><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/fixtures/base_case.py">BaseCase</a></code> class inheritance, and runs with <a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a> or <a href="https://github.com/mdmintz/pynose">pynose</a>. (Use <code translate="no">self.driver</code> to access Selenium's raw <code translate="no">driver</code>.)</p>
331
419
 
332
420
  ```python
333
421
  from seleniumbase import BaseCase
@@ -346,22 +434,7 @@ class TestSimpleLogin(BaseCase):
346
434
  self.assert_text("signed out", "#top_message")
347
435
  ```
348
436
 
349
- <p align="left">📗📝 Here's a test from <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/sb_fixture_tests.py">sb_fixture_tests.py</a>, which uses the <b><code translate="no">sb</code></b> <code translate="no">pytest</code> fixture. Runs with <a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a>. (Use <code translate="no">sb.driver</code> to access Selenium's raw <code translate="no">driver</code>.)</p>
350
-
351
- ```python
352
- def test_sb_fixture_with_no_class(sb):
353
- sb.open("seleniumbase.io/simple/login")
354
- sb.type("#username", "demo_user")
355
- sb.type("#password", "secret_pass")
356
- sb.click('a:contains("Sign in")')
357
- sb.assert_exact_text("Welcome!", "h1")
358
- sb.assert_element("img#image1")
359
- sb.highlight("#image1")
360
- sb.click_link("Sign out")
361
- sb.assert_text("signed out", "#top_message")
362
- ```
363
-
364
- <p align="left">📙📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_sb.py">raw_login_sb.py</a>, which uses the <b><code translate="no">SB</code></b> Context Manager. Runs with pure <code translate="no">python</code>. (Use <code translate="no">sb.driver</code> to access Selenium's raw <code translate="no">driver</code>.)</p>
437
+ <p align="left">📘📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_sb.py">raw_login_sb.py</a>, which uses the <b><code translate="no">SB</code></b> Context Manager. Runs with pure <code translate="no">python</code>. (Use <code translate="no">sb.driver</code> to access Selenium's raw <code translate="no">driver</code>.)</p>
365
438
 
366
439
  ```python
367
440
  from seleniumbase import SB
@@ -378,24 +451,7 @@ with SB() as sb:
378
451
  sb.assert_text("signed out", "#top_message")
379
452
  ```
380
453
 
381
- <p align="left">📔📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_context.py">raw_login_context.py</a>, which uses the <b><code translate="no">DriverContext</code></b> Manager. Runs with pure <code translate="no">python</code>. (The <code translate="no">driver</code> is an improved version of Selenium's raw <code translate="no">driver</code>, with more methods.)</p>
382
-
383
- ```python
384
- from seleniumbase import DriverContext
385
-
386
- with DriverContext() as driver:
387
- driver.open("seleniumbase.io/simple/login")
388
- driver.type("#username", "demo_user")
389
- driver.type("#password", "secret_pass")
390
- driver.click('a:contains("Sign in")')
391
- driver.assert_exact_text("Welcome!", "h1")
392
- driver.assert_element("img#image1")
393
- driver.highlight("#image1")
394
- driver.click_link("Sign out")
395
- driver.assert_text("signed out", "#top_message")
396
- ```
397
-
398
- <p align="left">📔📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_driver.py">raw_login_driver.py</a>, which uses the <b><code translate="no">Driver</code></b> Manager. Runs with pure <code translate="no">python</code>. (The <code>driver</code> is an improved version of Selenium's raw <code translate="no">driver</code>, with more methods.)</p>
454
+ <p align="left">📙📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_driver.py">raw_login_driver.py</a>, which uses the <b><code translate="no">Driver</code></b> Manager. Runs with pure <code translate="no">python</code>. (The <code>driver</code> is an improved version of Selenium's raw <code translate="no">driver</code>, with more methods.)</p>
399
455
 
400
456
  ```python
401
457
  from seleniumbase import Driver
@@ -415,23 +471,6 @@ finally:
415
471
  driver.quit()
416
472
  ```
417
473
 
418
- <p align="left">📕📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/features/login_app.feature">login_app.feature</a>, which uses <a translate="no" href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">behave-BDD Gherkin</a> syntax. Runs with <code translate="no">behave</code>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn about the <b>SeleniumBase behave-BDD</b> integration</a>)</p>
419
-
420
- ```gherkin
421
- Feature: SeleniumBase scenarios for the Simple App
422
-
423
- Scenario: Verify the Simple App (Login / Logout)
424
- Given Open "seleniumbase.io/simple/login"
425
- And Type "demo_user" into "#username"
426
- And Type "secret_pass" into "#password"
427
- And Click 'a:contains("Sign in")'
428
- And Assert exact text "Welcome!" in "h1"
429
- And Assert element "img#image1"
430
- And Highlight "#image1"
431
- And Click link "Sign out"
432
- And Assert text "signed out" in "#top_message"
433
- ```
434
-
435
474
  --------
436
475
 
437
476
  <a id="python_installation"></a>
@@ -476,48 +515,49 @@ pip install -e .
476
515
  🔵 **Type ``seleniumbase`` or ``sbase`` to verify that SeleniumBase was installed successfully:**
477
516
 
478
517
  ```bash
479
- ______ __ _ ____
480
- / ____/__ / /__ ____ (_)_ ______ ___ / _ \____ ________
481
- \__ \/ _ \/ / _ \/ __ \/ / / / / __ `__ \ / /_) / __ \/ ___/ _ \
482
- ___/ / __/ / __/ / / / / /_/ / / / / / // /_) / (_/ /__ / __/
483
- /____/\___/_/\___/_/ /_/_/\__,_/_/ /_/ /_//_____/\__,_/____/\___/
484
- ------------------------------------------------------------------
485
-
486
- * USAGE: "seleniumbase [COMMAND] [PARAMETERS]"
487
- * OR: "sbase [COMMAND] [PARAMETERS]"
488
-
489
- COMMANDS:
490
- get / install [DRIVER] [OPTIONS]
491
- methods (List common Python methods)
492
- options (List common pytest options)
493
- behave-options (List common behave options)
494
- gui / commander [OPTIONAL PATH or TEST FILE]
495
- behave-gui (SBase Commander for Behave)
496
- caseplans [OPTIONAL PATH or TEST FILE]
497
- mkdir [DIRECTORY] [OPTIONS]
498
- mkfile [FILE.py] [OPTIONS]
499
- mkrec / codegen [FILE.py] [OPTIONS]
500
- recorder (Open Recorder Desktop App.)
501
- record (If args: mkrec. Else: App.)
502
- mkpres [FILE.py] [LANG]
503
- mkchart [FILE.py] [LANG]
504
- print [FILE] [OPTIONS]
505
- translate [SB_FILE.py] [LANG] [ACTION]
506
- convert [WEBDRIVER_UNITTEST_FILE.py]
507
- extract-objects [SB_FILE.py]
508
- inject-objects [SB_FILE.py] [OPTIONS]
509
- objectify [SB_FILE.py] [OPTIONS]
510
- revert-objects [SB_FILE.py] [OPTIONS]
511
- encrypt / obfuscate
512
- decrypt / unobfuscate
513
- download server (Get Selenium Grid JAR file)
514
- grid-hub [start|stop] [OPTIONS]
515
- grid-node [start|stop] --hub=[HOST/IP]
516
- * (EXAMPLE: "sbase get chromedriver latest") *
517
-
518
- Type "sbase help [COMMAND]" for specific command info.
519
- For info on all commands, type: "seleniumbase --help".
520
- Use "pytest" for running tests.
518
+ ___ _ _ ___
519
+ / __| ___| |___ _ _ (_)_ _ _ __ | _ ) __ _ ______
520
+ \__ \/ -_) / -_) ' \| | \| | ' \ | _ \/ _` (_-< -_)
521
+ |___/\___|_\___|_||_|_|\_,_|_|_|_\|___/\__,_/__|___|
522
+ ----------------------------------------------------
523
+
524
+ ╭──────────────────────────────────────────────────╮
525
+ * USAGE: "seleniumbase [COMMAND] [PARAMETERS]"
526
+ * OR: "sbase [COMMAND] [PARAMETERS]"
527
+ │ │
528
+ COMMANDS: PARAMETERS / DESCRIPTIONS: │
529
+ get / install [DRIVER_NAME] [OPTIONS]
530
+ methods (List common Python methods)
531
+ options (List common pytest options)
532
+ behave-options (List common behave options)
533
+ gui / commander [OPTIONAL PATH or TEST FILE]
534
+ behave-gui (SBase Commander for Behave)
535
+ caseplans [OPTIONAL PATH or TEST FILE]
536
+ mkdir [DIRECTORY] [OPTIONS]
537
+ mkfile [FILE.py] [OPTIONS]
538
+ mkrec / codegen [FILE.py] [OPTIONS]
539
+ recorder (Open Recorder Desktop App.)
540
+ record (If args: mkrec. Else: App.)
541
+ mkpres [FILE.py] [LANG]
542
+ mkchart [FILE.py] [LANG]
543
+ print [FILE] [OPTIONS]
544
+ translate [SB_FILE.py] [LANG] [ACTION]
545
+ convert [WEBDRIVER_UNITTEST_FILE.py]
546
+ extract-objects [SB_FILE.py]
547
+ inject-objects [SB_FILE.py] [OPTIONS]
548
+ objectify [SB_FILE.py] [OPTIONS]
549
+ revert-objects [SB_FILE.py] [OPTIONS]
550
+ encrypt / obfuscate
551
+ decrypt / unobfuscate
552
+ │ proxy (Start a basic proxy server)
553
+ │ download server (Get Selenium Grid JAR file) │
554
+ grid-hub [start|stop] [OPTIONS]
555
+ │ grid-node [start|stop] --hub=[HOST/IP]
556
+ │ │
557
+ * EXAMPLE => "sbase get chromedriver stable" │
558
+ │ * For command info => "sbase help [COMMAND]"
559
+ * For info on all commands => "sbase --help" │
560
+ ╰──────────────────────────────────────────────────╯
521
561
  ```
522
562
 
523
563
  <h3>🔵 Downloading webdrivers:</h3>
@@ -529,20 +569,21 @@ COMMANDS:
529
569
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
530
570
 
531
571
  ```bash
532
- *** chromedriver to download = 121.0.6167.85 (Latest Stable)
572
+ *** chromedriver to download = 131.0.6778.108 (Latest Stable)
533
573
 
534
574
  Downloading chromedriver-mac-arm64.zip from:
535
- https://storage.googleapis.com/chrome-for-testing-public/121.0.6167.85/mac-arm64/chromedriver-mac-arm64.zip ...
575
+ https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.108/mac-arm64/chromedriver-mac-arm64.zip ...
536
576
  Download Complete!
537
577
 
538
578
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
539
579
  Unzip Complete!
540
580
 
541
581
  The file [chromedriver] was saved to:
542
- /Users/michael/github/SeleniumBase/seleniumbase/drivers/chromedriver
582
+ ~/github/SeleniumBase/seleniumbase/drivers/
583
+ chromedriver
543
584
 
544
- Making [chromedriver 121.0.6167.85] executable ...
545
- [chromedriver 121.0.6167.85] is now ready for use!
585
+ Making [chromedriver 131.0.6778.108] executable ...
586
+ [chromedriver 131.0.6778.108] is now ready for use!
546
587
  ```
547
588
 
548
589
  </details>
@@ -562,7 +603,7 @@ pytest my_first_test.py
562
603
 
563
604
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
564
605
 
565
- <p align="left"><b>Here's the code for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>:</b></p>
606
+ <p align="left"><b>Here's the full code for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>:</b></p>
566
607
 
567
608
  ```python
568
609
  from seleniumbase import BaseCase
@@ -812,11 +853,14 @@ pytest test_coffee_cart.py --trace
812
853
  --binary-location=PATH # (Set path of the Chromium browser binary to use.)
813
854
  --driver-version=VER # (Set the chromedriver or uc_driver version to use.)
814
855
  --sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
856
+ --wfa # (Wait for AngularJS to be done loading after specific web actions.)
815
857
  --pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
816
- --headless # (Run tests in headless mode. The default arg on Linux OS.)
817
- --headless2 # (Use the new headless mode, which supports extensions.)
858
+ --headless # (The default headless mode. Linux uses this mode by default.)
859
+ --headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
860
+ --headless2 # (Use Chrome's new headless mode, which supports extensions.)
818
861
  --headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
819
862
  --xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
863
+ --xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
820
864
  --locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
821
865
  --interval=SECONDS # (The autoplay interval for presentations & tour steps)
822
866
  --start-page=URL # (The starting URL for the web browser when tests begin.)
@@ -834,10 +878,12 @@ pytest test_coffee_cart.py --trace
834
878
  --block-images # (Block images from loading during tests.)
835
879
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
836
880
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
881
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
837
882
  --recorder # (Enables the Recorder for turning browser actions into code.)
838
883
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
839
884
  --rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
840
885
  --rec-print # (If the Recorder is enabled, prints output after tests end.)
886
+ --disable-cookies # (Disable Cookies on websites. Pages might break!)
841
887
  --disable-js # (Disable JavaScript on websites. Pages might break!)
842
888
  --disable-csp # (Disable the Content Security Policy of websites.)
843
889
  --disable-ws # (Disable Web Security on Chromium-based browsers.)
@@ -860,6 +906,7 @@ pytest test_coffee_cart.py --trace
860
906
  --rcs | --reuse-class-session # (Reuse session for tests in class.)
861
907
  --crumbs # (Delete all cookies between tests reusing a session.)
862
908
  --disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
909
+ --window-position=X,Y # (Set the browser's starting window position.)
863
910
  --window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
864
911
  --maximize # (Start tests with the browser window maximized.)
865
912
  --screenshot # (Save a screenshot at the end of each test.)
@@ -972,7 +1019,7 @@ You can run it from the ``examples/`` folder like this:
972
1019
  pytest test_fail.py
973
1020
  ```
974
1021
 
975
- 🔵 You'll notice that a logs folder, "latest_logs", was created to hold information about the failing test, and screenshots. During test runs, past results get moved to the archived_logs folder if you have ARCHIVE_EXISTING_LOGS set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), or if your run tests with ``--archive-logs``. If you choose not to archive existing logs, they will be deleted and replaced by the logs of the latest test run.
1022
+ 🔵 You'll notice that a logs folder, ``./latest_logs/``, was created to hold information (and screenshots) about the failing test. During test runs, past results get moved to the archived_logs folder if you have ARCHIVE_EXISTING_LOGS set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), or if your run tests with ``--archive-logs``. If you choose not to archive existing logs, they will be deleted and replaced by the logs of the latest test run.
976
1023
 
977
1024
  --------
978
1025
 
@@ -1001,14 +1048,14 @@ python -m http.server 1948
1001
1048
  pytest test_suite.py test_image_saving.py --dashboard --rs --headless
1002
1049
  ```
1003
1050
 
1004
- <img src="https://seleniumbase.github.io/cdn/img/dashboard_2.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="480" />
1051
+ <img src="https://seleniumbase.github.io/cdn/img/dashboard_2.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="520" />
1005
1052
 
1006
1053
  --------
1007
1054
 
1008
1055
  <a id="creating_visual_reports"></a>
1009
1056
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Generating Test Reports:</h2>
1010
1057
 
1011
- <h3>🔵 Pytest Reports:</h3>
1058
+ <h3>🔵 <code>pytest</code> HTML Reports:</h3>
1012
1059
 
1013
1060
  ✅ Using ``--html=report.html`` gives you a fancy report of the name specified after your test suite completes.
1014
1061
 
@@ -1028,7 +1075,7 @@ pytest test_suite.py --dashboard --html=report.html
1028
1075
 
1029
1076
  <img src="https://seleniumbase.github.io/cdn/img/dash_report.jpg" alt="Dashboard Pytest HTML Report" title="Dashboard Pytest HTML Report" width="520" />
1030
1077
 
1031
- 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/).
1078
+ 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/).
1032
1079
 
1033
1080
  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.
1034
1081
 
@@ -1036,7 +1083,7 @@ You can also use ``--junit-xml=report.xml`` to get an xml report instead. Jenkin
1036
1083
  pytest test_suite.py --junit-xml=report.xml
1037
1084
  ```
1038
1085
 
1039
- <h3>🔵 pynose Reports:</h3>
1086
+ <h3>🔵 <code>pynose</code> Reports:</h3>
1040
1087
 
1041
1088
  The ``--report`` option gives you a fancy report after your test suite completes.
1042
1089
 
@@ -1048,7 +1095,7 @@ pynose test_suite.py --report
1048
1095
 
1049
1096
  (NOTE: You can add ``--show-report`` to immediately display pynose reports after the test suite completes. Only use ``--show-report`` when running tests locally because it pauses the test run.)
1050
1097
 
1051
- <h3>🔵 Behave Dashboard & Reports:</h3>
1098
+ <h3>🔵 <code>behave</code> Dashboard & Reports:</h3>
1052
1099
 
1053
1100
  (The [behave_bdd/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/behave_bdd) folder can be found in the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.)
1054
1101
 
@@ -1056,7 +1103,7 @@ pynose test_suite.py --report
1056
1103
  behave behave_bdd/features/ -D dashboard -D headless
1057
1104
  ```
1058
1105
 
1059
- <img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="500">
1106
+ <img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520">
1060
1107
 
1061
1108
  You can also use ``--junit`` to get ``.xml`` reports for each <code translate="no">behave</code> feature. Jenkins can use these files to display better reporting for your tests.
1062
1109
 
@@ -1120,7 +1167,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
1120
1167
  ```
1121
1168
 
1122
1169
 
1123
- <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up / Pop Up Alerts:</h3>
1170
+ <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up Alerts:</h3>
1124
1171
 
1125
1172
  🔵 <code translate="no">self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code translate="no">self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code translate="no">self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code translate="no">readyState</code> of the page is <code translate="no">complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code translate="no">self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code translate="no">self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
1126
1173
 
@@ -1518,25 +1565,25 @@ pytest --reruns=1 --reruns-delay=1
1518
1565
 
1519
1566
  <p>
1520
1567
  <div><b>If you see something, say something!</b></div>
1521
- <div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" /></a></div>
1568
+ <div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" /></a></div>
1522
1569
  </p>
1523
1570
 
1524
- <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="266" /></a></p>
1571
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="274" /></a></p>
1572
+
1573
+ <a href="https://pypi.org/project/seleniumbase/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a>
1525
1574
 
1526
1575
  <p><div>
1527
- <span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="68" /></a></span>
1528
- <span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="62" /></a></span>
1529
- <span><a href="https://www.facebook.com/SeleniumBase"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="64" /></a></span>
1530
- <span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="50" /></a></span>
1576
+ <span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
1577
+ <span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="64" /></a></span>
1578
+ <span><a href="https://discord.gg/EdhQTn3EyE"><img src="https://seleniumbase.github.io/other/discord_icon.png" title="SeleniumBase on Discord" alt="SeleniumBase on Discord" width="66" /></a></span>
1579
+ <span><a href="https://www.facebook.com/SeleniumBase"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="62" /></a></span>
1531
1580
  </div></p>
1532
1581
 
1533
1582
  <p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
1534
1583
 
1535
- <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/fancy_logo_14.png" title="SeleniumBase" width="240" /></a></div> <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></div> <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a></div> <div><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1536
- <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a></div>
1537
- <div><a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1538
-
1539
- --------
1540
-
1541
- <p><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb.png" alt="SeleniumBase" title="SeleniumBase" width="300" /></a></p>
1542
- <p><a href="https://pypi.org/project/seleniumbase/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a></p>
1584
+ <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="274" /></a></div>
1585
+ <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
1586
+ <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1587
+ <div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1588
+ <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1589
+ <div align="left"></div>