seleniumbase 4.45.6__tar.gz → 4.45.12__tar.gz

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 (163) hide show
  1. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/LICENSE +1 -1
  2. {seleniumbase-4.45.6/seleniumbase.egg-info → seleniumbase-4.45.12}/PKG-INFO +72 -61
  3. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/README.md +62 -53
  4. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/requirements.txt +6 -5
  5. seleniumbase-4.45.12/seleniumbase/__version__.py +2 -0
  6. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/run.py +1 -0
  7. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_install.py +9 -1
  8. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkdir.py +70 -0
  9. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/browser_launcher.py +40 -16
  10. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/sb_cdp.py +109 -25
  11. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/base_case.py +43 -1
  12. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/js_utils.py +6 -2
  13. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/browser.py +79 -28
  14. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/cdp_util.py +31 -6
  15. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/config.py +0 -1
  16. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/connection.py +16 -7
  17. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/element.py +17 -8
  18. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/tab.py +35 -2
  19. {seleniumbase-4.45.6 → seleniumbase-4.45.12/seleniumbase.egg-info}/PKG-INFO +72 -61
  20. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/requires.txt +13 -7
  21. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/setup.py +9 -7
  22. seleniumbase-4.45.6/seleniumbase/__version__.py +0 -2
  23. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/.gitignore +0 -0
  24. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/MANIFEST.in +0 -0
  25. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/install.sh +0 -0
  26. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/pyproject.toml +0 -0
  27. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/pytest.ini +0 -0
  28. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/__init__.py +0 -0
  29. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/__main__.py +0 -0
  30. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/steps.py +0 -0
  31. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/__init__.py +0 -0
  32. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/__main__.py +0 -0
  33. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/__init__.py +0 -0
  34. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/behave_helper.py +0 -0
  35. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/behave_sb.py +0 -0
  36. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/steps.py +0 -0
  37. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/__init__.py +0 -0
  38. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/decorators.py +0 -0
  39. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/encryption.py +0 -0
  40. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/exceptions.py +0 -0
  41. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/obfuscate.py +0 -0
  42. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/unobfuscate.py +0 -0
  43. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/__init__.py +0 -0
  44. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/ad_block_list.py +0 -0
  45. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/proxy_list.py +0 -0
  46. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/settings.py +0 -0
  47. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/__init__.py +0 -0
  48. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/logo_helper.py +0 -0
  49. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/rich_helper.py +0 -0
  50. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  51. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  52. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_commander.py +0 -0
  53. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  54. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  55. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  56. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  57. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  58. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_print.py +0 -0
  59. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  60. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/__init__.py +0 -0
  61. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/application_manager.py +0 -0
  62. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/capabilities_parser.py +0 -0
  63. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/colored_traceback.py +0 -0
  64. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/create_db_tables.sql +0 -0
  65. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/detect_b_ver.py +0 -0
  66. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/download_helper.py +0 -0
  67. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/encoded_images.py +0 -0
  68. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/jqc_helper.py +0 -0
  69. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/log_helper.py +0 -0
  70. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/mysql.py +0 -0
  71. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/proxy_helper.py +0 -0
  72. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/recorder_helper.py +0 -0
  73. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/report_helper.py +0 -0
  74. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/s3_manager.py +0 -0
  75. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/sb_driver.py +0 -0
  76. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/session_helper.py +0 -0
  77. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/settings_parser.py +0 -0
  78. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/style_sheet.py +0 -0
  79. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/testcase_manager.py +0 -0
  80. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/tour_helper.py +0 -0
  81. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/visual_helper.py +0 -0
  82. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/__init__.py +0 -0
  83. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  84. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  85. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  86. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  87. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  88. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  89. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  90. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/__init__.py +0 -0
  91. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/ad_block.zip +0 -0
  92. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/disable_csp.zip +0 -0
  93. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/recorder.zip +0 -0
  94. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/sbase_ext.zip +0 -0
  95. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/__init__.py +0 -0
  96. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/constants.py +0 -0
  97. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  98. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/errors.py +0 -0
  99. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_actions.py +0 -0
  100. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_utils.py +0 -0
  101. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/shared_utils.py +0 -0
  102. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/unittest_helper.py +0 -0
  103. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/words.py +0 -0
  104. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  105. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/__init__.py +0 -0
  106. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/active_css_js.py +0 -0
  107. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/live_js.py +0 -0
  108. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/recorder_js.py +0 -0
  109. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/masterqa/__init__.py +0 -0
  110. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/masterqa/master_qa.py +0 -0
  111. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/__init__.py +0 -0
  112. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/base_plugin.py +0 -0
  113. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/basic_test_info.py +0 -0
  114. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  115. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/driver_manager.py +0 -0
  116. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/page_source.py +0 -0
  117. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/pytest_plugin.py +0 -0
  118. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  119. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/sb_manager.py +0 -0
  120. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/screen_shots.py +0 -0
  121. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/selenium_plugin.py +0 -0
  122. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/resources/__init__.py +0 -0
  123. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/__init__.py +0 -0
  124. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/chinese.py +0 -0
  125. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/dutch.py +0 -0
  126. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/french.py +0 -0
  127. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/italian.py +0 -0
  128. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/japanese.py +0 -0
  129. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/korean.py +0 -0
  130. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/master_dict.py +0 -0
  131. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/portuguese.py +0 -0
  132. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/russian.py +0 -0
  133. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/spanish.py +0 -0
  134. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/translator.py +0 -0
  135. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/__init__.py +0 -0
  136. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp.py +0 -0
  137. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  138. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  139. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/setup.cfg +0 -0
  163. {seleniumbase-4.45.6 → seleniumbase-4.45.12}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2014-2025 Michael Mintz
