[build-system] requires = ["setuptools", "setuptools-rust"] build-backend = "setuptools.build_meta" [project] name = "selenium" version = "4.42.0.202602192150" 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", "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.15.6", ] validate = [ "validate-pyproject==0.25", "packaging==26.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", "*.pyi", "*.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.isort] known-first-party = ["selenium", "test"] known-third-party = [] known-local-folder = ["conftest"] [tool.ruff.lint.pydocstyle] convention = "google"