| [build-system] | |
| requires = ["setuptools", "setuptools-rust"] | |
| build-backend = "setuptools.build_meta" | |
| [project] | |
| name = "selenium" | |
| version = "4.40.0.202512070022" | |
| license = "Apache-2.0" | |
| license-files = ["LICENSE", "NOTICE"] | |
| description = "Official Python bindings for Selenium WebDriver." | |
| readme = "README.rst" | |
| requires-python = ">=3.10" | |
| classifiers = [ | |
| "Development Status :: 5 - Production/Stable", | |
| "Intended Audience :: Developers", | |
| "Operating System :: POSIX", | |
| "Operating System :: Microsoft :: Windows", | |
| "Operating System :: MacOS :: MacOS X", | |
| "Topic :: Software Development :: Testing", | |
| "Topic :: Software Development :: Libraries", | |
| "Programming Language :: Python", | |
| "Programming Language :: Python :: 3.10", | |
| "Programming Language :: Python :: 3.11", | |
| "Programming Language :: Python :: 3.12", | |
| "Programming Language :: Python :: 3.13", | |
| "Programming Language :: Python :: 3.14", | |
| ] | |
| dependencies = [ | |
| "certifi>=2026.1.4", | |
| "trio>=0.31.0,<1.0", | |
| "trio-websocket>=0.12.2,<1.0", | |
| "trio-typing>=0.10.0", | |
| "types-certifi>=2021.10.8.3", | |
| "types-urllib3>=1.26.25.14", | |
| "typing_extensions>=4.15.0,<5.0", | |
| "urllib3[socks]>=2.6.3,<3.0", | |
| "websocket-client>=1.8.0,<2.0", | |
| ] | |
| [project.urls] | |
| homepage = "https://www.selenium.dev" | |
| source = "https://github.com/SeleniumHQ/selenium/tree/trunk/py" | |
| download = "https://pypi.org/project/selenium" | |
| changelog = "https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES" | |
| documentation = "https://www.selenium.dev/documentation/webdriver" | |
| issues = "https://github.com/SeleniumHQ/selenium/issues" | |
| [dependency-groups] | |
| lint = [ | |
| "ruff==0.14.10", | |
| ] | |
| typecheck = [ | |
| "mypy==1.19.1", | |
| ] | |
| validate = [ | |
| "validate-pyproject==0.24.1", | |
| "packaging==25.0", | |
| ] | |
| [tool.setuptools] | |
| zip-safe = false | |
| [tool.setuptools.packages.find] | |
| include = ["selenium*"] | |
| exclude = ["test*"] | |
| namespaces = true | |
| # include-package-data is `true` by default in pyproject.toml | |
| [[tool.setuptools-rust.ext-modules]] | |
| target = "selenium.webdriver.common.selenium-manager" | |
| binding = "Exec" | |
| [tool.setuptools.package-data] | |
| "*" = [ | |
| "*.py", | |
| "*.rst", | |
| "*.json", | |
| "*.xpi", | |
| "*.js", | |
| "py.typed", | |
| "prune*", | |
| "selenium.egg-info*", | |
| "selenium-manager", | |
| "selenium-manager.exe", | |
| "CHANGES", | |
| "LICENSE", | |
| "NOTICE", | |
| ] | |
| [tool.pytest] | |
| console_output_style = "progress" | |
| faulthandler_timeout = "60" | |
| log_cli = true | |
| trio_mode = true | |
| addopts = ["-s", "--tb=no"] | |
| filterwarnings = [ | |
| "ignore::DeprecationWarning", | |
| ] | |
| markers = [ | |
| "xfail_chrome: Tests expected to fail in Chrome", | |
| "xfail_edge: Tests expected to fail in Edge", | |
| "xfail_firefox: Tests expected to fail in Firefox", | |
| "xfail_ie: Tests expected to fail in IE", | |
| "xfail_remote: Tests expected to fail with Remote webdriver", | |
| "xfail_safari: Tests expected to fail in Safari", | |
| "xfail_webkitgtk: Tests expected to fail in WebKitGTK", | |
| "xfail_wpewebkit: Tests expected to fail in WPEWebKit", | |
| "no_driver_after_test: If there are no drivers after the test it will create a new one.", | |
| "needs_fresh_driver: Mark tests that may need a fresh driver instance for proper isolation." | |
| ] | |
| python_files = ["test_*.py", "*_test.py", "*_tests.py"] | |
| testpaths = ["test"] | |
| # mypy global options | |
| [tool.mypy] | |
| exclude = "selenium/webdriver/common/devtools" | |
| # The aim in future is we would be able to turn (most) of these flags on | |
| # warn about per-module sections in the config file that do not match any files processed. | |
| warn_unused_configs = true | |
| # disallows subclassing of typing.Any. | |
| disallow_subclassing_any = true | |
| # disallow usage of generic types that do not specify explicit type parameters. | |
| disallow_any_generics = false | |
| # disallow calling functions without type annotations from functions that have type annotations. | |
| disallow_untyped_calls = false | |
| # disallow defining functions without type annotations or with incomplete annotations. | |
| disallow_untyped_defs = false | |
| # disallow defining functions with incomplete type annotations. | |
| disallow_incomplete_defs = false | |
| # type-checks the interior of functions without type annotations. | |
| check_untyped_defs = false | |
| # reports an error whenever a function with type annotations is decorated with a decorator without annotations. | |
| disallow_untyped_decorators = false | |
| # changes the treatment of arguments with a default value of None by not implicitly making their type `typing.Optional`. | |
| no_implicit_optional = true | |
| # warns about casting an expression to it's inferred type. | |
| warn_redundant_casts = true | |
| # warns about unneeded `# type: ignore` comments. | |
| warn_unused_ignores = true | |
| # warns when returning a value with typing.Any from a function with a non typing.Any return type. | |
| warn_return_any = false | |
| # Shows a warning when encountering any code inferred to be unreachable after performing type analysis. | |
| warn_unreachable = false | |
| [tool.ruff] | |
| extend-exclude = [ | |
| "selenium/webdriver/common/devtools/", | |
| ] | |
| line-length = 120 | |
| respect-gitignore = true | |
| target-version = "py310" | |
| [tool.ruff.lint] | |
| extend-select = ["D", "E", "F", "I", "PT", "UP", "RUF", "TID252"] | |
| fixable = ["ALL"] | |
| extend-ignore = [ | |
| "D100", # Missing docstring in public module | |
| "D101", # Missing docstring in public class | |
| "D102", # Missing docstring in public method | |
| "D103", # Missing docstring in public function | |
| "D104", # Missing docstring in public package | |
| "D105", # Missing docstring in magic method | |
| "D107", # Missing docstring in `__init__` | |
| "D212", # Multi-line docstring summary should start at the first line | |
| "PT011", # Use of `pytest.raises({exception})` is too broad | |
| "PT012", # `pytest.raises()` block should contain a single simple statement | |
| "RUF005", # Uses of the + operator to concatenate collections | |
| "RUF012", # Mutable default values in class attributes | |
| "RUF059", # Unpacked variable is never used | |
| ] | |
| [tool.ruff.format] | |
| docstring-code-format = true | |
| docstring-code-line-length = 120 | |
| [tool.ruff.lint.pydocstyle] | |
| convention = "google" |