| 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//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary") |
| load("//common:defs.bzl", "copy_file") |
| load("//py:defs.bzl", "generate_devtools", "generate_devtools_latest", "py_test_suite") |
| load("//py/private:browsers.bzl", "BROWSERS") |
| load("//py/private:generate_bidi.bzl", "generate_bidi") |
| load("//py/private:import.bzl", "py_import") |
| load("//py/private:sphinx_docs.bzl", "sphinx_docs") |
| |
| exports_files( |
| ["pyproject.toml"], |
| visibility = ["//py:__subpackages__"], |
| ) |
| |
| 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", |
| srcs = [ |
| "pyproject.toml", |
| "requirements.txt", |
| ], |
| extra_args = ["--no-strip-extras"], |
| 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.46.0.202606161656" |
| |
| BROWSER_VERSIONS = [ |
| "v149", |
| "v147", |
| "v148", |
| ] |
| |
| 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/atoms/fragments:get-attribute-typescript.js", |
| out = "selenium/webdriver/remote/getAttribute.js", |
| ) |
| |
| copy_file( |
| name = "is-displayed", |
| src = "//javascript/atoms/fragments:is-displayed-typescript.js", |
| out = "selenium/webdriver/remote/isDisplayed.js", |
| ) |
| |
| copy_file( |
| name = "find-elements", |
| src = "//javascript/atoms/fragments:find-elements-typescript.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 = "bidi-mutation-listener", |
| src = "//javascript/bidi-support:bidi-mutation-listener.js", |
| out = "selenium/webdriver/common/bidi-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", |
| testonly = True, |
| src = "//common/extensions:webextensions-selenium-example.xpi", |
| out = "test/extensions/webextensions-selenium-example.xpi", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-zip", |
| testonly = True, |
| src = "//common/extensions:webextensions-selenium-example.zip", |
| out = "test/extensions/webextensions-selenium-example.zip", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-unsigned-zip", |
| testonly = True, |
| src = "//common/extensions:webextensions-selenium-example-unsigned.zip", |
| out = "test/extensions/webextensions-selenium-example-unsigned.zip", |
| ) |
| |
| copy_file( |
| name = "webextensions-selenium-example-crx", |
| testonly = True, |
| src = "//common/extensions:webextensions-selenium-example.crx", |
| out = "test/extensions/webextensions-selenium-example.crx", |
| ) |
| |
| copy_directory( |
| name = "webextensions-selenium-example-dir", |
| testonly = True, |
| src = "//common/extensions:webextensions-selenium-example", |
| out = "test/extensions/webextensions-selenium-example", |
| ) |
| |
| copy_directory( |
| name = "webextensions-selenium-example-signed-dir", |
| testonly = True, |
| 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, |
| ) |
| |
| # ============================================================================== |
| # Module Targets (following Ruby's modular pattern) |
| # ============================================================================== |
| |
| # Exceptions and package init (no deps - foundational) |
| py_library( |
| name = "exceptions", |
| srcs = [ |
| "selenium/__init__.py", |
| "selenium/webdriver/__init__.py", |
| ] + glob(["selenium/common/**/*.py"]), |
| data = ["selenium/webdriver/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| ) |
| |
| # Remote/wire protocol (foundational) |
| py_library( |
| name = "remote", |
| srcs = glob(["selenium/webdriver/remote/**/*.py"]), |
| data = [ |
| ":find-elements", |
| ":get-attribute", |
| ":is-displayed", |
| ], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":exceptions", |
| requirement("certifi"), |
| requirement("urllib3"), |
| requirement("websocket-client"), |
| ], |
| ) |
| |
| # BiDi protocol support |
| py_library( |
| name = "bidi", |
| srcs = [":create-bidi-src"], |
| data = [ |
| ":bidi-mutation-listener", |
| ":mutation-listener", |
| ], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":exceptions", |
| ":remote", |
| requirement("trio"), |
| requirement("trio-websocket"), |
| requirement("websocket-client"), |
| ], |
| ) |
| |
| # Common utilities (shared by all browsers, includes devtools generated code) |
| py_library( |
| name = "common", |
| srcs = glob( |
| ["selenium/webdriver/common/**/*.py"], |
| exclude = [ |
| "selenium/webdriver/common/action_chains.py", |
| "selenium/webdriver/common/actions/**", |
| "selenium/webdriver/common/alert.py", |
| "selenium/webdriver/common/api_request_context.py", |
| "selenium/webdriver/common/bidi/**", |
| "selenium/webdriver/common/devtools/**", |
| "selenium/webdriver/common/fedcm/**", |
| "selenium/webdriver/common/print_page_options.py", |
| "selenium/webdriver/common/timeouts.py", |
| "selenium/webdriver/common/virtual_authenticator.py", |
| ], |
| ), |
| data = [ |
| ":manager-linux", |
| ":manager-macos", |
| ":manager-windows", |
| ] + [":create-cdp-srcs-" + n for n in BROWSER_VERSIONS], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":bidi", |
| ":exceptions", |
| ":latest", |
| ":remote", |
| requirement("typing_extensions"), |
| ], |
| ) |
| |
| # Input actions API (action_chains + actions subpackage) |
| py_library( |
| name = "common_actions", |
| srcs = glob([ |
| "selenium/webdriver/common/action_chains.py", |
| "selenium/webdriver/common/actions/**/*.py", |
| ]), |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| py_library( |
| name = "common_alert", |
| srcs = ["selenium/webdriver/common/alert.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| py_library( |
| name = "common_api_request_context", |
| srcs = ["selenium/webdriver/common/api_request_context.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [":exceptions"], |
| ) |
| |
| py_library( |
| name = "common_fedcm", |
| srcs = glob(["selenium/webdriver/common/fedcm/**/*.py"]), |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [":exceptions"], |
| ) |
| |
| py_library( |
| name = "common_print_page_options", |
| srcs = ["selenium/webdriver/common/print_page_options.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [], |
| ) |
| |
| py_library( |
| name = "common_timeouts", |
| srcs = ["selenium/webdriver/common/timeouts.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [], |
| ) |
| |
| py_library( |
| name = "common_virtual_authenticator", |
| srcs = ["selenium/webdriver/common/virtual_authenticator.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [":exceptions"], |
| ) |
| |
| # Module that points to the latest devtools module |
| py_library( |
| name = "latest", |
| srcs = [":create-latest-devtools"], |
| imports = ["selenium.webdriver.common.devtools"], |
| visibility = ["//visibility:public"], |
| ) |
| |
| # Support utilities (wait conditions, event listeners, etc.) |
| py_library( |
| name = "support", |
| srcs = glob( |
| ["selenium/webdriver/support/**/*.py"], |
| exclude = ["selenium/webdriver/support/color.py"], |
| ), |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":exceptions", |
| ":remote", |
| ], |
| ) |
| |
| py_library( |
| name = "support_color", |
| srcs = ["selenium/webdriver/support/color.py"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [], |
| ) |
| |
| # Chromium base (shared by Chrome and Edge) |
| py_library( |
| name = "chromium", |
| srcs = glob(["selenium/webdriver/chromium/**/*.py"]), |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # Chrome driver |
| py_library( |
| name = "chrome", |
| srcs = glob(["selenium/webdriver/chrome/**/*.py"]), |
| data = ["selenium/webdriver/chrome/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [":chromium"], |
| ) |
| |
| # Edge driver |
| py_library( |
| name = "edge", |
| srcs = glob(["selenium/webdriver/edge/**/*.py"]), |
| data = ["selenium/webdriver/edge/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [":chromium"], |
| ) |
| |
| # Firefox driver |
| py_library( |
| name = "firefox", |
| srcs = glob(["selenium/webdriver/firefox/**/*.py"]), |
| data = [ |
| "selenium/webdriver/firefox/__init__.pyi", |
| ":firefox-driver-prefs", |
| ], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # Safari driver |
| py_library( |
| name = "safari", |
| srcs = glob(["selenium/webdriver/safari/**/*.py"]), |
| data = ["selenium/webdriver/safari/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # IE driver |
| py_library( |
| name = "ie", |
| srcs = glob(["selenium/webdriver/ie/**/*.py"]), |
| data = ["selenium/webdriver/ie/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # WebKitGTK driver |
| py_library( |
| name = "webkitgtk", |
| srcs = glob(["selenium/webdriver/webkitgtk/**/*.py"]), |
| data = ["selenium/webdriver/webkitgtk/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # WPEWebKit driver |
| py_library( |
| name = "wpewebkit", |
| srcs = glob(["selenium/webdriver/wpewebkit/**/*.py"]), |
| data = ["selenium/webdriver/wpewebkit/__init__.pyi"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":common", |
| ":remote", |
| ], |
| ) |
| |
| # ============================================================================== |
| # Aggregate Target (backwards compatible - includes all modules) |
| # ============================================================================== |
| |
| py_library( |
| name = "selenium", |
| srcs = [], |
| data = ["selenium/py.typed"], |
| imports = ["."], |
| visibility = ["//visibility:public"], |
| deps = [ |
| ":bidi", |
| ":chrome", |
| ":chromium", |
| ":common", |
| ":common_actions", |
| ":common_alert", |
| ":common_api_request_context", |
| ":common_fedcm", |
| ":common_print_page_options", |
| ":common_timeouts", |
| ":common_virtual_authenticator", |
| ":edge", |
| ":exceptions", |
| ":firefox", |
| ":ie", |
| ":remote", |
| ":safari", |
| ":support", |
| ":support_color", |
| ":webkitgtk", |
| ":wpewebkit", |
| ], |
| ) |
| |
| 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.common.devtools.latest", |
| "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.2.25", |
| "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")], |
| ) |
| |
| py_binary( |
| name = "generate_bidi", |
| srcs = ["generate_bidi.py"], |
| srcs_version = "PY3", |
| ) |
| |
| [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] |
| |
| generate_devtools_latest( |
| name = "create-latest-devtools", |
| browser_versions = BROWSER_VERSIONS, |
| ) |
| |
| # Generate BiDi source files from CDDL specification. |
| # extra_cddl_files are merged with the primary WebDriver BiDi spec before |
| # generation so that end users get the full set of BiDi-adjacent modules. |
| generate_bidi( |
| name = "create-bidi-src", |
| cddl_file = "@webdriver_bidi_all_cddl//file:spec.cddl", |
| enhancements_manifest = "//py/private:bidi_enhancements_manifest.py", |
| extra_cddl_files = [ |
| "@permissions_all_cddl//file:spec.cddl", |
| "@prefetch_all_cddl//file:spec.cddl", |
| "@ua_client_hints_all_cddl//file:spec.cddl", |
| "@web_bluetooth_all_cddl//file:spec.cddl", |
| ], |
| extra_srcs = [ |
| "//py/private:_event_manager.py", |
| "//py/private:_network_handlers.py", |
| "//py/private:_script_handlers.py", |
| "//py/private:cdp.py", |
| ], |
| generator = ":generate_bidi", |
| merge_tool = "//py/private:merge_cddl", |
| module_name = "selenium/webdriver/common/bidi", |
| spec_version = "1.0", |
| ) |
| |
| 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"]) |
| |
| # Test files that only run against browsers supporting the given feature. |
| # Each group is split into its own sub-suite so that changing the underlying |
| # library only triggers that group's targets, not the full ~700-target suite. |
| FEDCM_TESTS = ["test/selenium/webdriver/common/fedcm_tests.py"] |
| |
| TIMEOUTS_TESTS = ["test/selenium/webdriver/common/timeout_tests.py"] |
| |
| VIRTUAL_AUTH_TESTS = ["test/selenium/webdriver/common/virtual_authenticator_tests.py"] |
| |
| API_REQUEST_TESTS = ["test/selenium/webdriver/common/api_request_context_tests.py"] |
| |
| # alerts_tests.py and webdriverwait_tests.py both call driver.switch_to.alert, |
| # requiring :common_alert at runtime, so they share a sub-suite. |
| ALERT_TESTS = [ |
| "test/selenium/webdriver/common/alerts_tests.py", |
| "test/selenium/webdriver/common/webdriverwait_tests.py", |
| ] |
| |
| # rendered_webelement_tests.py is the only browser test that imports Color. |
| RENDERED_WEBELEMENT_TESTS = ["test/selenium/webdriver/common/rendered_webelement_tests.py"] |
| |
| FEATURE_TESTS = ( |
| FEDCM_TESTS + |
| TIMEOUTS_TESTS + |
| VIRTUAL_AUTH_TESTS + |
| API_REQUEST_TESTS + |
| ALERT_TESTS + |
| RENDERED_WEBELEMENT_TESTS |
| ) |
| |
| # Test files that import from selenium.webdriver.common.actions / action_chains. |
| # These are kept separate so they can depend on :common_actions without pulling |
| # that library into every other test suite. |
| ACTIONS_TESTS = [ |
| "test/selenium/webdriver/common/interactions_tests.py", |
| "test/selenium/webdriver/common/interactions_with_device_tests.py", |
| "test/selenium/webdriver/common/w3c_interaction_tests.py", |
| "test/selenium/webdriver/support/event_firing_webdriver_tests.py", |
| ] |
| |
| DRIVER_FINDER_TESTS = ["test/selenium/webdriver/common/driver_finder_tests.py"] |
| |
| # Browser-specific test configuration |
| BROWSER_TESTS = { |
| "chrome": { |
| "browser_srcs": ["test/selenium/webdriver/chrome/**/*.py"], |
| "deps": [ |
| ":chrome", |
| ":common", |
| ":support", |
| ], |
| "actions_deps": [ |
| ":chrome", |
| ":common_actions", |
| ":support", |
| ], |
| "bidi": True, |
| }, |
| "edge": { |
| "browser_srcs": ["test/selenium/webdriver/edge/**/*.py"], |
| "deps": [ |
| ":edge", |
| ":common", |
| ":support", |
| ], |
| "actions_deps": [ |
| ":edge", |
| ":common_actions", |
| ":support", |
| ], |
| "bidi": True, |
| }, |
| "firefox": { |
| "browser_srcs": [ |
| "test/selenium/webdriver/firefox/**/*.py", |
| ], |
| "deps": [ |
| ":firefox", |
| ":common", |
| ":support", |
| ], |
| "actions_deps": [ |
| ":firefox", |
| ":common_actions", |
| ":support", |
| ], |
| "extra_excludes": ["test/selenium/webdriver/common/devtools_tests.py"], |
| "bidi": True, |
| }, |
| "ie": { |
| "browser_srcs": ["test/selenium/webdriver/ie/**/*.py"], |
| "deps": [ |
| ":ie", |
| ":common", |
| ":support", |
| ], |
| "actions_deps": [ |
| ":ie", |
| ":common_actions", |
| ":support", |
| ], |
| }, |
| "safari": { |
| "browser_srcs": ["test/selenium/webdriver/safari/**/*.py"], |
| "deps": [ |
| ":safari", |
| ":common", |
| ":support", |
| ], |
| "actions_deps": [ |
| ":safari", |
| ":common_actions", |
| ":support", |
| ], |
| }, |
| } |
| |
| DEFAULT_BROWSER_TESTS = [b for b in BROWSER_TESTS if b != "ie"] |
| |
| # Generate test-<browser>-common targets (non-bidi, non-actions) |
| [ |
| py_test_suite( |
| name = "test-%s-common" % browser, |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ] + BROWSER_TESTS[browser]["browser_srcs"], |
| exclude = BIDI_TESTS + ACTIONS_TESTS + FEATURE_TESTS + DRIVER_FINDER_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"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| ] |
| |
| # Generate test-<browser>-actions targets (non-bidi, actions tests only) |
| [ |
| py_test_suite( |
| name = "test-%s-actions" % browser, |
| size = "large", |
| srcs = ACTIONS_TESTS, |
| args = [ |
| "--instafail", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = "%s-actions" % browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["actions_deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| ] |
| |
| # Feature test definitions: suffix -> (srcs, dep) |
| FEATURE_SUITE_DEFS = { |
| "fedcm": (FEDCM_TESTS, ":common_fedcm"), |
| "timeouts": (TIMEOUTS_TESTS, ":common_timeouts"), |
| "virtual-auth": (VIRTUAL_AUTH_TESTS, ":common_virtual_authenticator"), |
| "api-request": (API_REQUEST_TESTS, ":common_api_request_context"), |
| "alerts": (ALERT_TESTS, ":common_alert"), |
| "rendered": (RENDERED_WEBELEMENT_TESTS, ":support_color"), |
| } |
| |
| # Generate test-<browser>-<feature> targets (non-bidi, one per feature library) |
| [ |
| py_test_suite( |
| name = "test-%s-%s" % (browser, feature), |
| size = "large", |
| srcs = FEATURE_SUITE_DEFS[feature][0], |
| args = [ |
| "--instafail", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = "%s-%s" % (browser, feature), |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| FEATURE_SUITE_DEFS[feature][1], |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| for feature in FEATURE_SUITE_DEFS |
| ] |
| |
| # Aggregate test-<browser> = common + actions + features (keeps CI targets unchanged) |
| [test_suite( |
| name = "test-%s" % browser, |
| tests = [ |
| ":test-%s-common" % browser, |
| ":test-%s-actions" % browser, |
| ] + [":test-%s-%s" % (browser, f) for f in FEATURE_SUITE_DEFS], |
| ) for browser in DEFAULT_BROWSER_TESTS] |
| |
| [ |
| py_test_suite( |
| name = "test-%s-driver-finder" % browser, |
| size = "large", |
| srcs = DRIVER_FINDER_TESTS, |
| args = [ |
| "--instafail", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| flaky = True, |
| tags = BROWSERS[browser]["tags"] + ["se-manager"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| ] |
| |
| # Generate test-<browser>-bidi-common targets |
| [ |
| py_test_suite( |
| name = "test-%s-bidi-common" % browser, |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ] + BROWSER_TESTS[browser]["browser_srcs"], |
| exclude = ACTIONS_TESTS + FEATURE_TESTS + DRIVER_FINDER_TESTS + ["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"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = "%s-bidi" % browser, |
| deps = [ |
| ":common_alert", # bidi_browsing_context_tests.py calls EC.alert_is_present() |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| if BROWSER_TESTS[browser].get("bidi", False) |
| ] |
| |
| # Generate test-<browser>-bidi-actions targets |
| [ |
| py_test_suite( |
| name = "test-%s-bidi-actions" % browser, |
| size = "large", |
| srcs = ACTIONS_TESTS, |
| args = [ |
| "--instafail", |
| "--bidi", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = "%s-bidi-actions" % browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["actions_deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| if BROWSER_TESTS[browser].get("bidi", False) |
| ] |
| |
| # Generate test-<browser>-bidi-<feature> targets |
| [ |
| py_test_suite( |
| name = "test-%s-bidi-%s" % (browser, feature), |
| size = "large", |
| srcs = FEATURE_SUITE_DEFS[feature][0], |
| args = [ |
| "--instafail", |
| "--bidi", |
| ] + BROWSERS[browser]["args"], |
| data = BROWSERS[browser]["data"], |
| env_inherit = ["DISPLAY"], |
| tags = ["no-sandbox"] + BROWSERS[browser]["tags"], |
| target_compatible_with = BROWSERS[browser]["target_compatible_with"], |
| test_suffix = "%s-bidi-%s" % (browser, feature), |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| FEATURE_SUITE_DEFS[feature][1], |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in DEFAULT_BROWSER_TESTS |
| for feature in FEATURE_SUITE_DEFS |
| if BROWSER_TESTS[browser].get("bidi", False) |
| ] |
| |
| # Aggregate test-<browser>-bidi = bidi-common + bidi-actions + bidi-features |
| [test_suite( |
| name = "test-%s-bidi" % browser, |
| tests = [ |
| ":test-%s-bidi-common" % browser, |
| ":test-%s-bidi-actions" % browser, |
| ] + [":test-%s-bidi-%s" % (browser, f) for f in FEATURE_SUITE_DEFS], |
| ) for browser in DEFAULT_BROWSER_TESTS if BROWSER_TESTS[browser].get("bidi", False)] |
| |
| # Generate test-<browser>-remote-common targets (chrome and firefox only) |
| [ |
| py_test_suite( |
| name = "test-%s-remote-common" % 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 + ACTIONS_TESTS + FEATURE_TESTS + DRIVER_FINDER_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, |
| ], |
| test_suffix = "%s-remote" % browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in [ |
| "chrome", |
| "firefox", |
| ] |
| ] |
| |
| # Generate test-<browser>-remote-actions targets (chrome and firefox only) |
| [ |
| py_test_suite( |
| name = "test-%s-remote-actions" % browser, |
| size = "large", |
| srcs = ACTIONS_TESTS, |
| 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, |
| ], |
| test_suffix = "%s-remote-actions" % browser, |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| ] + BROWSER_TESTS[browser]["actions_deps"] + TEST_DEPS, |
| ) |
| for browser in [ |
| "chrome", |
| "firefox", |
| ] |
| ] |
| |
| # Generate test-<browser>-remote-<feature> targets (chrome and firefox only) |
| [ |
| py_test_suite( |
| name = "test-%s-remote-%s" % (browser, feature), |
| size = "large", |
| srcs = FEATURE_SUITE_DEFS[feature][0], |
| 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, |
| ], |
| test_suffix = "%s-remote-%s" % (browser, feature), |
| deps = [ |
| ":init-tree", |
| ":webserver", |
| FEATURE_SUITE_DEFS[feature][1], |
| ] + BROWSER_TESTS[browser]["deps"] + TEST_DEPS, |
| ) |
| for browser in [ |
| "chrome", |
| "firefox", |
| ] |
| for feature in FEATURE_SUITE_DEFS |
| ] |
| |
| # Aggregate test-<browser>-remote = remote-common + remote-actions + remote-features |
| [test_suite( |
| name = "test-%s-remote" % browser, |
| tests = [ |
| ":test-%s-remote-common" % browser, |
| ":test-%s-remote-actions" % browser, |
| ] + [":test-%s-remote-%s" % (browser, f) for f in FEATURE_SUITE_DEFS], |
| ) 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-common", |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ], |
| exclude = BIDI_TESTS + ACTIONS_TESTS + FEATURE_TESTS + DRIVER_FINDER_TESTS, |
| ), |
| args = [ |
| "--instafail", |
| "--driver=webkitgtk", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "webkitgtk", |
| deps = [ |
| ":common", |
| ":init-tree", |
| ":support", |
| ":webkitgtk", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| |
| py_test_suite( |
| name = "test-webkitgtk-actions", |
| size = "large", |
| srcs = ACTIONS_TESTS, |
| args = [ |
| "--instafail", |
| "--driver=webkitgtk", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "webkitgtk-actions", |
| deps = [ |
| ":common_actions", |
| ":init-tree", |
| ":support", |
| ":webkitgtk", |
| ":webserver", |
| ] + TEST_DEPS, |
| ) |
| |
| [ |
| py_test_suite( |
| name = "test-webkitgtk-%s" % feature, |
| size = "large", |
| srcs = FEATURE_SUITE_DEFS[feature][0], |
| args = [ |
| "--instafail", |
| "--driver=webkitgtk", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "webkitgtk-%s" % feature, |
| deps = [ |
| ":init-tree", |
| ":support", |
| ":webkitgtk", |
| ":webserver", |
| FEATURE_SUITE_DEFS[feature][1], |
| ] + TEST_DEPS, |
| ) |
| for feature in FEATURE_SUITE_DEFS |
| ] |
| |
| test_suite( |
| name = "test-webkitgtk", |
| tests = [ |
| ":test-webkitgtk-actions", |
| ":test-webkitgtk-common", |
| ] + [":test-webkitgtk-%s" % f for f in FEATURE_SUITE_DEFS], |
| ) |
| |
| py_test_suite( |
| name = "test-wpewebkit-common", |
| size = "large", |
| srcs = glob( |
| [ |
| "test/selenium/webdriver/common/**/*.py", |
| "test/selenium/webdriver/support/**/*.py", |
| ], |
| exclude = BIDI_TESTS + ACTIONS_TESTS + FEATURE_TESTS + DRIVER_FINDER_TESTS, |
| ), |
| args = [ |
| "--instafail", |
| "--driver=wpewebkit", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation --headless", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "wpewebkit", |
| deps = [ |
| ":common", |
| ":init-tree", |
| ":support", |
| ":webserver", |
| ":wpewebkit", |
| ] + TEST_DEPS, |
| ) |
| |
| py_test_suite( |
| name = "test-wpewebkit-actions", |
| size = "large", |
| srcs = ACTIONS_TESTS, |
| args = [ |
| "--instafail", |
| "--driver=wpewebkit", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation --headless", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "wpewebkit-actions", |
| deps = [ |
| ":common_actions", |
| ":init-tree", |
| ":support", |
| ":webserver", |
| ":wpewebkit", |
| ] + TEST_DEPS, |
| ) |
| |
| [ |
| py_test_suite( |
| name = "test-wpewebkit-%s" % feature, |
| size = "large", |
| srcs = FEATURE_SUITE_DEFS[feature][0], |
| args = [ |
| "--instafail", |
| "--driver=wpewebkit", |
| "--browser-binary=MiniBrowser", |
| "--browser-args=--automation --headless", |
| ], |
| tags = [ |
| "exclusive-if-local", |
| "no-sandbox", |
| "skip-rbe", |
| ], |
| test_suffix = "wpewebkit-%s" % feature, |
| deps = [ |
| ":init-tree", |
| ":support", |
| ":webserver", |
| ":wpewebkit", |
| FEATURE_SUITE_DEFS[feature][1], |
| ] + TEST_DEPS, |
| ) |
| for feature in FEATURE_SUITE_DEFS |
| ] |
| |
| test_suite( |
| name = "test-wpewebkit", |
| tests = [ |
| ":test-wpewebkit-actions", |
| ":test-wpewebkit-common", |
| ] + [":test-wpewebkit-%s" % f for f in FEATURE_SUITE_DEFS], |
| ) |
| |
| 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"), |
| ], |
| ) |
| |
| py_console_script_binary( |
| name = "sphinx-build", |
| pkg = "@py_dev_requirements//sphinx", |
| script = "sphinx-build", |
| deps = [ |
| ":selenium", |
| requirement("sphinx-material"), |
| ], |
| ) |
| |
| sphinx_docs( |
| name = "docs", |
| srcs = glob(["docs/source/**/*.rst"]), |
| config = "docs/source/conf.py", |
| sphinx = ":sphinx-build", |
| ) |
| |
| py_binary( |
| name = "mypy", |
| srcs = ["run_mypy.py"], |
| data = [ |
| "pyproject.toml", |
| ":selenium", |
| ], |
| main = "run_mypy.py", |
| deps = [ |
| ":selenium", |
| requirement("mypy"), |
| ], |
| ) |
| |
| alias( |
| name = "ruff", |
| actual = "//py/private:ruff", |
| ) |
| |
| alias( |
| name = "ruff-check", |
| actual = "//py/private:ruff_check", |
| ) |
| |
| alias( |
| name = "ruff-format", |
| actual = "//py/private:ruff_format", |
| ) |