3
+ Copyright (c) 2014-2026 Michael Mintz
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.45.6
3
+ Version: 4.45.12
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
@@ -64,11 +64,12 @@ Requires-Dist: setuptools~=70.2; python_version < "3.10"
64
64
  Requires-Dist: setuptools>=80.9.0; python_version >= "3.10"
65
65
  Requires-Dist: wheel>=0.45.1
66
66
  Requires-Dist: attrs>=25.4.0
67
- Requires-Dist: certifi>=2025.11.12
67
+ Requires-Dist: certifi>=2026.1.4
68
68
  Requires-Dist: exceptiongroup>=1.3.1
69
- Requires-Dist: websockets>=15.0.1
69
+ Requires-Dist: websockets~=15.0.1; python_version < "3.10"
70
+ Requires-Dist: websockets>=16.0; python_version >= "3.10"
70
71
  Requires-Dist: filelock~=3.19.1; python_version < "3.10"
71
- Requires-Dist: filelock>=3.20.1; python_version >= "3.10"
72
+ Requires-Dist: filelock>=3.20.3; python_version >= "3.10"
72
73
  Requires-Dist: fasteners>=0.20
73
74
  Requires-Dist: mycdp>=1.3.2
74
75
  Requires-Dist: pynose>=1.5.5
@@ -86,7 +87,7 @@ Requires-Dist: pyyaml>=6.0.3
86
87
  Requires-Dist: pygments>=2.19.2
87
88
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
88
89
  Requires-Dist: tabcompleter>=1.4.0
89
- Requires-Dist: pdbp>=1.8.1
90
+ Requires-Dist: pdbp>=1.8.2
90
91
  Requires-Dist: idna>=3.11
91
92
  Requires-Dist: chardet==5.2.0
92
93
  Requires-Dist: charset-normalizer<4,>=3.4.4
@@ -137,7 +138,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
137
138
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
138
139
  Provides-Extra: coverage
139
140
  Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
140
- Requires-Dist: coverage>=7.13.0; python_version >= "3.10" and extra == "coverage"
141
+ Requires-Dist: coverage>=7.13.1; python_version >= "3.10" and extra == "coverage"
141
142
  Requires-Dist: pytest-cov>=7.0.0; extra == "coverage"
142
143
  Provides-Extra: flake8
143
144
  Requires-Dist: flake8==7.3.0; extra == "flake8"
@@ -150,13 +151,14 @@ Requires-Dist: ipython==7.34.0; extra == "ipdb"
150
151
  Provides-Extra: mss
