Selenium

A browser automation framework and ecosystem.

README

Selenium

CI - Ruby CI - Python CI - JavaScript CI - Java

Selenium

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.

Selenium's source code is made available under the Apache 2.0 license.

Documentation


Narrative documentation:


API documentation:


Pull Requests


Please read CONTRIBUTING.md
before submitting your pull requests.

Requirements


Bazelisk, a Bazel wrapper that automatically downloads
  the version of Bazel specified in .bazelversion file and transparently passes through all
  command-line arguments to the real Bazel binary.
The latest version of the Java 11 OpenJDK
java and jar on the $PATH (make sure you use java executable from JDK but not 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.
Python 3.7+ andpython on the PATH
The tox automation project for Python:pip install tox
macOS users:
  Install the latest version of Xcode including the command-line tools. This command should work xcode-select --install
  Apple Silicon Macs should add build --host_platform=//:rosetta to their .bazelrc.local file. We are working
  to make sure this isn't required in the long run.
Windows users:
   Latest version of Visual Studio with command line tools and build tools installed
  BAZEL_VS environment variable should point to the location of the build tools,
     e.g. C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools
  BAZEL_VC environment variable should point to the location of the command line tools,
     e.g. C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\VC
  BAZEL_VC_FULL_VERSION environment variable should contain the version of the installed command line tools,
     e.g. 14.27.29110
  A detailed setup guide can be seen on Jim Evan's post
  If the Jim's blog instructions were followed, also make sure C:\tools\msys65\usr\bin is on the PATH.

Internet Explorer Driver


If you plan to compile the
you also need:

32 and 64-bit cross compilers

The build will work on any platform, but the tests for IE will be
skipped silently if you are not building on Windows.

Building


Contribute with GitPod


GitPod provides a ready to use environment to develop.
Open in Gitpod

To configure and use your local machine, keep reading.

Bazel


Bazel was built by the fine folks at Google. Bazel manages dependency
downloads, generates the Selenium binaries, executes tests, and does it all rather quickly.

More detailed instructions for getting Bazel running are below, but if you can successfully get
the java and javascript folders to build without errors, you should be confident that you have the
correct binaries on your system.

Before Building


Ensure that you have Firefox installed and the latest
[geckodriver](https://github.com/mozilla/geckodriver/releases/) on your $PATH.
You may have to update this from time to time.

Common Build Targets


Java


Click to see Java Build Steps

To build the most commonly-used modules of Selenium from source, execute this command from the root
project folder:

  1. ```sh
  2. bazel build java/...
  3. ```

If you want to test you can run then you can do so by running the following command

  1. ```sh
  2. bazel test //java/... --test_size_filters=small,medium,large --test_tag_filters=
  3. ```

The test_size_filters argument takes small, medium, large. Small are akin to unit tests,
medium is akin to integration tests, and large is akin to end-to-end tests.

The test_tag_filters allow us to pass in browser names and a few different tags that we can
find in the code base.

To build the Grid deployment jar, run this command:

  1. ```sh
  2. bazel build grid
  3. ```

The log will show where the output jar is located.


JavaScript

Click to see JavaScript Build Steps

If you want to build all the JavaScript code you can run:

  1. ```sh
  2. bazel build javascript/...
  3. ```

To build the NodeJS bindings you will need to run:

  1. ```sh
  2. bazel build //javascript/node/selenium-webdriver
  3. ```

To run the tests run:

  1. ```sh
  2. bazel test //javascript/node/selenium-webdriver:tests
  3. ```

You can pass in the environment variable SELENIUM_BROWSER with the name of the browser.

To publish to NPM run:

  1. ```sh
  2. bazel run //javascript/node/selenium-webdriver:selenium-webdriver.publish
  3. ```

Python

Click to see Python Build Steps

If you want to build the python bindings run:

  1. ```sh
  2. bazel build //py:selenium
  3. ```

To run the tests run:

  1. ```sh
  2. bazel test //py:test-
  3. ```

If you add --//common:pin_browsers it will download the browsers and drivers for you to use.

To install locally run:

  1. ```sh
  2. bazel build //py:selenium-wheel
  3. pip install bazel-bin/py/selenium-*.whl
  4. ```

To publish run:

  1. ```sh
  2. bazel build //py:selenium-wheel
  3. twine upload bazel-bin/py/selenium-*.whl
  4. ```

Ruby

Click to see Ruby Build Steps

To build the Ruby code run:

  1. ```sh
  2. bazel build //rb/...
  3. ```

To run unit tests:

  1. ```sh
  2. bazel test --cache_test_results=no --test_output=all //rb:unit-test
  3. ```

To run tests on a browser:

  1. ```sh
  2. bazel test --cache_test_results=no --test_output=all //rb:-test
  3. ```

To run remote tests on a browser:

  1. ```sh
  2. bazel test --cache_test_results=no --test_output=all //rb:remote--test
  3. ```

To run a particular test on a browser:

  1. ```sh
  2. bazel test --cache_test_results=no --test_output=all --test_arg="-e<Test_Target>" //rb:-test
  3. ```
_browsername_:
chrome
edge
firefox
ie
safari
safari-preview

_Test_Target_ examples:
Selenium::WebDriver::Devtools
Selenium::WebDriver::TakesScreenshot
Selenium::WebDriver::Timeouts
Selenium::WebDriver::Chrome::Driver
Selenium::WebDriver::Firefox::Profile
Selenium::Webdriver::Remote::Driver

Optional Environment Variable toggles in test suite:

ENV['WD_SPEC_DRIVER'] - the driver to test; either the browser name or 'remote' (gets set by Bazel)
ENV['WD_REMOTE_BROWSER'] - when 'WD_SPEC_DRIVER' is 'remote'; the name of the browser to test (gets set by Bazel)
ENV['WD_REMOTE_URL'] - url of an already running server to use for remote tests
ENV['DOWNLOAD_SERVER'] - when WD_REMOTE_URL not set; whether to download and use most recently released server version for remote tests
ENV['DEBUG'] - turns on verbose debugging
ENV['HEADLESS'] - for chrome, edge and firefox; runs tests in headless mode
ENV['DISABLE_BUILD_CHECK'] - for chrome and edge; whether to ignore driver and browser version mismatches (allows testing Canary builds)
ENV['CHROME_BINARY'] - path to test specific Chrome browser
ENV['EDGE_BINARY'] - path to test specific Edge browser
ENV['FIREFOX_BINARY'] - path to test specific Firefox browser


.NET

Click to see .NET Build Steps

Bazel can not build .NET, yet, but it can set up tests with:

  1. ```sh
  2. bazel build //dotnet/test/common:chrome
  3. ```

Tests can then be run with:
  1. ```sh
  2. cd dotnet
  3. dotnet test
  4. ```

More information about running Selenium's .NET tests can be found in this README.md



Build Details


Bazel files are called BUILD.bazel, and the order the modules are built is determined
by the build system. If you want to build an individual module (assuming all dependent
modules have previously been built), try the following:

  1. ```sh
  2. bazel test javascript/atoms:test
  3. ```

In this case, javascript/atoms is the module directory,
test is a target in that directory's BUILD.bazel file.

As you see build targets scroll past in the log,
you may want to run them individually.

Build Output


bazel makes a top-level group of directories with the  bazel- prefix on each directory.


Common Tasks (Bazel)


To build the bulk of the Selenium binaries from source, run the
following command from the root folder:

  1. ```sh
  2. bazel build java/... javascript/...
  3. ```

To run tests within a particular area of the project, use the "test" command, followed
by the folder or target. Tests are tagged with "small", "medium", or "large", and can be filtered
with the --test_size_filters option:

  1. ```sh
  2. bazel test --test_size_filters=small,medium java/...
  3. ```

Bazel's "test" command will run all tests in the package, including integration tests. Expect
the test java/... to launch browsers and consume a considerable amount of time and resources.

To bump the versions of the pinned browsers to their latest stable versions:

  1. ```sh
  2. bazel run scripts:pinned_browsers > temp.bzl && mv temp.bzl common/repositories.bzl
  3. ```

Editing Code


Most of the team use either Intellij IDEA or VS.Code for their day-to-day editing. If you're
working in IntelliJ, then we highly recommend installing the [Bazel IJ
plugin](https://plugins.jetbrains.com/plugin/8609-bazel) which is documented on

If you do use IntelliJ and the Bazel plugin, there is a project view checked into the tree
in scripts/ij.bazelproject which will make it easier to get up
running, and editing code :)


Tour


The codebase is generally segmented around the languages used to
write the component. Selenium makes extensive use of JavaScript, so
let's start there. First of all, start the development server:

  1. ```sh
  2. bazel run debug-server
  3. ```

Now, navigate to
You'll find the contents of the javascript/ directory being shown.
We use the Closure Library
for developing much of the JavaScript, so now navigate to

The tests in this directory are normal HTML files with names ending
with _test.html.  Click on one to load the page and run the test.

Help with go


More general, but basic, help for go

  1. ```sh
  2. ./go --help
  3. ```

go is a wrapper around
Rake, so you can use the standard
commands such as rake -T to get more information about available
targets.

Maven _per se_


Selenium is not built with Maven. It is built with bazel,
though that is invoked with go as outlined above,
so you do not have to learn too much about that.

That said, it is possible to relatively quickly build Selenium pieces
for Maven to use. You are only really going to want to do this when
you are testing the cutting-edge of Selenium development (which we
welcome) against your application. Here is the quickest way to build
and deploy into your local maven repository (~/.m2/repository), while
skipping Selenium's own tests.

  1. ```sh
  2. ./go maven-install
  3. ```

The maven jars should now be in your local ~/.m2/repository.

Updating Java dependencies


The coordinates (_groupId_:_artifactId_:_version_) of the Java dependencies
are defined in the file maven_deps.bzl.
The process to modify these dependencies is the following:

1. (Optional) If we want to detect the dependencies which are not updated,
   we can use the following command for automatic discovery:

  1. ```sh
  2. bazel run @maven//:outdated
  3. ```

2. Modify maven_deps.bzl.
   For instance, we can bump the version of a given artifact detected in the step before.

3. Repin dependencies. This process is required to update the file maven_install.json,
   which is used to manage the Maven dependencies tree (see rules_jvm_external for further details). The command to carry out this step is the following:

  1. ```sh
  2. RULES_JVM_EXTERNAL_REPIN=1 bazel run @unpinned_maven//:pin
  3. ```

4. (Optional) If we use IntelliJ with the Bazel plugin, we need to synchronize
   our project. To that aim, we click on _Bazel_ → _Sync_ → _Sync Project
   with BUILD Files_.


Running browser tests on Linux


In order to run Browser tests, you first need to install the browser-specific drivers,
such as [geckodriver](https://github.com/mozilla/geckodriver/releases),
[chromedriver](https://chromedriver.chromium.org/), or
[edgedriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/).
These need to be on your PATH.

By default, Bazel runs these tests in your current X-server UI. If you prefer, you can
alternatively run them in a virtual or nested X-server.

1. Run the X server Xvfb :99 or Xnest :99
2. Run a window manager, for example, DISPLAY=:99 jwm
3. Run the tests you are interested in:
  1. ```sh
  2. bazel test --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
  3. ```

An easy way to run tests in a virtual X-server is to use Bazel's --run_under
functionality:
  1. ```
  2. bazel test --run_under="xvfb-run -a" //java/... --test_tag_filters=chrome
  3. ```

Bazel Installation/Troubleshooting


Selenium Build Docker Image


If you're finding it hard to set up a development environment using bazel
and you have access to Docker, then you can build a Docker image suitable
for building and testing Selenium in from the Dockerfile in the
dev image directory.

MacOS


bazelisk


Bazelisk is a Mac-friendly launcher for Bazel. To install, follow these steps:

  1. ```sh
  2. brew tap bazelbuild/tap && \
  3. brew uninstall bazel; \
  4. brew install bazelbuild/tap/bazelisk
  5. ```

Xcode


If you're getting errors that mention Xcode, you'll need to install the command-line tools.

Bazel for Mac requires some additional steps to configure properly. First things first: use
the Bazelisk project (courtesy of philwo), a pure golang implementation of Bazel. In order to
install Bazelisk, first verify that your Xcode will cooperate: execute the following command:

xcode-select -p

If the value is /Applications/Xcode.app/Contents/Developer/, you can proceed with bazelisk
installation. If, however, the return value is /Library/Developer/CommandLineTools/, you'll
need to redirect the Xcode system to the correct value.

  1. ```
  2. sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/
  3. sudo xcodebuild -license
  4. ```

The first command will prompt you for a password. The second step requires you to read a new Xcode
license, and then accept it by typing "agree".

(Thanks to this thread for these steps)