Selenium
Automates browsers. That's it!
Contributing • Installing • Building • Developing • Testing • Documenting • Releasing
Selenium is an umbrella project encapsulating a variety of tools and libraries enabling web browser automation. Selenium specifically provides an infrastructure for the W3C WebDriver specification — a platform and language-neutral coding interface compatible with all major web browsers.
The project is made possible by volunteer contributors who've generously donated thousands of hours in code development and upkeep.
This README is for developers interested in contributing to the project. For people looking to get started using Selenium, please check out our User Manual for detailed examples and descriptions, and if you get stuck, there are several ways to Get Help.
Contributing
Please read CONTRIBUTING.md before submitting your pull requests.
Installing
These are the requirements to create your own local dev environment to contribute to Selenium.
All Platforms
- Bazelisk, a Bazel wrapper that automatically downloads
the version of Bazel specified in
.bazelversionfile and transparently passes through all command-line arguments to the real Bazel binary. - Java JDK version 17 or greater (e.g., Java 17 Temurin)
- Set
JAVA_HOMEenvironment variable to location of Java executable (the JDK not the JRE) - To test this, try running the command
javac. This command won't exist if you only have the JRE installed. If you're met with a list of command-line options, you're referencing the JDK properly.
- Set
MacOS
- Xcode including the command-line tools. Install the latest version using:
xcode-select --install - Rosetta for Apple Silicon Macs. Add
build --host_platform=//:rosettato the.bazelrc.localfile. We are working to make sure this isn't required in the long run.
Windows
Several years ago Jim Evans published a great article on Setting Up a Windows Development Environment for the Selenium .NET Language Bindings; This article is out of date, but it includes more detailed descriptions and screenshots that some people might find useful.
Click to see Current Windows Setup Requirements
Option 1: Automatic Installation from Scratch
This script will ensure a complete ready to execute developer environment. (nothing is installed or set that is already present unless otherwise prompted)
- Open Powershell as an Administrator
- Execute:
Set-ExecutionPolicy Bypass -Scope Process -Forceto allow running the script in the process - Navigate to the directory you want to clone Selenium in, or the parent directory of an already cloned Selenium repo
- Download and execute this script in the powershell terminal: [scripts/dev-environment-setup.ps1]`
Option 2: Manual Installation
- Allow running scripts in Selenium in general:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned - Enable Developer Mode:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1" - Install MSYS2, which is an alternative shell environment that provides Unix-like commands
- Add bin directory to
PATHenvironment variable (e.g.,"C:\tools\msys64\usr\bin") - Add
bash.exelocation as theBAZEL_SHenvironment variable (e.g.,"C:\tools\msys64\usr\bin\bash.exe")
- Add bin directory to
- Install the latest version of Visual Studio Community
- Use the visual studio installer to modify and add the "Desktop development with C++" Workload
- Add Visual C++ build tools installation directory location to
BAZEL_VCenvironment variable (e.g."C:\Program Files\Microsoft Visual Studio\2022\Community\VC") - Add Visual C++ Build tools version to
BAZEL_VC_FULL_VERSIONenvironment variable (this can be discovered from the directory name in"$BAZEL_VC\Tools\MSVC\")
- Add support for long file names (bazel has a lot of nested directories that can exceed default limits in Windows)
- Enable Long Paths support with these 2 registry commands:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1" reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1"- Allow Bazel to create short name versions of long file paths:
fsutil 8dot3name set 0 - Set bazel output to
C:/tmpinstead of nested inside project directory:- Create a file
selenium/.bazelrc.windows.local - Add "startup --output_user_root=C:/tmp" to the file
- Create a file
Alternative Dev Environments
If you want to contribute to the project, but do not want to set up your own local dev environment, there are two alternatives available.
Using GitPod
Rather than creating your own local dev environment, GitPod provides a ready to use environment for you.
Using Dev Container
As an alternative you can build a Dev Container - basically a docker container - suitable for building and testing Selenium using the devcontainer.json in the .devcontainer directory. Supporting IDEs like VS Code or IntelliJ IDEA should point you to how such a container can be created.
Using Docker Image
You can also build a Docker image suitable for building and testing Selenium using the Dockerfile in the dev image directory.
Using Worktrees
Bazel keeps its build outputs and downloaded dependencies under each checkout by default, which means working from multiple worktrees re-downloads dependencies and rebuilds artifacts. Pointing Bazel at user-level caches avoids that.
Add the following to /path/to/your/home/.bazelrc
common --disk_cache=/path/to/your/home/.cache/bazel-disk
common --repository_cache=/path/to/your/home/.cache/bazel-repo
--disk_cache stores compiled action outputs; --repository_cache stores downloaded external
dependencies (e.g. http_archive tarballs). Both directories grow unbounded over time — prune them
periodically if disk space matters. Keep the cache on the same filesystem as your checkouts so Bazel
can hardlink instead of copy.
Bazel also creates a separate output base (compiled outputs, analysis cache, and the Bazel server) per checkout path. Unlike the caches above, it is not removed when you delete a worktree — so frequently created and discarded worktrees leak gigabytes of stale output.
On macOS/Linux, make a worktree self-cleaning by pointing its output base inside the worktree. Add
this to that worktree's .bazelrc.local:
startup --output_base=.local/output-base
.local/ is gitignored and excluded in .bazelignore, so removing the worktree removes its output
base with it. The shared --disk_cache/--repository_cache above still keep downloads and action
outputs shared across worktrees.
(Windows users should instead keep startup --output_user_root=C:/tmp in .bazelrc.windows.local as
described above, to avoid path-length limits — do not nest the output base deeper inside the repo on
Windows.)
Building
Selenium is built using a common build tool called Bazel, to allow us to easily manage dependency downloads, generate required binaries, build and release packages, and execute tests; all in a fast, efficient manner. For