151
152
  Requires-Dist: mss==10.1.0; extra == "mss"
152
153
  Provides-Extra: pdfminer
153
- Requires-Dist: pdfminer.six==20251107; extra == "pdfminer"
154
+ Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
155
+ Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
154
156
  Requires-Dist: cryptography==46.0.3; extra == "pdfminer"
155
157
  Requires-Dist: cffi==2.0.0; extra == "pdfminer"
156
158
  Requires-Dist: pycparser==2.23; extra == "pdfminer"
157
159
  Provides-Extra: pillow
158
160
  Requires-Dist: Pillow>=11.3.0; python_version < "3.10" and extra == "pillow"
159
- Requires-Dist: Pillow>=12.0.0; python_version >= "3.10" and extra == "pillow"
161
+ Requires-Dist: Pillow>=12.1.0; python_version >= "3.10" and extra == "pillow"
160
162
  Provides-Extra: pip-system-certs
161
163
  Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
162
164
  Provides-Extra: proxy
@@ -351,7 +353,7 @@ class MyTestClass(BaseCase):
351
353
 
352
354
  <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>
353
355
 
354
- > (The default browser is ``--chrome`` if not set.)
356
+ > (The default browser is `--chrome` if not set.)
355
357
 
356
358
  --------
357
359
 
@@ -515,18 +517,18 @@ finally:
515
517
  <a id="install_seleniumbase"></a>
516
518
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Install SeleniumBase:</h2>
517
519
 
