| load("@aspect_bazel_lib//lib:copy_directory.bzl", "copy_directory") |
| load("@bazel_skylib//rules:select_file.bzl", "select_file") |
| load("@py_dev_requirements//:requirements.bzl", "requirement") |
| load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix") |
| load("@rules_pkg//pkg:pkg.bzl", "pkg_tar") |
| load("@rules_python//python:defs.bzl", "py_binary", "py_library") |
| load("@rules_python//python:packaging.bzl", "py_package", "py_wheel") |
| load("@rules_python//python:pip.bzl", "compile_pip_requirements") |
| load("@rules_python//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") |
| load("//common:defs.bzl", "copy_file") |
| load("//py:defs.bzl", "generate_devtools", "py_test_suite") |
| load("//py/private:browsers.bzl", "BROWSERS") |
| load("//py/private:import.bzl", "py_import") |
| |
| py_binary( |
| name = "selenium-release", |
| srcs = [ |
| "release-selenium.py", |
| ], |
| args = [ |
| "upload", |
| "$(location :selenium-wheel)", |
| "$(location :selenium-sdist)", |
| ], |
| data = [ |
| ":selenium-sdist", |
| ":selenium-wheel", |
| ], |
| main = "release-selenium.py", |
| deps = [ |
| requirement("twine"), |
| ], |
| ) |
| |
| py_binary( |
| name = "selenium-release-nightly", |
| srcs = [ |
| "release-selenium.py", |
| ], |
| args = [ |
| "upload", |
| "--repository", |
| "testpypi", |
| "$(location :selenium-wheel)", |
| "$(location :selenium-sdist)", |
| ], |
| data = [ |
| ":selenium-sdist", |
| ":selenium-wheel", |
| ], |
| main = "release-selenium.py", |
| deps = [ |
| requirement("twine"), |
| ], |
| ) |
| |
| compile_pip_requirements( |
| # base name for generated targets, typically "requirements" |
| name = "requirements", |
| requirements_in = ":requirements.txt", |
| requirements_txt = ":requirements_lock.txt", |
| tags = [ |
| "skip-rbe", # This test won't run on the RBE because of a lack of network connectivity |
| ], |
| ) |
| |
| SE_VERSION = "4.41.0.202601181916" |
| |
| BROWSER_VERSIONS = [ |
| "v143", |
| "v144", |
| "v142", |
| ] |
| |
| TEST_DEPS = [ |
| requirement("filetype"), |
| requirement("pytest"), |
| requirement("pytest-instafail"), |
| requirement("pytest-trio"), |
| requirement("pytest-mock"), |
| requirement("rich"), |
| requirement("zipp"), |
| "@rules_python//python/runfiles", |
| ] |
| |
| genrule( |
| name = "java-location", |
| srcs = [], |
| outs = ["java-location.txt"], |
| cmd = "echo $(JAVA) > $@", |
| toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"], |
| ) |
| |
| copy_file( |
| name = "manager-linux", |
| src = "//common/manager:selenium-manager-linux", |
| out = "selenium/webdriver/common/linux/selenium-manager", |
| ) |
| |
| copy_file( |
| name = "manager-macos", |
| src = "//common/manager:selenium-manager-macos", |
| out = "selenium/webdriver/common/macos/selenium-manager", |
| ) |
| |
| copy_file( |
| name = "manager-windows", |
| src = "//common/manager:selenium-manager-windows", |
| out = "selenium/webdriver/common/windows/selenium-manager.exe", |
| ) |
| |
| copy_file( |
| name = "get-attribute", |
| src = "//javascript/webdriver/atoms:get-attribute.js", |
| out = "selenium/webdriver/remote/getAttribute.js", |
| ) |
| |
| copy_file( |
| name = "is-displayed", |
| src = "//javascript/atoms/fragments:is-displayed.js", |
| out = "selenium/webdriver/remote/isDisplayed.js", |
| ) |
| |
| copy_file( |
| name = "find-elements", |
| src = "//javascript/atoms/fragments:find-elements.js", |
| out = "selenium/webdriver/remote/findElements.js", |
| ) |
| |
| copy_file( |
| name = "mutation-listener", |
| src = "//javascript/cdp-support:mutation-listener.js", |
| out = "selenium/webdriver/common/mutation-listener.js", |
| ) |
| |
| copy_file( |
| name = "firefox-driver-prefs", |
| src = "//third_party/js/selenium:webdriver_json", |
| out = "selenium/webdriver/firefox/webdriver_prefs.json", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-xpi", |
| src = "//common/extensions:webextensions-selenium-example.xpi", |
| out = "test/extensions/webextensions-selenium-example.xpi", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-zip", |
| src = "//common/extensions:webextensions-selenium-example.zip", |
| out = "test/extensions/webextensions-selenium-example.zip", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-unsigned-zip", |
| src = "//common/extensions:webextensions-selenium-example-unsigned.zip", |
| out = "test/extensions/webextensions-selenium-example-unsigned.zip", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-crx", |
| src = "//common/extensions:webextensions-selenium-example.crx", |
| out = "test/extensions/webextensions-selenium-example.crx", |
| ) |
| |
| copy_directory( |
| name = "webextensions-selenium-example-dir", |
| src = "//common/extensions:webextensions-selenium-example", |
| out = "test/extensions/webextensions-selenium-example", |
| ) |
| |
| copy_directory( |
| name = "webextensions-selenium-example-signed-dir", |
| src = "//common/extensions:webextensions-selenium-example-signed", |
| out = "test/extensions/webextensions-selenium-example-signed", |
| ) |
| |
| select_file( |
| name = "global-license", |
| srcs = "//:license", |
| subpath = "LICENSE", |
| ) |
| |
| copy_file( |
| name = "license", |
| src = ":global-license", |
| out = "LICENSE", |
| ) |
| |
| copy_file( |
| name = "license-wheel", |
| src = ":global-license", |
| out = "selenium-%s.dist-info/LICENSE" % SE_VERSION, |
| ) |
| |
| select_file( |
| name = "global-notice", |
| srcs = "//:license", |
| subpath = "NOTICE", |
| ) |
| |
| copy_file( |
| name = "notice", |
| src = ":global-notice", |
| out = "NOTICE", |
| ) |
| |
| copy_file( |
| name = "notice-wheel", |
| src = ":global-notice", |
| out = "selenium-%s.dist-info/NOTICE" % SE_VERSION, |
| ) |
| |
| py_library( |
| name = "selenium", |
| srcs = glob( |
| ["selenium/**/*.py"], |
| exclude = [ |
| "generate.py", |
| "selenium/webdriver/common/devtools/v*/**", |
| ], |
| ), |
| data = [ |
| "selenium/py.typed", |
| ":find-elements", |
| ":firefox-driver-prefs", |
| ":get-attribute", |
| ":is-displayed", |
| ":manager-linux", |
| ":manager-macos", |
| ":manager-windows", |
| ":mutation-listener", |
| ] + [":create-cdp-srcs-" + n for n in BROWSER_VERSIONS], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| requirement("urllib3"), |
| requirement("trio"), |
| requirement("trio-websocket"), |
| requirement("certifi"), |
| requirement("typing_extensions"), |
| requirement("websocket-client"), |
| ], |
| ) |
| |
| py_package( |
| name = "selenium-pkg", |
| packages = [ |
| "py.selenium", |
| "py.selenium.common", |
| "py.selenium.webdriver", |
| "py.selenium.webdriver.chrome", |
| "py.selenium.webdriver.chromium", |
| "py.selenium.webdriver.common", |
| "py.selenium.webdriver.common.bidi", |
| "py.selenium.webdriver.common.devtools", |
| "py.selenium.webdriver.edge", |
| "py.selenium.webdriver.firefox", |
| "py.selenium.webdriver.remote", |
| "py.selenium.webdriver.safari", |
| ], |
| deps = [":selenium"], |
| ) |
| |
| pkg_files( |
| name = "selenium-sdist-pkg", |
| srcs = [ |
| "CHANGES", |
| "README.rst", |
| "pyproject.toml", |
| ":license", |
| ":notice", |
| ":selenium-pkg", |
| ":selenium-pkginfo", |
| "//rust:selenium_manager_srcs", |
| ], |
| excludes = [ |
| ":manager-linux", |
| ":manager-macos", |
| ":manager-windows", |
| ], |
| strip_prefix = strip_prefix.from_pkg(), |
| ) |
| |
| pkg_tar( |
| name = "selenium-sdist", |
| srcs = [":selenium-sdist-pkg"], |
| extension = "tar.gz", |
| mode = "0644", |
| package_dir = "selenium-%s" % SE_VERSION, |
| package_file_name = "selenium-%s.tar.gz" % SE_VERSION, |
| ) |
| |
| genrule( |
| name = "selenium-pkginfo", |
| srcs = [":selenium-wheel-lib"], |
| outs = ["PKG-INFO"], |
| cmd = "cp $(location :selenium-wheel-lib)/selenium-%s.dist-info/METADATA $@" % SE_VERSION, |
| ) |
| |
| py_import( |
| name = "selenium-wheel-lib", |
| wheel = ":selenium-wheel", |
| ) |
| |
| py_wheel( |
| name = "selenium-wheel", |
| 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", |
| ], |
| description_file = "README.rst", |
| distribution = "selenium", |
| homepage = "https://www.selenium.dev", |
| license = "Apache-2.0", |
| python_requires = ">=3.10", |
| python_tag = "py3", |
| requires = [ |
| "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", |
| ], |
| strip_path_prefixes = [ |
| "py/", |
| ], |
| summary = "Official Python bindings for Selenium WebDriver", |
| tags = [ |
| "release-artifact", |
| ], |
| version = SE_VERSION, |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":license-wheel", |
| ":notice-wheel", |
| ":selenium-pkg", |
| ], |
| ) |
| |
| py_library( |
| name = "init-tree", |
| testonly = True, |
| srcs = [ |
| "conftest.py", |
| "test/__init__.py", |
| "test/selenium/__init__.py", |
| "test/selenium/webdriver/__init__.py", |
| "test/selenium/webdriver/chrome/__init__.py", |
| "test/selenium/webdriver/common/__init__.py", |
| "test/selenium/webdriver/common/network.py", |
| "test/selenium/webdriver/common/webserver.py", |
| "test/selenium/webdriver/firefox/__init__.py", |
| "test/selenium/webdriver/safari/conftest.py", |
| "test/selenium/webdriver/support/__init__.py", |
| ], |
| data = [ |
| "pyproject.toml", |
| "test/selenium/webdriver/common/test_file.txt", |
| "test/selenium/webdriver/common/test_file2.txt", |
| ":webextensions-selenium-example-crx", |
| ":webextensions-selenium-example-dir", |
| ":webextensions-selenium-example-signed-dir", |
| ":webextensions-selenium-example-unsigned-zip", |
| ":webextensions-selenium-example-xpi", |
| ":webextensions-selenium-example-zip", |
| ], |
| imports = ["."], |
| deps = [ |
| ":webserver", |
| ], |
| ) |
| |
| py_binary( |
| name = "generate", |
| srcs = ["generate.py"], |
| srcs_version = "PY3", |
| deps = [requirement("inflection")], |
| ) |
| |
| [generate_devtools( |
| name = "create-cdp-srcs-{}".format(devtools_version), |
| browser_protocol = "//common/devtools/chromium/{}:browser_protocol".format(devtools_version), |
| generator = ":generate", |
| js_protocol = "//common/devtools/chromium/{}:js_protocol".format(devtools_version), |
| outdir = "selenium/webdriver/common/devtools/{}".format(devtools_version), |
| protocol_version = devtools_version, |
| ) for devtools_version in BROWSER_VERSIONS] |
| |
| py_test_suite( |
| name = "unit", |
| size = "small", |
| srcs = glob([ |
| "test/unit/**/*.py", |
| ]), |
| args = [ |
| "--instafail", |
| ], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ] + TEST_DEPS, |
| ) |
| |
| py_library( |
| name = "webserver", |
| testonly = True, |
| srcs = [ |
| "test/selenium/webdriver/common/network.py", |
| "test/selenium/webdriver/common/webserver.py", |
| ], |
| data = [ |
| "//common/src/web", |
| ], |
| deps = [], |
| ) |
| |
| BIDI_TESTS = glob(["test/selenium/webdriver/common/**/*bidi*_tests.py"]) |
| |
| # Browser-specific test configuration |
| BROWSER_TESTS = { |
| "chrome": { |
| "browser_srcs": ["test/selenium/webdriver/chrome/**/*.py"], |
| "bidi": True, |
| }, |
| "edge": { |
| "browser_srcs": ["test/selenium/webdriver/edge/**/*.py"], |
| }, |
| "firefox": { |
| "browser_srcs": [ |
| "test/selenium/webdriver/firefox/**/*.py", |
| ], |
| "extra_excludes": ["test/selenium/webdriver/common/devtools_tests.py"], |
| "bidi": True, |
| }, |
| "ie": { |
| "browser_srcs": ["test/selenium/webdriver/ie/**/*.py"], |
| }, |
| "safari": { |
| "browser_srcs": ["test/selenium/webdriver/safari/**/*.py"], |
| }, |
| } |
| |
| # Generate test-<browser> targets (non-bidi) |
| [ |
| py_test_suite( |
| name = "test-%s" % browser, |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ] + BROWSER_TESTS[browser]["browser_srcs"], |
| exclude = BIDI_TESTS + ["test/selenium/webdriver/common/print_pdf_tests.py"] + |
| BROWSER_TESTS[browser].get("extra_excludes", []), |
| ), |
| args = [ |
| "--instafail", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| for browser in BROWSER_TESTS.keys() |
| ] |
| |
| # Generate test-<browser>-bidi targets (only for browsers with bidi=True) |
| [ |
| py_test_suite( |
| name = "test-%s-bidi" % browser, |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ] + BROWSER_TESTS[browser]["browser_srcs"], |
| exclude = ["test/selenium/webdriver/common/print_pdf_tests.py"] + |
| BROWSER_TESTS[browser].get("extra_excludes", []), |
| ), |
| args = [ |
| "--instafail", |
| "--bidi", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| for browser in BROWSER_TESTS.keys() |
| if BROWSER_TESTS[browser].get("bidi", False) |
| ] |
| |
| # Generate test-<browser>-remote targets (chrome and firefox only) |
| [ |
| py_test_suite( |
| name = "test-%s-remote" % browser, |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/remote/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ] + BROWSER_TESTS[browser]["browser_srcs"], |
| exclude = BIDI_TESTS + ["test/selenium/webdriver/common/print_pdf_tests.py"] + |
| BROWSER_TESTS[browser].get("extra_excludes", []), |
| ), |
| args = [ |
| "--instafail", |
| "--remote", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"] + [ |
| ":java-location", |
| "//java/src/org/openqa/selenium/grid:selenium_server_deploy.jar", |
| "@bazel_tools//tools/jdk:current_java_runtime", |
| ], |
| env = { |
| "SE_BAZEL_JAVA_LOCATION": "$(rootpath :java-location)", |
| }, |
| env_inherit = ["DISPLAY"], |
| tags = [ |
| "no-sandbox", |
| "remote", |
| "%s-remote" % browser, |
| ], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| for browser in [ |
| "chrome", |
| "firefox", |
| ] |
| ] |
| |
| test_suite( |
| name = "test-remote", |
| tags = ["remote"], |
| tests = [ |
| ":test-chrome-remote", |
| ":test-firefox-remote", |
| ], |
| ) |
| |
| py_test_suite( |
| name = "test-webkitgtk", |
| size = "large", |
| srcs = glob([ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ]), |
| args = [ |
| "--instafail", |
| "--driver=webkitgtk", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| |
| py_test_suite( |
| name = "test-wpewebkit", |
| size = "large", |
| srcs = glob([ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ]), |
| args = [ |
| "--instafail", |
| "--driver=wpewebkit", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation --headless", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| deps = [ |
| ":init-tree", |
| ":selenium", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| |
| py_binary( |
| name = "generate-api-listing", |
| srcs = ["generate_api_module_listing.py"], |
| main = "generate_api_module_listing.py", |
| deps = [":selenium"], |
| ) |
| |
| py_binary( |
| name = "sphinx-autogen", |
| srcs = ["run_sphinx_autogen.py"], |
| main = "run_sphinx_autogen.py", |
| deps = [ |
| ":selenium", |
| requirement("sphinx"), |
| ], |
| ) |
| |
| sphinx_build_binary( |
| name = "sphinx-build", |
| deps = [ |
| ":selenium", |
| requirement("sphinx"), |
| requirement("sphinx-material"), |
| ], |
| ) |
| |
| sphinx_docs( |
| name = "docs", |
| srcs = glob(["docs/source/**/*.rst"]) + ["docs/source/conf.py"], |
| config = "docs/source/conf.py", |
| formats = ["html"], |
| sphinx = ":sphinx-build", |
| ) |
| |
| py_binary( |
| name = "mypy", |
| srcs = ["run_mypy.py"], |
| data = [ |
| "pyproject.toml", |
| ":selenium", |
| ], |
| main = "run_mypy.py", |
| deps = [ |
| ":selenium", |
| requirement("mypy"), |
| ], |
| ) |