518
- **You can install ``seleniumbase`` from [PyPI](https://pypi.org/project/seleniumbase/) or [GitHub](https://github.com/seleniumbase/SeleniumBase):**
520
+ **You can install `seleniumbase` from [PyPI](https://pypi.org/project/seleniumbase/) or [GitHub](https://github.com/seleniumbase/SeleniumBase):**
519
521
 
520
- 🔵 **How to install ``seleniumbase`` from PyPI:**
522
+ 🔵 **How to install `seleniumbase` from PyPI:**
521
523
 
522
524
  ```zsh
523
525
  pip install seleniumbase
524
526
  ```
525
527
 
526
- * (Add ``--upgrade`` OR ``-U`` to upgrade SeleniumBase.)
527
- * (Add ``--force-reinstall`` to upgrade indirect packages.)
528
+ * (Add `--upgrade` OR `-U` to upgrade SeleniumBase.)
529
+ * (Add `--force-reinstall` to upgrade indirect packages.)
528
530
 
529
- 🔵 **How to install ``seleniumbase`` from a GitHub clone:**
531
+ 🔵 **How to install `seleniumbase` from a GitHub clone:**
530
532
 
531
533
  ```zsh
532
534
  git clone https://github.com/seleniumbase/SeleniumBase.git
@@ -541,7 +543,7 @@ git pull
541
543
  pip install -e .
542
544
  ```
543
545
 
544
- 🔵 **Type ``seleniumbase`` or ``sbase`` to verify that SeleniumBase was installed successfully:**
546
+ 🔵 **Type `seleniumbase` or `sbase` to verify that SeleniumBase was installed successfully:**
545
547
 
546
548
  ```zsh
547
549
  ___ _ _ ___
@@ -591,7 +593,7 @@ pip install -e .
591
593
 
592
594
  <h3>🔵 Downloading webdrivers:</h3>
593
595
 
594
- ✅ SeleniumBase automatically downloads webdrivers as needed, such as ``chromedriver``.
596
+ ✅ SeleniumBase automatically downloads webdrivers as needed, such as `chromedriver`.
595
597
 
596
598
  <div></div>
597
599
  <details>
@@ -724,7 +726,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
724
726
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
725
727
  ```
726
728
 
727
- Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
729
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
728
730
 
729
731
  ```zsh
730
732
  pytest coffee_cart_tests.py --rs
@@ -743,10 +745,10 @@ behave calculator.feature -D rs -D dashboard
743
745
 
744
746
  <p>✅ <code translate="no">pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code translate="no">pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
745
747
 
746
- * Python files that start with ``test_`` or end with ``_test.py``.
747
- * Python methods that start with ``test_``.
748
+ * Python files that start with `test_` or end with `_test.py`.
749
+ * Python methods that start with `test_`.
748
750
 
749
- With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because ``seleniumbase.BaseCase`` inherits ``unittest.TestCase`` to trigger autodiscovery.
751
+ With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because `seleniumbase.BaseCase` inherits `unittest.TestCase` to trigger autodiscovery.
750
752
 
751
753
  <p>✅ You can do a pre-flight check to see which tests would get discovered by <code translate="no">pytest</code> before the actual run:</p>
752
754
 
@@ -788,7 +790,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
788
790
  pytest my_first_test.py --demo
789
791
  ```
790
792
 
791
- 🔵 ``time.sleep(seconds)`` can be used to make a test wait at a specific spot:
793
+ 🔵 `time.sleep(seconds)` can be used to make a test wait at a specific spot:
792
794
 
793
795
  ```python
794
796
  import time; time.sleep(3) # Do nothing for 3 seconds.
@@ -802,15 +804,15 @@ import pytest; pytest.set_trace()
802
804
  breakpoint() # Shortcut for "import pdb; pdb.set_trace()"
803
805
  ```
804
806
 
805
- > (**``pdb``** commands: ``n``, ``c``, ``s``, ``u``, ``d`` => ``next``, ``continue``, ``step``, ``up``, ``down``)
807
+ > (**`pdb`** commands: `n`, `c`, `s`, `u`, `d` => `next`, `continue`, `step`, `up`, `down`)
806
808
 
807
- 🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add **``--pdb``** as a ``pytest`` option:
809
+ 🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add **`--pdb`** as a `pytest` option:
808
810
 
809
811
  ```zsh
810
812
  pytest test_fail.py --pdb
811
813
  ```
812
814
 
813
- 🔵 To start tests in Debug Mode, add **``--trace``** as a ``pytest`` option:
815
+ 🔵 To start tests in Debug Mode, add **`--trace`** as a `pytest` option:
814
816
 
815
817
  ```zsh
816
818
  pytest test_coffee_cart.py --trace
@@ -955,7 +957,7 @@ pytest test_coffee_cart.py --trace
955
957
 
956
958
  --------
957
959
 
958
- 🔵 During test failures, logs and screenshots from the most recent test run will get saved to the ``latest_logs/`` folder. Those logs will get moved to ``archived_logs/`` if you add --archive_logs to command-line options, or have ``ARCHIVE_EXISTING_LOGS`` set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), otherwise log files with be cleaned up at the start of the next test run. The ``test_suite.py`` collection contains tests that fail on purpose so that you can see how logging works.
960
+ 🔵 During test failures, logs and screenshots from the most recent test run will get saved to the `latest_logs/` folder. Those logs will get moved to `archived_logs/` if you add --archive_logs to command-line options, or have `ARCHIVE_EXISTING_LOGS` set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), otherwise log files with be cleaned up at the start of the next test run. The `test_suite.py` collection contains tests that fail on purpose so that you can see how logging works.
959
961
 
960
962
  ```zsh
961
963
  cd examples/
@@ -967,18 +969,18 @@ pytest test_suite.py --firefox
967
969
 
968
970
  An easy way to override seleniumbase/config/settings.py is by using a custom settings file.
969
971
  Here's the command-line option to add to tests: (See [examples/custom_settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/custom_settings.py))
970
- ``--settings_file=custom_settings.py``
972
+ `--settings_file=custom_settings.py`
971
973
  (Settings include default timeout values, a two-factor auth key, DB credentials, S3 credentials, and other important settings used by tests.)
972
974
 
973
- 🔵 To pass additional data from the command-line to tests, add ``--data="ANY STRING"``.
974
- Inside your tests, you can use ``self.data`` to access that.
975
+ 🔵 To pass additional data from the command-line to tests, add `--data="ANY STRING"`.
976
+ Inside your tests, you can use `self.data` to access that.
975
977
 
976
978
  <a id="directory_configuration"></a>
977
979
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
978
980
 
979
- 🔵 When running tests with **``pytest``**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **``pynose``**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Test folders should also include a blank **[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__init__.py)** file to allow your test files to import other files from that folder.
981
+ 🔵 When running tests with **`pytest`**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **`pynose`**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Test folders should also include a blank **[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__init__.py)** file to allow your test files to import other files from that folder.
980
982
 
981
- 🔵 ``sbase mkdir DIR`` creates a folder with config files and sample tests:
983
+ 🔵 `sbase mkdir DIR` creates a folder with config files and sample tests:
982
984
 
983
985
  ```zsh
984
986
  sbase mkdir ui_tests
@@ -1010,7 +1012,7 @@ ui_tests/
1010
1012
  └── swag_labs_test.py
1011
1013
  ```
1012
1014
 
1013
- <b>ProTip™:</b> You can also create a boilerplate folder without any sample tests in it by adding ``-b`` or ``--basic`` to the ``sbase mkdir`` command:
1015
+ <b>ProTip™:</b> You can also create a boilerplate folder without any sample tests in it by adding `-b` or `--basic` to the `sbase mkdir` command:
1014
1016
 
1015
1017
  ```zsh
1016
1018
  sbase mkdir ui_tests --basic
@@ -1026,7 +1028,16 @@ ui_tests/
1026
1028
  └── setup.cfg
1027
1029
  ```
1028
1030
 
1029
- Of those files, the ``pytest.ini`` config file is the most important, followed by a blank ``__init__.py`` file. There's also a ``setup.cfg`` file (for pynose). Finally, the ``requirements.txt`` file can be used to help you install seleniumbase into your environments (if it's not already installed).
1031
+ Of those files, the `pytest.ini` config file is the most important, followed by a blank `__init__.py` file. There's also a `setup.cfg` file (for pynose). Finally, the `requirements.txt` file can be used to help you install seleniumbase into your environments (if it's not already installed).
1032
+
1033
+ <b>ProTip™:</b> Add `--gha` to include a GitHub Actions `.yml` file with default settings:
1034
+
1035
+ ```zsh
1036
+ ui_tests/
1037
+ └── .github
1038
+ └── workflows/
1039
+ └── python-package.yml
1040
+ ```
1030
1041
 
1031
1042
  --------
1032
1043
 
@@ -1046,20 +1057,20 @@ class MyTestClass(BaseCase):
1046
1057
  self.assert_element("div#ARMY_OF_ROBOTS", timeout=1) # This should fail
1047
1058
  ```
1048
1059
 
1049
- You can run it from the ``examples/`` folder like this:
1060
+ You can run it from the `examples/` folder like this:
1050
1061
 
1051
1062
  ```zsh
1052
1063
  pytest test_fail.py
1053
1064
  ```
1054
1065
 
1055
- 🔵 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.
1066
+ 🔵 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.
1056
1067
 
1057
1068
  --------
1058
1069
 
1059
1070
  <a id="seleniumbase_dashboard"></a>
1060
1071
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
1061
1072
 
1062
- 🔵 The ``--dashboard`` option for pytest generates a SeleniumBase Dashboard located at ``dashboard.html``, which updates automatically as tests run and produce results. Example:
1073
+ 🔵 The `--dashboard` option for pytest generates a SeleniumBase Dashboard located at `dashboard.html`, which updates automatically as tests run and produce results. Example:
1063
1074
 
1064
1075
  ```zsh
1065
1076
  pytest --dashboard --rs --headless
@@ -1067,13 +1078,13 @@ pytest --dashboard --rs --headless
1067
1078
 
1068
1079
  <img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" />
1069
1080
 
1070
- 🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's ``http.server``:
1081
+ 🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's `http.server`:
1071
1082
 
1072
1083
  ```zsh
1073
1084
  python -m http.server 1948
1074
1085
  ```
1075
1086
 
1076
- 🔵 Now you can navigate to ``http://localhost:1948/dashboard.html`` in order to view the dashboard as a web app. This requires two different terminal windows: one for running the server, and another for running the tests, which should be run from the same directory. (Use <kbd>Ctrl+C</kbd> to stop the http server.)
1087
+ 🔵 Now you can navigate to `http://localhost:1948/dashboard.html` in order to view the dashboard as a web app. This requires two different terminal windows: one for running the server, and another for running the tests, which should be run from the same directory. (Use <kbd>Ctrl+C</kbd> to stop the http server.)
1077
1088
 
1078
1089
  🔵 Here's a full example of what the SeleniumBase Dashboard may look like:
1079
1090
 
@@ -1090,7 +1101,7 @@ pytest test_suite.py test_image_saving.py --dashboard --rs --headless
1090
1101
 
1091
1102
  <h3>🔵 <code>pytest</code> HTML Reports:</h3>
1092
1103
 
1093
- ✅ Using ``--html=report.html`` gives you a fancy report of the name specified after your test suite completes.
1104
+ ✅ Using `--html=report.html` gives you a fancy report of the name specified after your test suite completes.
1094
1105
 
1095
1106
  ```zsh
1096
1107
  pytest test_suite.py --html=report.html
@@ -1098,7 +1109,7 @@ pytest test_suite.py --html=report.html
1098
1109
 
1099
1110
  <img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
1100
1111
 
1101
- ✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: ``--dashboard --html=dashboard.html``), then the Dashboard will become an advanced html report when all the tests complete.
1112
+ ✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: `--dashboard --html=dashboard.html`), then the Dashboard will become an advanced html report when all the tests complete.
1102
1113
 
1103
1114
  ✅ Here's an example of an upgraded html report:
1104
1115
 
@@ -1110,7 +1121,7 @@ pytest test_suite.py --dashboard --html=report.html
1110
1121
 
1111
1122
  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/).
1112
1123
 
1113
- 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.
1124
+ 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.
1114
1125
 
1115
1126
  ```zsh
1116
1127
  pytest test_suite.py --junit-xml=report.xml
@@ -1118,7 +1129,7 @@ pytest test_suite.py --junit-xml=report.xml
1118
1129
 
1119
1130
  <h3>🔵 <code>pynose</code> Reports:</h3>
1120
1131
 
1121
- The ``--report`` option gives you a fancy report after your test suite completes.
1132
+ The `--report` option gives you a fancy report after your test suite completes.
1122
1133
 
1123
1134
  ```zsh
1124
1135
  pynose test_suite.py --report
@@ -1126,7 +1137,7 @@ pynose test_suite.py --report
1126
1137
 
1127
1138
  <img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
1128
1139
 
1129
- (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.)
1140
+ (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.)
1130
1141
 
1131
1142
  <h3>🔵 <code>behave</code> Dashboard & Reports:</h3>
1132
1143
 
@@ -1138,7 +1149,7 @@ behave behave_bdd/features/ -D dashboard -D headless
1138
1149
 
1139
1150
  <img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520">
1140
1151
 
1141
- 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.
1152
+ 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.
1142
1153
 
1143
1154
  ```zsh
1144
1155
  behave behave_bdd/features/ --junit -D rs -D headless
@@ -1148,7 +1159,7 @@ behave behave_bdd/features/ --junit -D rs -D headless
1148
1159
 
1149
1160
  See: [https://allurereport.org/docs/pytest/](https://allurereport.org/docs/pytest/)
1150
1161
 
1151
- SeleniumBase no longer includes ``allure-pytest`` as part of installed dependencies. If you want to use it, install it first:
1162
+ SeleniumBase no longer includes `allure-pytest` as part of installed dependencies. If you want to use it, install it first:
1152
1163
 
1153
1164
  ```zsh
1154
1165
  pip install allure-pytest
@@ -1164,7 +1175,7 @@ pytest test_suite.py --alluredir=allure_results
1164
1175
 
1165
1176
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
1166
1177
 
1167
- If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add ``--proxy=IP_ADDRESS:PORT`` as an argument on the command line.
1178
+ If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add `--proxy=IP_ADDRESS:PORT` as an argument on the command line.
1168
1179
 
1169
1180
  ```zsh
1170
1181
  pytest proxy_test.py --proxy=IP_ADDRESS:PORT
@@ -1184,7 +1195,7 @@ pytest proxy_test.py --proxy="socks4://IP_ADDRESS:PORT"
1184
1195
  pytest proxy_test.py --proxy="socks5://IP_ADDRESS:PORT"
1185
1196
  ```
1186
1197
 
1187
- To make things easier, you can add your frequently-used proxies to PROXY_LIST in [proxy_list.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/proxy_list.py), and then use ``--proxy=KEY_FROM_PROXY_LIST`` to use the IP_ADDRESS:PORT of that key.
1198
+ To make things easier, you can add your frequently-used proxies to PROXY_LIST in [proxy_list.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/proxy_list.py), and then use `--proxy=KEY_FROM_PROXY_LIST` to use the IP_ADDRESS:PORT of that key.
1188
1199
 
1189
1200
  ```zsh
1190
1201
  pytest proxy_test.py --proxy=proxy1
@@ -1193,7 +1204,7 @@ pytest proxy_test.py --proxy=proxy1
1193
1204
 
1194
1205
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Changing the User-Agent:</h3>
1195
1206
 
1196
- 🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add ``--agent="USER AGENT STRING"`` as an argument on the command-line.
1207
+ 🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add `--agent="USER AGENT STRING"` as an argument on the command-line.
1197
1208
 
1198
1209
  ```zsh
1199
1210
  pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU"
@@ -1207,7 +1218,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
1207
1218
 
1208
1219
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
1209
1220
 
1210
- 🔵 Learn about <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the ``examples/tour_examples/`` folder). It's great for prototyping a website onboarding experience.
1221
+ 🔵 Learn about <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the `examples/tour_examples/` folder). It's great for prototyping a website onboarding experience.
1211
1222
 
1212
1223
 
1213
1224
  <a id="utilizing_advanced_features"></a>
@@ -1276,7 +1287,7 @@ To click an element on the page:
1276
1287
  self.click("div#my_id")
1277
1288
  ```
1278
1289
 
1279
- **ProTip™:** In most web browsers, you can right-click on a page and select ``Inspect Element`` to see the CSS selector details that you'll need to create your own scripts.
1290
+ **ProTip™:** In most web browsers, you can right-click on a page and select `Inspect Element` to see the CSS selector details that you'll need to create your own scripts.
1280
1291
 
1281
1292
  🔵 **Typing Text:**
1282
1293
 
@@ -1306,7 +1317,7 @@ attribute = self.get_attribute("#comic img", "title")
1306
1317
  self.wait_for_element_present("div.my_class", timeout=10)
1307
1318
  ```
1308
1319
 
1309
- (NOTE: You can also use: ``self.assert_element_present(ELEMENT)``)
1320
+ (NOTE: You can also use: `self.assert_element_present(ELEMENT)`)
1310
1321
 
1311
1322
  🔵 **Asserting visibility of an element on a page within some number of seconds:**
1312
1323
 
@@ -1314,9 +1325,9 @@ self.wait_for_element_present("div.my_class", timeout=10)
1314
1325
  self.wait_for_element_visible("a.my_class", timeout=5)
1315
1326
  ```
1316
1327
 
1317
- (NOTE: The short versions of that are ``self.find_element(ELEMENT)`` and ``self.assert_element(ELEMENT)``. The ``find_element()`` version returns the element.)
1328
+ (NOTE: The short versions of that are `self.find_element(ELEMENT)` and `self.assert_element(ELEMENT)`. The `find_element()` version returns the element.)
1318
1329
 
1319
- Since the line above returns the element, you can combine that with ``.click()`` as shown below:
1330
+ Since the line above returns the element, you can combine that with `.click()` as shown below:
1320
1331
 
1321
1332
  ```python
1322
1333
  self.find_element("a.my_class", timeout=5).click()
@@ -1326,9 +1337,9 @@ self.find_element("a.my_class", timeout=5).click()
1326
1337
  self.click("a.my_class") # DO IT THIS WAY!
1327
1338
  ```
1328
1339
 
1329
- **ProTip™:** You can use dots to signify class names (Ex: ``div.class_name``) as a simplified version of ``div[class="class_name"]`` within a CSS selector.
1340
+ **ProTip™:** You can use dots to signify class names (Ex: `div.class_name`) as a simplified version of `div[class="class_name"]` within a CSS selector.
1330
1341
 
1331
- You can also use ``*=`` to search for any partial value in a CSS selector as shown below:
1342
+ You can also use `*=` to search for any partial value in a CSS selector as shown below:
1332
1343
 
1333
1344
  ```python
1334
1345
  self.click('a[name*="partial_name"]')
@@ -1341,7 +1352,7 @@ self.assert_text("Make it so!", "div#trek div.picard div.quotes")
1341
1352
  self.assert_text("Tea. Earl Grey. Hot.", "div#trek div.picard div.quotes", timeout=3)
1342
1353
  ```
1343
1354
 
1344
- (NOTE: ``self.find_text(TEXT, ELEMENT)`` and ``self.wait_for_text(TEXT, ELEMENT)`` also do this. For backwards compatibility, older method names were kept, but the default timeout may be different.)
1355
+ (NOTE: `self.find_text(TEXT, ELEMENT)` and `self.wait_for_text(TEXT, ELEMENT)` also do this. For backwards compatibility, older method names were kept, but the default timeout may be different.)
1345
1356
 
1346
1357
  🔵 **Asserting Anything:**
1347
1358
 
@@ -1355,14 +1366,14 @@ self.assert_equal(var1, var2)
1355
1366
 
1356
1367
  🔵 **Useful Conditional Statements: (with creative examples)**
1357
1368
 
1358
- ``is_element_visible(selector):`` (visible on the page)
1369
+ `is_element_visible(selector):` (visible on the page)
1359
1370
 
1360
1371
  ```python
1361
1372
  if self.is_element_visible('div#warning'):
1362
1373
  print("Red Alert: Something bad might be happening!")
1363
1374
  ```
1364
1375
 
1365
- ``is_element_present(selector):`` (present in the HTML)
1376
+ `is_element_present(selector):` (present in the HTML)
1366
1377
 
1367
1378
  ```python
1368
1379
  if self.is_element_present('div#top_secret img.tracking_cookie'):
@@ -1379,7 +1390,7 @@ def is_there_a_cloaked_klingon_ship_on_this_page():
1379
1390
  return False
1380
1391
  ```
1381
1392
 
1382
- ``is_text_visible(text, selector):`` (text visible on element)
1393
+ `is_text_visible(text, selector):` (text visible on element)
1383
1394
 
1384
1395
  ```python
1385
1396
  if self.is_text_visible("You Shall Not Pass!", "h1"):
@@ -1419,7 +1430,7 @@ def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year):
1419
1430
 
1420
1431
  </details>
1421
1432
 
1422
- ``is_link_text_visible(link_text):``
1433
+ `is_link_text_visible(link_text):`
1423
1434
 
1424
1435
  ```python
1425
1436
  if self.is_link_text_visible("Stop! Hammer time!"):
@@ -1444,7 +1455,7 @@ self.switch_to_frame("iframe")
1444
1455
  self.switch_to_parent_frame() # Exit the current iframe
1445
1456
  ```
1446
1457
 
1447
- To exit from multiple iframes, use ``self.switch_to_default_content()``. (If inside a single iframe, this has the same effect as ``self.switch_to_parent_frame()``.)
1458
+ To exit from multiple iframes, use `self.switch_to_default_content()`. (If inside a single iframe, this has the same effect as `self.switch_to_parent_frame()`.)
1448
1459
 
1449
1460
  ```python
1450
1461
  self.switch_to_frame('iframe[name="frame1"]')
@@ -1517,7 +1528,7 @@ self.execute_script("return jQuery('textarea')[2].value") # Returns the css "va
1517
1528
 
1518
1529
  <h3>🔵 How to handle a restrictive CSP:</h3>
1519
1530
 
1520
- ❗ Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on those websites, add ``--disable-csp`` as a ``pytest`` command-line option to load a Chromium extension that bypasses the CSP.
1531
+ ❗ Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on those websites, add `--disable-csp` as a `pytest` command-line option to load a Chromium extension that bypasses the CSP.
1521
1532
 
1522
1533
  <h3>🔵 More JavaScript fun:</h3>
1523
1534