diff --git a/.gitignore b/.gitignore
index 12ac4c954a0..f4bdc9e69c8 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
.idea
-public/
\ No newline at end of file
+public/
+.DS_Store
diff --git a/config.toml b/config.toml
index 46951cda65f..1ee1d6da031 100755
--- a/config.toml
+++ b/config.toml
@@ -1,4 +1,4 @@
-baseURL = "https://www.seleniumhq.org/"
+baseURL = ""
languageCode = "en-us"
title = "SeleniumHQ Browser Automation"
theme = "selenium"
diff --git a/content/documentation/drivers.html b/content/documentation/drivers.html
deleted file mode 100755
index 3d697e6c235..00000000000
--- a/content/documentation/drivers.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
Driver idiosyncrasies
-
-
-
-
-
-
-
-
Driver idiosyncrasies
-
-
-
Shared capabilities
-
-
pageLoadStrategy
-
When navigating to a new page via URL, by default Selenium will wait
- until the page has fully loaded before responding. This works well for
- beginners, but can cause long wait times on pages that load a large
- number of third party resources. Using a non default strategy can make
- test execution faster in cases like this, but can also introduce flakiness
- where elements on the page change position as elements load in and change
- size.
-
-
The page load strategy queries the
-
- document.readyState as described in the table below:
-
-
Strategy
Ready State
Notes
-
normal
complete
Used by default, waits for all
- resources to download
-
eager
interactive
DOM access is ready, but other
- resources like images may still be loading
-
none
Any
Does not block WebDriver at all
-
-
-
-
Driver specific capabilities
-
-
Firefox
-
Define Capabilities using FirefoxOptions
-
FirefoxOptions is the new way to define capabilities for the Firefox browser and should generally be used in preference to DesiredCapabilities.
-
-FirefoxOptions options = new FirefoxOptions();
-options.addPreference("network.proxy.type", 0);
-driver = new RemoteWebDriver(options);
-
-
-
Setting a custom profile
-
It is possible to create a custom profile for Firefox as demonstrated below.
-
-FirefoxProfile profile = new FirefoxProfile();
-FirefoxOptions options = new FirefoxOptions();
-options.setProfile(profile);
-driver = new RemoteWebDriver(options);
-
-
-
Internet Explorer
-
-
fileUploadDialogTimeout
-
-
In some environments, Internet Explorer may timeout when opening the
- File Upload dialog. IEDriver has a default timeout of 1000ms, but you
- can increase the timeout using the fileUploadDialogTimeout capability.
diff --git a/content/documentation/grid.html b/content/documentation/grid.html
deleted file mode 100755
index 634a7543a0f..00000000000
--- a/content/documentation/grid.html
+++ /dev/null
@@ -1,300 +0,0 @@
-
-
-
Selenium Grid
-
-
-
-
-
-
-
-
Selenium Grid
-
-
Selenium Grid is a smart proxy server
- that allows Selenium tests to route commands to remote web browser instances.
- Its aim is to provide an easy way to run tests in parallel on multiple machines.
-
-
With Selenium Grid,
- one server acts as the hub that routes JSON formatted test commands
- to one or more registered Grid nodes.
- Tests contact the hub to obtain access to remote browser instances.
- The hub has a list of registered servers that it provides access to,
- and allows us to control these instances.
-
-
Selenium Grid allows us to run tests in parallel on multiple machines,
- and to manage different browser versions and browser configurations centrally
- (instead of in each individual test).
-
-
Selenium Grid isn't a silver bullet.
- It solves a subset of common delegation and distribution problems,
- but will for example not manage your infrastructure
- and might not suit your specific needs.
-
-
-
Purposes and main functionality of a Selenium Grid
-
-
-
Central entry point for all tests
-
Management and control of the nodes / environment where the browsers run on
-
Scaling
-
Running tests in parallel
-
Cross platform testing
-
Load balancing
-
-
-
-
-
Components of a Selenium Grid
-
-
-
-
-
-
Hub
-
-
Intermediary and manager
-
Accepts requests to run tests
-
Takes instructions from client and executes them remotely on the nodes
-
Manages threads
-
-
-
A hub is a central point where all your tests are sent to.
- Each Selenium Grid consists of exactly one hub. The hub needs to be reachable from the
- respective clients (i.e. CI server, Developer machine etc.)
- The hub will connect one or more nodes
- that tests will be delegated to.
-
-
-
Nodes
-
-
This is where the browsers live
-
Registers itself to the hub and commincates its capabilities
-
Receives requests from the hub and executes them
-
-
-
Nodes are different Selenium instances
- that will execute tests on individual computer systems.
- There can be many nodes in a grid.
- The machines which are nodes need do not need to be the same platform
- or have the same browser selection as that of the hub or the other nodes.
- A node on Windows might have the capability of
- offering Internet Explorer as a browser option,
- whereas this wouldn't be possible on Linux or Mac.
-
-
-
-
-
-
Setting up your own Selenium Grid
-
-
-
To use Selenium Grid,
- you need to maintain your own infrastructure for the nodes.
- As this can be a cumbersome and time intense effort,
- many organizations use IaaS providers
- such as Amazon EC2 and Google Compute
- to provide this infrastructure.
-
-
Other options include using providers such as Sauce Labs or Testing Bot who provide a Selenium Grid as a service in the cloud.
- It is certainly possible to also run nodes on your own hardware.
- This chapter will go into detail about the option of running your own grid,
- complete with its own node infrastructure.
-
-
-
Quick start
-
-
This example will show you how to start the Selenium 2 Grid Hub,
- and register both a WebDriver node and a Selenium 1 RC legacy node.
- We’ll also show you how to call the grid from Java.
- The hub and nodes are shown here running on the same machine,
- but of course you can copy the selenium-server-standalone to multiple machines.
-
-
The selenium-server-standalone package includes the hub,
- WebDriver, and legacy RC needed to run the grid.
- ant is not required anymore.
- You can download the selenium-server-standalone-.jar from
- http://www.seleniumhq.org/download/.
-
-
-
Step 1: Start the hub
-
-
The hub is the central point that will receive test requests
- and distribute them to the right nodes.
- The distribution is done on a capabilities basis,
- meaning a test requiring a set of capabilities
- will only be distributed to nodes offering that set or subset of capabilities.
-
-
Because a test's desired capabilities are just what the name implies, desired,
- the hub cannot guarantee that it will locate a node
- fully matching the requested desired capabilities set.
-
-
Open a command prompt
- and navigate to the directory where you copied
- the selenium-server-standalone.jar file.
- You start the hub by passing the -role hub flag
- to the standalone server:
-
-
The hub will listen to port 4444 by default.
- You can view the status of the hub by opening a browser window and navigating to
- http://localhost:4444/grid/console.
-
-
To change the default port,
- you can add the optional -port flag
- with an integer representing the port to listen to when you run the command.
- Also, all of the other options you see in the JSON config file (seen below)
- are possible command-line flags.
-
-
You certainly can get by with only the simple command shown above,
- but if you need more advanced configuration,
- then you may also for convenience specify a JSON format config file
- to configure the hub when you start it.
- You can do it like so:
-
-
Regardless of whether you want to run a grid with new WebDriver functionality,
- or a grid with Selenium 1 RC functionality,
- or both at the same time,
- you use the same selenium-server-standalone.jar file to start the nodes:
-
-
If a port is not specified through the -port flag,
- a free port will be chosen. You can run multiple nodes on one machine
- but if you do so, you need to be aware of your systems memory resources
- and problems with screenshots if your tests take them.
-
-
-
Configuration of node with options
-
-
As mentioned, for backwards compatibility
- “wd” and “rc” roles are still a valid subset of the “node” role.
- But those roles limit the types of remote connections to their corresponding API,
- while “node” allows both RC and WebDriver remote connections.
-
-
Passing JVM properties (using the -D flag
- before the -jar argument)
- on the command line as well,
- and these will be picked up and propagated to the nodes:
-
-
-Dwebdriver.chrome.driver=chromedriver.exe
-
-
-
Configuration of node with JSON
-
-
You can also start grid nodes that are configured
- with a JSON configuration file
-
-
For both hub and node, if the -host flag is not specified,
- 0.0.0.0 will be used by default. This will bind to all the
- public (non-loopback) IPv4 interfaces of the machine. If you have a special
- network configuration or any component that creates extra network interfaces,
- it is advised to set the -host flag with a value that allows the
- hub/node to be reachable from a different machine.
-
-
Specifying the Port
-
-
The default TCP/IP port used by the hub is 4444. If you need to change the port please use above mentioned configurations
-
-
Troubleshooting
-
-
Using Log file
-
For advance troubleshooting you can specify log file to log system messeges.
-For that start Selenium GRID hub or node with -log argument. Please see the below example
-
Use your favorite text editor to open log file (log.txt in above example) to find "ERROR" logs if you get issues
-
-
Using -debug argument
-
Also you can use -debug argument to print debug logs on console.
-For that start Selenium GRID hub or node with -debug argument. Please see the below example
-
Docker provides a convenient way to
- provision and scale Selenium Grid infrastructure in a unit known as a container. Containers are standardised units of software that contain everything required
- to run the desired application including all dependencies in a reliable and repeatable
- way on different machines.
-
- The Selenium project maintains a set of Docker images which you can download
- and run to get a working grid up and running quickly. Nodes are available for
- both Firefox and Chrome. Full details of how to provision a grid can be found
- within the Docker Selenium
- repository.
-
-
Prerequisite
-
The only requirement to run a grid is to have Docker installed and working.
- Install Docker
-
-
diff --git a/content/documentation/guidelines.html b/content/documentation/guidelines.html
deleted file mode 100755
index daa35d614ac..00000000000
--- a/content/documentation/guidelines.html
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
Guidelines and Recommendations
-
-
-
-
-
-
-
-
Guidelines and Recommendations
-
-
A note on "Best Practices": We've intentionally avoided the phrase "Best
-Practices" in this documentation. No one approach works for all situations.
-We prefer the idea of "Guidelines and Recommendations." We encourage
-you to read through these and thoughtfully decide what approaches
-will work for you in your particular environment.
-
-
Functional testing is difficult to get right for many reasons.
- As if application state, complexity, and dependencies don't make testing difficult enough,
- dealing with browsers (especially with cross-browser incompatibilities)
- makes writing good tests a challenge.
-
-
Selenium provides tools to make functional user interaction easier,
- but doesn't help you write well-architected test suites.
- In this chapter we offer advice, guidelines, and recommendations.
- on how to approach functional web page automation.
-
-
This chapter records software design patterns popular
- amongst many of the users of Selenium
- that have proven successful over the years.
-
-
-
Page object models
-
-
Page Object is a Design Pattern which has become popular in test
-automation for enhancing test maintenance and reducing code
-duplication. A page object is an object-oriented class that serves as
-an interface to a page of your AUT. The tests then use the methods of
-this page object class whenever they need to interact with that page
-of the UI. The benefit is that if the UI changes for the page, the
-tests themselves don’t need to change; only the code within the page
-object needs to change. Subsequently, all changes to support that new
-UI are located in one place.
-
-
The Page Object Design Pattern provides the following advantage:
- there is clean separation between test code and page specific code
- such as locators (or their use if you’re using a UI map) and layout.
-
-
-
Page object methods should return a value
-
-
-
If you submit a page and are redirected,
- it should return the new page object.
-
If you click submit on login
- and you want to check to see if a user is logged in,
- it should return True or False in a method.
-
-
-
-
Domain Specific Language
-
-
A domain specific language (DSL) is a system which provides the user with
-an expressive means of solving a problem. It allows a user to
-interact with the system on their terms – not just programmer-speak.
-
-
Your users, in general, don't care how your site looks. They don't
-care about the decoration, animations, or graphics. They
-want to use your system to push their new employees through the
-process with minimal difficulty. They want to book travel to Alaska.
-They want to configure and buy unicorns at a discount. Your job as the
-tester is to come as close as you can to “capturing” this mind-set.
-With that in mind, we set about “modeling” the application you're
-working on, such that the test scripts (the user's only pre-release
-proxy) “speak” for and represent the user.
-
-
With Selenium, DSL is usually represented by methods, written to make
-the API simple and readable – they enable a report between the
-developers and the stakeholders (users, product owners, business
-intelligence specialists, etc.).
-
-
-
Benefits
-
-
-
Readable: Business stakeholders can understand it.
-
Writable: Easy to write, avoids unnecessary duplication.
-
Extensible: Functionality can (reasonably) be added
- without breaking contracts and existing functionality.
-
Maintainable: By leaving the implementation details out of test
- cases, you are well-insulated against changes to the AUT.
-
-
-
-
Java
-
-
Here is an example of a reasonable DSL method in Java.
- For brevity's sake, it assumes the `driver` object is pre-defined
- and available to the method.
-
-
/**
- * Takes a username and password, fills out the fields, and clicks "login".
- * @return An instance of the AccountPage
- */
-public AccountPage loginAsUser(String username, String password) {
- WebElement loginField = driver.findElement(By.id("loginField"));
- loginField.clear();
- loginField.sendKeys(username);
-
- // Fill out the password field. The locator we're using is "By.id", and we should
- // have it defined elsewhere in the class.
- WebElement passwordField = driver.findElement(By.id("password"));
- passwordField.clear();
- passwordField.sendKeys(password);
-
- // Click the login button, which happens to have the id "submit".
- driver.findElement(By.id("submit")).click();
-
- // Create and return a new instance of the AccountPage (via the built-in Selenium
- // PageFactory).
- return PageFactory.newInstance(AccountPage.class);
-}
-
-
This method completely abstracts the concepts of input fields,
-buttons, clicking, and even pages from your test code. Using this
-approach, all your tester has to do is call this method. This gives
-you a maintenance advantage: if the login fields ever changed, you
-would only ever have to change this method - not your tests.
-
-
public void loginTest() {
- loginAsUser("cbrown", "cl0wn3");
-
- // Now that we're logged in, do some other stuff--since we used a DSL to support
- // our testers, it's as easy as choosing from available methods.
- do.something();
- do.somethingElse();
- Assert.assertTrue("Something should have been done!", something.wasDone());
-
- // Note that we still haven't referred to a button or web control anywhere in this
- // script...
-}
-
-
It bears repeating: one of your primary goals should be writing an
-API that allows your tests to address the problem at hand, and NOT
-the problem of the UI. The UI is a secondary concern for your
-users – they don't care about the UI, they just want to get their job
-done. Your test scripts should read like a laundry list of things
-the user wants to DO, and the things they want to KNOW. The tests
-should not concern themselves with HOW the UI requires you to go
-about it.
-
-
-
Generating application state
-
-
Selenium should not be used to prepare a test case. All repetitive
-actions, and preparation for a test case, should be done through other
-methods. For example, most web UIs have authentication (e.g. a login
-form). Eliminating logging in via web browser before every test will
-improve both the speed and stability of the test. A method should be
-created to gain access to the AUT (e.g. using an API to login and set a
-cookie). Also, creating methods to pre-load data for
-testing should not be done using Selenium. As mentioned previously,
-existing APIs should be leveraged to create data for the AUT.
-
-
-
Mock external services
-
-
Eliminating the dependencies on external services will greatly improve
-the speed and stability of your tests.
-
-
-
Improved reporting
-
-
Selenium is not designed to report on the status of test cases
-run. Taking advantage of the built-in reporting capabilities of unit
-test frameworks is a good start. Most unit test frameworks have
-reports that can generate xUnit or HTML formatted reports. xUnit
-reports are popular for importing results to a Continuous Integration
-(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
-for more information regarding report outputs for several languages.
-
-
-
-
Avoid sharing state
-
-
Although mentioned in several places it is worth mentioning again. Ensure tests are isolated from one another.
-
Don't share test data. Imagine several tests that each query the database for valid orders before picking one to perform an action on. Should two tests pick up the same order you are likely to get unexpected behaviour.
-
Clean up stale data in the application that might be picked up by another test e.g. invalid order records.
-
Create a new WebDriver instance per test. This helps ensure test isolation and makes parallelisation simpler.
-
-
Test independency
-
-
Write each test as its own unit. Write the tests in a way that won't be reliant on other tests to complete:
-
-
Let's say there is a content management system with which you can create some custom content which then appears on your website as a module after publishing, and it may take some time to sync between the CMS and the application.
-
-
A wrong way of testing your module is that the content is created and published in one test, and then checking the module in another test. This is not feasible as the content may not be available immediately for the other test after publishing.
-
Instead, you can create a stub content which can be turned on and off within the affected test, and use that for validating the module. However, for content creation, you can still have a separate test.
-
-
-
Consider using a fluent API
-
-
Martin Fowler coined the term "Fluent API". Selenium already
-implements something like this in their FluentWait class which is
-meant as an alternative to the standard Wait class. You could
-enable the Fluent API design pattern in your page object and then
-query the Google search page with a code snippet like this one:
-
-
driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
-GoogleSearchPage gsp = new GoogleSearchPage();
-gsp.withFluent().setSearchString().clickSearchButton();
-
-
The Google page object class with this fluent behavior
- might look like this:
-
-
public class GoogleSearchPage extends LoadableComponent<GoogleSearchPage> {
- private final WebDriver driver;
- private GSPFluentInterface gspfi;
-
- public class GSPFluentInterface {
- private GoogleSearchPage gsp;
-
- public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
- gsp = googleSearchPage;
- }
-
- public GSPFluentInterface clickSearchButton() {
- gsp.searchButton.click();
- return this;
- }
-
- public GSPFluentInterface setSearchString( String sstr ) {
- clearAndType( gsp.searchField, sstr );
- return this;
- }
- }
-
- @FindBy(id = "gbqfq") private WebElement searchField;
- @FindBy(id = "gbqfb") private WebElement searchButton;
- public GoogleSearchPage(WebDriver driver) {
- gspfi = new GSPFluentInterface( this );
- this.get(); // If load() fails, calls isLoaded() until page is finished loading
- PageFactory.initElements(driver, this); // Initialize WebElements on page
- }
-
- public GSPFluentInterface withFluent() {
- return gspfi;
- }
-
- public void clickSearchButton() {
- searchButton.click();
- }
-
- public void setSearchString( String sstr ) {
- clearAndType( searchField, sstr );
- }
-
- @Override
- protected void isLoaded() throws Error {
- Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
- }
-
- @Override
- protected void load() {
- if ( isSFieldPresent ) {
- Wait<WebDriver> wait = new WebDriverWait( driver, 3 );
- wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
- }
- }
-}
-
-
-
Fresh browser per test
-
-
Start each test from a clean known state.
- Ideally, spin up a new virtual machine for each test.
- If spinning up a new virtual machine is not practical,
- at least start a new WebDriver for each test.
- For Firefox, start a WebDriver with your known profile.
-
-
FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
-WebDriver driver = new FirefoxDriver(profile);
Selenium HTML-runner allows you to run Test Suites from a
-command line. Test Suites are HTML exports from Selenium IDE or
-campatible tools.
-
-
-
Common information
-
-
Combination of releases of geckodriver / firefox /
- selenium-html-runner matters. There might be a software
- compatibility matrix somewhere.
-
selenium-html-runner runs only Test Suite (not Test Case - what
- is for example an export from Monitis Transaction Monitor). Be
- sure you comply with this.
-
For Linux users with no DISPLAY - you need to start html-runner
- with Virtual display (search for xvfb)
-
-
-
Now, the most important part, an example of how to run the
-selenium-html-runner! Your experience might vary depending on software
-combinations - geckodriver/FF/html-runner releases.
-
-xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
-
-
-
-[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
-Multi-window mode is longer used as an option and will be ignored.
-1510061109691 geckodriver INFO geckodriver 0.18.0
-1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
-1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
-1510061111084 Marionette INFO Listening on port 43229
-1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
-Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
-INFO: Detected dialect: W3C
-2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
-2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
-2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
-2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
-2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
-Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
-INFO: |open | /auth_mellon.php | |
-Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
-INFO: |waitForPageToLoad | 3000 | |
-.
-.
-.etc
-
-
Selenium setup is quite different from the setup of other commercial tools.
- You don’t install a tool using Selenium binaries
- but rather set up your test automation project to use such binaries
- in the language of your choice.
- The Selenium binary you would need
- depends on the browsers you want to run your tests upon.
-
-
Using browser specific JAR
-
-
If you want to run tests only in a specific browser,
- you can add the dependency for that browser in your pom.xml file.
- For example, you should add following dependency in your pom.xml
- file to run your tests only in Firefox:
-
-
More often than not you would need to run tests
- on more than one browser.
- Hence you would use selenium-java
- Maven dependency in your project.
- The selenium-java JAR
- contains the language bindings and the drivers
- but not the server side piece.
-
-
If you plan to use Selenium Grid
- then you should download
- selenium-server-standalone JAR file.
- Selenium-server-standalone jar is never uploaded,
- but all the components are available via
- selenium-server.
- The standalone JAR contains everything,
- including the remote Selenium server
- and the client-side bindings.
- This means that if you use the selenium-server-standalone jar
- in your project, then you don't have to add selenium-java
- or a browser specific jar.
diff --git a/content/documentation/intro.html b/content/documentation/intro.html
deleted file mode 100755
index 00460f5c162..00000000000
--- a/content/documentation/intro.html
+++ /dev/null
@@ -1,383 +0,0 @@
-
-
-
Introduction
-
-
-
-
-
-
-
-
Introduction
-
-
-
The Selenium project and tools
-
-
-
Selenium controls web browsers
-
-
Selenium is many things,
- but at its core it's a toolset for web browser automation
- that uses the best techniques available
- to remotely control browser instances
- and emulate a user's interaction with the browser.
-
-
It allows users to simulate common activities performed by end-users;
- entering text into fields,
- selecting drop-down values and checking boxes,
- and clicking links in documents.
- It also provides many other controls such as mouse movement,
- arbitrary JavaScript execution, and much more.
-
-
Although used primarily for front-end testing of websites,
- Selenium is at its core a browser user agent library.
- The interfaces are ubiquitous to their application,
- which encourages composition with other libraries to suit your purpose.
-
-
-
One interface to rule them all
-
-
One of the project's guiding principles
- is to support a common interface for all (major) browser technologies.
- Web browsers are incredibly complex, highly engineered applications,
- performing their operations in completely different ways
- but which frequently look the same while doing so.
- Even though the text is rendered in the same fonts,
- the images are displayed in the same place
- and the links take you to the same destination.
- What is happening underneath is as different as night and day.
- Selenium “abstracts” these differences,
- hiding their details and intricacies from the person writing the code.
- This allows you to write several lines of code to perform a complicated workflow,
- but these same lines will execute on Firefox,
- Internet Explorer, Chrome, and all other supported browsers.
-
-
-
Tools and support
-
-
Selenium's minimalist design approach gives it
- versatility to be included as a component in bigger applications.
- The surrounding infrastructure provided under the Selenium umbrella
- gives you the tools to put together
- your own grid of browsers
- so tests can be run on different browsers and multiple operating systems
- across a range of machines.
-
-
Imagine a bank of computers in your server room or data centre
- all firing up browsers at the same time
- hitting your site's links, forms,
- and tables—testing your application 24 hours a day.
- Through the simple programming interface
- provided for the most common languages,
- these tests will run tirelessly in parallel,
- reporting back to you when errors occur.
-
-
It's an aim to help make this a reality for you,
- by providing users with tools and documentation to not only control browsers,
- but to make it easy to scale and deploy such grids.
-
-
-
Who uses Selenium
-
-
Many of the most important companies in the world
- have adopted Selenium for their browser-based testing,
- often replacing years-long efforts involving other proprietary tools.
- As it has grown in popularity, so have its requirements and challenges multiplied.
-
-
As the web becomes more complicated
- and new technologies are added to websites,
- it's the mission of this project to keep up with them where possible.
- Being an open source project,
- this support is provided through the generous donation of time from many volunteers,
- every one of which has a “day job”.
-
-
Another mission of the project is to encourage
- more volunteers to partake in this effort,
- and build a strong community
- so that the project can continue to keep up with emerging technologies
- and remain a dominant platform for functional test automation.
-
-
-
History
-
-
When Selenium 1 was released in 2004,
- it was out of the necessity to reduce time spent
- manually verifying consistent behaviour in the front-end of a web application.
- It made use of what tools were available at the time,
- and relied heavily on the injection of JavaScript to the web page under test
- to emulate a user's interaction.
-
-
Whilst JavaScript is a good tool to let you introspect the properties of the DOM
- and to do certain client-side observations that you would otherwise not be able to do,
- it falls short on the ability to naturally replicate a user's interactions
- as if the mouse and keyboard are being used.
-
-
Since then, Selenium has grown and matured a lot,
- into a tool widely used by many—if not most—of
- the largest organisations around the world.
- Selenium has gone from a homebrewed test automation toolkit developed at Thoughtworks
- for a niché audience and a specific use case,
- to the world's de facto browser automation library.
-
-
Just as Selenium RC made use of the tools of the trade available at the time,
- Selenium WebDriver drives that tradition on by taking
- the browser interaction part to the browser vendor's home turf,
- and asking them to take responsibility of the backend, browser-facing implementations.
- Recently this work has evolved into a W3C standardisation process
- where the goal is to turn the WebDriver component in Selenium
- into the du jeur remote control library for user agents.
-
-
-
On test automation
-
-
First, start by asking yourself whether or not you really need to use a browser.
- Odds are good that, at some point, if you're working on a complex web application,
- you will need to open a browser and actually test it.
-
-
Functional end-user tests such as Selenium tests are expensive to run, however.
- Furthermore, they typically require substantial infrastructure
- to be in place to be run effectively.
- It's a good rule to always ask yourself if what you want to test
- can be done using more lightweight test approaches such as unit tests
- or with a lower-level approach.
-
-
Once you have made the determination that you're in the web browser testing business,
- and you have your Selenium environment ready to begin writing tests,
- you will generally perform some combination of three steps:
-
-
-
Set up the data
-
Perform a discrete set of actions
-
Evaluate the results
-
-
-
You will want to keep these steps as short as possible;
- one to two operations should be enough much of the time.
- Browser automation has the reputation of being “flaky”,
- but in reality that is because users frequently demand too much of it.
- In later chapters, we will return to techniques you can use
- to mitigate apparent intermittent problems in tests,
- in particular on how to overcome race conditions
- between the browser and WebDriver.
-
-
By keeping your tests short
- and using the web browser only when you have absolutely no alternative,
- you can have many tests with minimal flake.
-
-
A distinct advantage of Selenium tests
- are their inherent ability to test all components of the application,
- from backend to frontend, from a user's perspective.
- So in other words, whilst functional tests may be expensive to run,
- they also encompass large business-critical portions at one time.
-
-
-
Testing requirements
-
-
As mentioned before, Selenium tests can be expensive to run.
- To what extent depends on the browser you're running the tests against,
- but historically browsers' behaviour has varied so much that it has often
- been a stated goal to cross-test against multiple browsers.
-
-
Selenium allows you to run the same instructions against multiple browsers
- on multiple operating systems,
- but the enumeration of all the possible browsers,
- their different versions, and the many operating systems they run on
- will quickly become a non-trival undertaking.
-
-
-
Let’s start with an example
-
-
Larry has written a web site which allows users to order their own
- custom unicorns.
-
-
The general workflow (what we'll call the “happy path”) is something
- like this:
-
-
-
Create an account
-
Configure their unicorn
-
Add her to the shopping cart
-
Check out and pay
-
Give feedback about their unicorn
-
-
-
It would be tempting to write one grand Selenium script
- to perform all these operations–many will try.
- Resist the temptation!
- Doing so will result in a test that
- (a) takes a long time,
- (b) will be subject to some common issues around page rendering timing issues, and
- (c) is such that if it fails,
- it won't give you a concise, “glanceable” method for diagnosing what went wrong.
-
-
The preferred strategy for testing this scenario would be
- to break it down to a series of independent, speedy tests,
- each of which has one “reason” to exist.
-
-
Let's pretend you want to test the second step:
- Configuring your unicorn.
- It will perform the following actions:
-
-
-
Create an account
-
Configure a unicorn
-
-
-
Note that we're skipping the rest of these steps–
- we will test the rest of the workflow in other small, discrete test cases,
- after we're done with this one.
-
-
To start off, you need to create an account.
- Here you have some choices to make:
-
-
-
Do you want to use an existing account?
-
Do you want to create a new account?
-
Are there any special properties of such a user that need to be
- taken into account before configuration begins?
-
-
-
Regardless of how you answer this question,
- the solution is to make it part of the “set up the data” portion of the test–
- if Larry has exposed an API which enables you (or anyone)
- to create and update user accounts,
- be sure to use that to answer this question–
- if possible, you want to launch the browser only after you have a user “in hand”,
- whose credentials you can just log in with.
-
-
If each test for each workflow begins with the creation of a user account,
- many seconds will be added to the execution of each test.
- Calling an API and talking to a database are quick,
- “headless” operations that don't require the expensive process of
- opening a browser, navigating to the right pages,
- clicking and waiting for the forms to be submitted, etc.
-
-
Ideally, you can address this set-up phase in one line of code,
- which will execute before any browser is launched:
-
-
// Create a user who has read-only permissions--they can configure a unicorn,
-// but they do not have payment information set up, nor do they have
-// administrative privileges. At the time the user is created, its email
-// address and password are randomly generated--you don't even need to
-// know them.
-User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
-
-// Log in as this user.
-// Logging in on this site takes you to your personal "My Account" page, so the
-// AccountPage object is returned by the loginAs method, allowing you to then
-// perform actions from the AccountPage.
-AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
-
-
As you can imagine, the UserFactory can be extended
- to provide methods such as createAdminUser(), and createUserWithPayment().
- The point is, these two lines of code do not distract you from the ultimate purpose of this test:
- configuring a unicorn.
-
-
The intricacies of the Page Object model
- will be discussed in later chapters, but we will introduce the concept here:
-
-
Your tests should be composed of actions,
- performed from the user's point of view,
- within the context of pages in the site.
- These pages are stored as objects,
- which will contain specific information about how the web page is composed
- and how actions are performed–
- very little of which should concern you as a tester.
-
-
What kind of unicorn do you want?
- You might want pink, but not necessarily.
- Purple has been quite popular lately.
- Does she need sunglasses? Star tattoos?
- These choices, while difficult, are your primary concern as a tester–
- you need to ensure that your order fulfillment center
- sends out the right unicorn to the right person,
- and that starts with these choices.
-
-
Notice that nowhere in that paragraph do we talk about buttons,
- fields, drop-downs, radio buttons, or web forms.
- Neither should your tests!
- You want to write your code like the user trying to solve their problem.
- Here is one way of doing this (continuing from the previous example):
-
-
// The Unicorn is a top-level Object--it has attributes, which are set here.
-// This only stores the values; it does not fill out any web forms or interact
-// with the browser in any way.
-Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
-
-// Since we're already "on" the account page, we have to use it to get to the
-// actual place where you configure unicorns. Calling the "Add Unicorn" method
-// takes us there.
-AddUnicornPage addUnicornPage = accountPage.addUnicorn();
-
-// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
-// its createUnicorn() method. This method will take Sparkles' attributes,
-// fill out the form, and click submit.
-UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
-
-
Now that you've configured your unicorn,
- you need to move on to step 3: making sure it actually worked.
-
-
// The exists() method from UnicornConfirmationPage will take the Sparkles
-// object--a specification of the attributes you want to see, and compare
-// them with the fields on the page.
-Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
-
-
Note that the tester still hasn't done anything but talk about unicorns in this code–
- no buttons, no locators, no browser controls.
- This method of modelling the application
- allows you to keep these test-level commands in place and unchanging,
- even if Larry decides next week that he no longer likes Ruby-on-Rails
- and decides to re-implement the entire site
- in the latest Haskell bindings with a Fortran front-end.
-
-
Your page objects will require some small maintenance
- in order to conform to the site redesign,
- but these tests will remain the same.
- Taking this basic design,
- you will want to keep going through your workflows with the fewest browser-facing steps possible.
- Your next workflow will involve adding a unicorn to the shopping cart.
- You will probably want many iterations of this test in order to make sure the cart is keeping its state properly:
- Is there more than one unicorn in the cart before you start?
- How many can fit in the shopping cart?
- If you create more than one with the same name and/or features, will it break?
- Will it only keep the existing one or will it add another?
-
-
Each time you move through the workflow,
- you want to try to avoid having to create an account,
- login as the user, and configure the unicorn.
- Ideally, you'll be able to create an account
- and pre-configure a unicorn via the API or database.
- Then all you have to do is log in as the user, locate Sparkles,
- and add her to the cart.
-
-
-
Types of testing
-
-
TODO: Add paragraphs about acceptance testing, performance testing,
- load testing, regression testing, test driven development, and/or
- behavior-driven development (JBehave, Capybara, & Robot Framework),
- with how they relate to Selenium.
-
-
-
About this documentation
-
-
These docs, like the code itself, are maintained 100% by volunteers
- within the Selenium community.
- Many have been using it since its inception,
- but many more have only been using it for a short while,
- and have given their time to help improve the on-boarding experience
- for new users.
-
-
If there is an issue with the documentation, we want to know!
- The best way to communicate an issue is to visit
- https://github.com/seleniumhq/docs/issues
- and search to see whether or not the issue has been filed already.
- If not, feel free to open one!
-
-
Many members of the community frequent
- the #selenium IRC channel at irc.freenode.net. Feel free to drop in and ask questions
- and if you get help which you think could be of use within these documents,
- be sure to add your contribution!
- We can update these documents,
- but it's much easier for everyone when we get contributions
- from outside the normal committers.
diff --git a/content/documentation/quick.html b/content/documentation/quick.html
deleted file mode 100755
index 28af668eab0..00000000000
--- a/content/documentation/quick.html
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
Quick tour
-
-
-
-
-
-
-
Quick tour
-
-
Selenium is not just one tool or API
- but it composes many tools.
-
-
-
WebDriver
-
-
WebDriver is also known as Selenium
- 2. If you are beginning with desktop website test automation then you
- are going to be using WebDriver APIs. WebDriver uses browser
- automation APIs provided by browser vendors to control browser and
- run tests. This is as if a real user is operating the browser. Since
- WebDriver does not require its API to be compiled with application
- code, it is not intrusive in nature. Hence, you are testing the
- same application which you push live.
-
-
-
Selenium Remote Control
-
-
Selenium Remote Control is also known
- as Selenium 1. Selenium RC was the most prominent Selenium tool
- before the advent of Selenium WebDriver. Selenium RC would use a
- proxy server and inject JavaScript into a browser to be able to control
- it. Given the intrusive nature Selenium RC had on a browser,
- you could never be sure if what you were testing was the same as
- the application you wanted to push live. Selenium 2 APIs yet contain Selenium RC APIs but
- Selenium 3 would completely get rid of Selenium RC APIs. If you are
- still using Selenium RC then you must
- migrate to Selenium WebDriver.
-
-
-
Selenium IDE
-
-
Selenium IDE is a
- Firefox plugin which can be used to record test steps in Firefox itself.
- Selenium IDE can be used to generate quick and dirty
- test code in a variety of programming languages (i.e. C#,
- Java, Python, and Ruby). Given the maintainability of code generated
- through Selenium IDE, it is not recommended to use it for anything
- more than getting acquainted with element locators or generating
- throw away code. We're sure that once you get used to the
- WebDriver API, you will never use Selenium IDE.
-
-
-
Selenium Grid
-
-
Soon after development of WebDriver tests, you may face a need of
- running your tests on multiple browser and operating system combinations.
- This is where Selenium Grid
- comes to the rescue.
-
-
-
Selenium HTML Runner
-
-
This tool allows you to run Test Suites from the command
- line. Test Suites are HTML exports from Selenium IDE or campatible
- tools. Selenium HTML-runner
diff --git a/content/documentation/rc.html b/content/documentation/rc.html
deleted file mode 100755
index 870ba21c30f..00000000000
--- a/content/documentation/rc.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-You can use WebDriver remotely the same way you would use it
-locally. The primary difference is that a remote WebDriver needs to be
-configured so that it can run your tests on a separate machine.
-
-A remote WebDriver is composed of two pieces: a client and a
-server. The client is your WebDriver test and the server is simply a
-Java servlet, which can be hosted in any modern JEE app server.
-
-
The Remote WebDriver server
-
-The server will always run on the machine with the browser you want to
-test. The server can be used either from the command line or through code
-configuration.
-
-
-
Starting the server from the command line
-
-Once you have downloaded selenium-server-standalone-{VERSION}.jar,
-place it on the computer with the browser you want to test. Then, from
-the directory with the jar, run the following:
-
-
-
-The caller is expected to terminate each session properly, calling
-either Selenium#stop() or WebDriver#quit.
-
-The selenium-server keeps in-memory logs for each ongoing session,
-which are cleared when Selenium#stop() or WebDriver#quit is called. If
-you forget to terminate these sessions, your server may leak memory. If
-you keep extremely long-running sessions, you will probably need to
-stop/quit every now and then (or increase memory with -Xmx jvm option).
-
-
-
Timeouts (from version 2.21)
-
-The server has two different timeouts, which can be set as follows:
-
-
Controls how long the browser is allowed to hang (value in seconds).
-
-
timeout
-
Controls how long the client is allowed to be gone
- before the session is reclaimed (value in seconds).
-
-
-
The system property selenium.server.session.timeout
- is no longer supported as of 2.21.
-
-
Please note that the browserTimeout
- is intended as a backup timeout mechanism
- when the ordinary timeout mechanism fails,
- which should be used mostly in grid/server environments
- to ensure that crashed/lost processes do not stay around for too long,
- polluting the runtime environment.
-
-
-
Configuring the server programmatically
-
-
In theory, the process is as simple as mapping the DriverServlet to
-a URL, but it's also possible to host the page in a lightweight
-container, such as Jetty configured entirely in code. Steps to do this
-follow.
-
-
Download the "selenium-server.zip" and unpack. Put the JARs on the
-CLASSPATH. Create a new class called AppServer. Here, I'm using
-Jetty, so you'll need to download that as well:
-
-
First, we need to connect to the RemoteWebDriver.
- We do this by pointing the URL to the address of the server running our tests.
- In order to customize our configuration, we set desired capabilities.
- Below is an example of instantiating a remote WebDriver object
- pointing to our remote web server, www.example.com,
- running our tests on Firefox.
-
-
To further customize our test configuration, we can add other desired capabilities.
-
-
-
Desired capabilities
-
-
Desired capabilities can be expanded further.
- All remote Webdriver capabilities are sent through JsonWireProtocol.
- For a list of configurable capabilities, and more information on JsonWireProtocol,
- please visit the documentation here.
-
-
For example, suppose you wanted to run Chrome on Windows XP,
- using Chrome version 27:
-
-
The Local File Detector allows the transfer of files from the client
-machine to the remote server. For example, if a test needs to upload a
-file to a web application, a remote WebDriver can automatically transfer
-the file from the local machine to the remote web server during
-runtime. This allows the file to be uploaded from the remote machine
-running the test. It is not enabled by default and can be enabled in
-the following way:
-
-
Selenium supports automation of all the major browsers in the market
- through the use of WebDriver.
- WebDriver is an API and protocol that defines a language-neutral interface
- for controlling the behaviour of web browsers.
- Each browser is backed by a specific WebDriver implementation, called a *driver*.
- The driver is the component responsible for delegating down to the browser,
- and handles communication to and from Selenium and the browser.
-
-
This separation is part of a conscious effort to have browser vendors
- take responsibility for the implementation for their browsers.
- Selenium makes use of these third party drivers where possible,
- but also provides its own drivers maintained by the project
- for the cases when this is not a reality.
-
-
The Selenium framework ties all of these pieces together
- through a user-facing interface that enables the different browser backends
- to be used transparently,
- enabling cross-browser and cross-platform automation.
-
-
There is also a set of specialized browsers out there
- typically used in development environments.
- We can make use of some of these browsers for automation purposes also,
- and Selenium ties in support for the following specialized drivers:
-
-
Selenium can be extended through the use of plugins. Here are a number of plugins created and maintained by third parties. For more information on how to create your own plugin or have it listed, consult the docs.
-
-
Please note that these plugins are not supported, maintained, hosted, or endorsed by the Selenium project. In addition, be advised that the plugins listed below are not necessarily licensed under the Apache License v.2.0. Some of the plugins are available under another free and open source software license; others are only available under a proprietary license. Any questions about plugins and their license of distribution need to be raised with their respective developer(s).
-
-
One of the most fundamental techniques to learn when using WebDriver is
-how to find elements on the page. WebDriver offers a number of built-in selector
-types, amongst them finding an element by its ID attribute:
-
-
As seen in the example, locating elements in WebDriver is done on the
-WebDriver instance object. The findElement(By) method returns
-another fundamental object type, the WebElement.
-
-
-
WebDriver represents the browser
-
WebElement represents a particular DOM node
- (a control, e.g. a link or input field, etc.)
-
-
-
Once you have a reference to a web element that's been “found”,
- you can narrow the scope of your search
- by using the same call on that object instance:
-
-
You can do this because both the WebDriver and WebElement types
-implement the SearchContext
-interface. In WebDriver, this is known as a role-based interface.
-Role-based interfaces allow you to determine whether a particular
-driver implementation supports a given feature. These interfaces are
-clearly defined and try to adhere to having only a single role of
-responsibility. You can read more about WebDriver's design and what
-roles are supported in which drivers in the [Some Other Section Which
-Must Be Named](#).
-
-
-
Consequently, the By interface used above also supports a
-number of additional locator strategies. A nested lookup might not be
-the most effective cheese location strategy since it requires two
-separate commands to be issued to the browser; first searching the DOM
-for an element with ID “cheese”, then a search for “cheddar” in a
-narrowed context.
-
-
To improve the performance slightly, we should try to use a more
-specific locator: WebDriver supports looking up elements
-by CSS locators, allowing us to combine the two previous locators into
-one search:
-
-
Since more cheese is undisputably better, and it would be cumbersome
-to have to retrieve each of the items individually, a superior
-technique for retrieving cheese is to make use of the pluralized
-version findElements(By). This method returns a collection of web
-elements. If only one element is found, it will still return a
-collection (of one element). If no elements match the locator, an
-empty list will be returned.
-
-
There are eight different built-in element location strategies in WebDriver:
-
-
-
-
Locator
-
Description
-
-
-
-
class name
-
Locates elements whose class name contains the search value
- (compound class names are not permitted)
-
-
-
-
css selector
-
Locates elements matching a CSS selector
-
-
-
-
id
-
Locates elements whose ID attribute matches the search value
-
-
-
-
name
-
Locates elements whose NAME attribute matches the search value
-
-
-
-
link text
-
Locates anchor elements whose visible text matches the search value
-
-
-
-
partial link text
-
Locates anchor elements whose visible text partially matches the search value
-
-
-
-
tag name
-
Locates elements whose tag name matches the search value
-
-
-
-
xpath
-
Locates elements matching an XPath expression
-
-
-
-
-
Tips on using selectors
-
-
In general, if HTML IDs are available, unique, and consistently
-predictable, they are the preferred method for locating an element on
-a page. They tend to work very quickly, and forego much processing
-that comes with complicated DOM traversals.
-
-
If unique IDs are unavailable, a well-written CSS selector is the
-preferred method of locating an element. XPath works as well as CSS
-selectors, but the syntax is complicated and frequently difficult to
-debug. Though XPath selectors are very flexible, they're typically
-not performance tested by browser vendors and tend to be quite slow.
-
-
Selection strategies based on link text and partial link text have
-drawbacks in that they only work on link elements. Additionally, they
-call down to XPath selectors internally in WebDriver.
-
-
Tag name can be a dangerous way to locate elements. There are
-frequently multiple elements of the same tag present on the page.
-This is mostly useful when calling the findElements(By) method which
-returns a collection of elements.
-
-
The recommendation is to keep your locators as compact and
-readable as possible. Asking WebDriver to traverse the DOM structure
-is an expensive operation, and the more you can narrow the scope of
-your search, the better.
-
-
Performing actions on the AUT
-
-
You can set an element's text using the sendKeys method as follows:
-
-
-
- String name = "Charles";
- driver.findElement(By.name("name")).sendKeys(name);
-
-
- name = "Charles"
- driver.find_element_by_name("name").send_keys(name)
-
-
- name = "Charles"
- driver.find_element(name: "name").send_keys(name)
-
-
-
-
Some web applications use JavaScript libraries to add drag-and-drop
-functionality. The following is a basic example of dragging one
-element onto another element:
-
-
There are commands for various webpage loading actions:
-
-
- // Navigate to a URL (both of the statements below are
-// functionally equivalent).
-driver.get("https://www.google.com");
-driver.navigate().to("https://www.google.com");
-
-// Go forward one page in the browser (if you're not on the
-// last page that was viewed).
-driver.navigate().forward();
-
-// Go back one page in the browser (if you're not on the
-// first page that was viewed).
-driver.navigate().back();
-
-// Refresh the current page.
-driver.navigate().refresh();
- # Navigate to a URL.
-driver.get('https://www.google.com')
-
-# Go forward one page in the browser (if you're not on the
-# last page that was viewed).
-driver.forward()
-
-# Go back one page in the browser (if you're not on the
-# first page that was viewed).
-driver.back()
-
-# Refresh the current page.
-driver.refresh()
- # Navigate to a URL (both of the statements below are
-# functionally equivalent).
-driver.get('https://www.google.com')
-driver.navigate.to('https://www.google.com')
-
-# Go forward one page in the browser (if you're not on the
-# last page that was viewed).
-driver.navigate.forward
-
-# Go back one page in the browser (if you're not on the
-# first page that was viewed).
-driver.navigate.back
-
-# Refresh the current page.
-driver.navigate.refresh
-
-
-
Working with colours
-
-
You will occasionally want to validate the colour of something as part of your tests;
- the problem is that colour definitions on the web are not constant.
- Wouldn't it be nice if there was an easy way to compare
- a HEX representation of a colour with an RGB representation of a colour,
- or an RGBA representation of a colour with a HSLA representation of a colour?
-
-
Worry not. There's a solution: the Color class!
-
-
First of all, you will need to import the class:
-
-
- import org.openqa.selenium.support.Color;
- from selenium.webdriver.support.color import Color
- include Selenium::WebDriver::Support
-
-
-
You can now start creating colour objects.
- Every colour object will need to be created from a string representation of your colour.
- Supported colour representations are:
-
-
- private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
-private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
-private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
-private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
-private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
-private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
-private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
- HEX_COLOUR = Color.from_string('#2F7ED8')
-RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
-RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
-RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
-RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
-HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
-HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
- HEX_COLOUR = Color.from_string('#2F7ED8')
-RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
-RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
-RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
-RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
-HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
-HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
-
- private final Color BLACK = Color.fromString("black");
-private final Color CHOCOLATE = Color.fromString("chocolate");
-private final Color HOTPINK = Color.fromString("hotpink");
- BLACK = Color.from_string('black')
-CHOCOLATE = Color.from_string('chocolate')
-HOTPINK = Color.from_string('hotpink')
- BLACK = Color.from_string('black')
-CHOCOLATE = Color.from_string('chocolate')
-HOTPINK = Color.from_string('hotpink')
-
-
-
Sometimes browsers will return a colour value of "transparent"
- if no colour has been set on an element.
- The Color class also supports this:
-
-
- private final Color TRANSPARENT = Color.fromString("transparent");
- TRANSPARENT = Color.from_string('transparent')
- TRANSPARENT = Color.from_string('transparent')
-
-
-
You can now safely query an element
- to get its colour/background colour knowing that
- any response will be correctly parsed
- and converted into a valid Color object:
-
-
Select elements can require quite a bit of boiler plate code to automate.
- To reduce this and make your tests cleaner, there is a
- Select class in the Selenium support package.
- To use it, you will need the following import statement:
-
-
- import org.openqa.selenium.support.ui.Select;
- from selenium.webdriver.support.select import Select
- include Selenium::WebDriver::Support
-
-
-
You are then able to create a Select object using a WebElement that
-references a <select> element.
-
-
The Select object will now give you a series of commands
- that allow you to interact with a <select> element.
- First of all, there are different ways of selecting an option
- from the <select> element.
-
-
There are three ways to select the first option from the above element:
-
-
- // Select an <option> based upon the <select> element's internal index
-selectObject.selectByIndex(1);
-
-// Select an <option> based upon its value attribute
-selectObject.selectByValue("value1");
-
-// Select an <option> based upon its text
-selectObject.selectByVisibleText("Bread");
- # Select an <option> based upon the <select> element's internal index
-select_object.select_by_index(1)
-
-# Select an <option> based upon its value attribute
-select_object.select_by_value('value1')
-
-# Select an <option> based upon its text
-select_object.select_by_visible_text('Bread')
- # Select an <option> based upon the <select> element's internal index
-select_object.select_by(:index, 1)
-
-# Select an <option> based upon its value attribute
-select_object.select_by(:value, 'value1')
-
-# Select an <option> based upon its text
-select_object.select_by(:text, 'Bread')
-
-
-
You can then check which options are selected by using:
-
-
- // Return a List<WebElement> of options that have been selected
-List<WebElement> allSelectedOptions = selectObject.getAllSelectedOptions();
-
-// Return a WebElement referencing the first selection option found by walking down the DOM
-WebElement firstSelectedOption = selectObject.getFirstSelectedOption();
- # Return a list[WebElement] of options that have been selected
-all_selected_options = select_object.all_selected_options
-
-# Return a WebElement referencing the first selection option found by walking down the DOM
-first_selected_option = select_object.first_selected_option
- # Return an Array[Element] of options that have been selected
-all_selected_options = select_object.selected_options
-
-# Return a WebElement referencing the first selection option found by walking down the DOM
-first_selected_option = select_object.first_selected_option
-
-
-
Or you may just be interested in what <option> elements
- the <select> element contains:
-
-
- // Return a List<WebElement> of options that the <select> element contains
-List<WebElement> allAvailableOptions = selectObject.getOptions();
- # Return a list[WebElement] of options that the <select> element contains
-all_available_options = select_object.options
- # Return an Array[Element] of options that the <select> element contains
-all_available_options = select_object.options
-
-
-
If you want to deselect any elements, you now have four options:
-
-
- // Deselect an <option> based upon the <select> element's internal index
-selectObject.deselectByIndex(1);
-
-// Deselect an <option> based upon its value attribute
-selectObject.deselectByValue("value1");
-
-// Deselect an <option> based upon its text
-selectObject.deselectByVisibleText("Bread");
-
-// Deselect all selected <option> elements
-selectObject.deselectAll();
- # Deselect an <option> based upon the <select> element's internal index
-select_object.deselect_by_index(1)
-
-# Deselect an <option> based upon its value attribute
-select_object.deselect_by_value('value1')
-
-# Deselect an <option> based upon its text
-select_object.deselect_by_visible_text('Bread')
-
-# Deselect all selected <option> elements
-select_object.deselect_all()
- # Deselect an <option> based upon the <select> element's internal index
-select_object.deselect_by(:index, 1)
-
-# Deselect an <option> based upon its value attribute
-select_object.deselect_by(:value, 'value1')
-
-# Deselect an <option> based upon its text
-select_object.deselect_by(:text, 'Bread')
-
-# Deselect all selected <option> elements
-select_object.deselect_all
-
-
-
Finally, some <select> elements allow you to select more than one option.
- You can find out if your <select> element is one of these by using:
-
-
One should avoid title capitalisation,
- such as A Very Fine Heading,
- and instead go for A very fine heading.
- Gratutious capitalisation, or title case,
- often show a misunderstanding of – or a disregard for –
- orthographic conventions.
- We prefer what is known as sentence case,
- with a single initial capital to start headers.
-
-
Line length
-
-
When editing the documentation’s source,
- which is written in plain HTML,
- limit your line lengths to around 72 characters.
-
-
Some of us take this one step further
- and use what is called
- semantic linefeeds,
- which is a technique whereby the HTML source lines,
- which are not read by the public,
- are split at ‘natural breaks’ in the prose.
- In other words, sentences are split
- at natural breaks between clauses.
- Instead of fussing with the lines of each paragraph
- so that they all end near the right margin,
- linefeeds can be added anywhere
- that there is a break between ideas.
-
-
This can make diffs very easy to read
- when collaborating through git,
- but it is not something we enforce contributors to use.
diff --git a/content/documentation/wd.html b/content/documentation/wd.html
deleted file mode 100755
index 0699ff1e3a0..00000000000
--- a/content/documentation/wd.html
+++ /dev/null
@@ -1,1461 +0,0 @@
-
-
-
WebDriver
-
-
-
-
-
-
-
-
WebDriver
-
-
The biggest change in Selenium recently
- has been the inclusion of the WebDriver API.
- Driving a browser natively as a user would either locally
- or on a remote machine using the Selenium server,
- it marks a leap forward in terms of browser automation.
-
-
Selenium WebDriver fits in the same role as RC did,
- and has incorporated the original 1.x bindings.
- It refers to both the language bindings
- and the implementations of the individual browser controlling code.
- This is commonly referred to as just WebDriver
- or sometimes as Selenium 2.
-
-
Selenium 1.0 + WebDriver = Selenium 2.0
-
-
-
WebDriver is designed in a simpler
- and more concise programming interface
- along with addressing some limitations in the Selenium-RC API.
-
-
WebDriver is a compact object-oriented API
- when compared to Selenium 1.0.
-
-
It drives the browser much more effectively
- and overcomes the limitations of Selenium 1
- that affected our functional test coverage,
- like the file upload or download, pop-ups, and dialogs barrier.
-
-
Building a test suite using WebDriver will require you to understand and effectively use a number of different components. As with everything in software, different people use different terms for the same idea. Below is a breakdown of how terms are used in this description.
-
-
Terminology
-
-
-
API: Application Programming Interface. This is the set of "commands" you use to manipulate WebDriver.
-
Library: A code module which contains the APIs and the code necessary to implement them. Libraries are specific to each language binding, eg .jar files for Java, .dll files for .NET, etc.
-
Driver: Responsible for controlling the actual browser. Most drivers are created by the browser vendors themselves. Drivers are generally executable modules that run on the system with the browser itself, not on the system executing the test suite. (Although those may be the same system.) NOTE: Some people refer to the drivers as proxies.
-
Framework: An additional library used as a support for WebDriver suites. These frameworks may be test frameworks such as JUnit or NUnit. They may also be frameworks supporting natural language features such as Cucumber or Robotium. Frameworks may also be written and used for things such as manipulating or configuring the system under test, data creation, test oracles, etc.
-
-
-
-
-
The Parts and Pieces
-
At its minimum, WebDriver talks to a browser through a driver. Communication is two way: WebDriver passes commands to the browser through the driver, and recieves information back via the same route.
-
-
-
-
The driver is specific to the browser, such as ChromeDriver for Google's Chrome/Chromium, GeckoDriver for Mozilla's Firefox, etc. The driver runs on the same system as the browser. This may, or may not be, the same system where the tests themselves are executing.
-
-
This simple example above is direct communication. Communication to the browser may also be remote communication through Selenium Server or RemoteWebDriver. RemoteWebDriver runs on the same system as the driver and the browser.
-
-
-
-
-
Remote communication can also take place using Selenium Server or Selenium Grid, both of which in turn talk to the driver on the host system
-
-
-
-
-
Where Frameworks Fit In
-
-
WebDriver has one job and one job only: communicate with the browser via any of the methods above. WebDriver doesn't know a thing about testing: it doesn't know how to compare things, assert pass or fail, and it certainly doesn't know a thing about reporting or Given/When/Then grammar.
-
-
This is where various frameworks come in to play. At a minimum you'll need a test framework that matches the language bindings, eg NUnit for .NET, JUnit for Java, RSpec for Ruby, etc.
-
-
The test framework is responsible for running and executing your WebDriver and related steps in your tests. As such, you can think of it looking akin to the following image.
-
-
-
-
-
Natural language frameworks/tools such as Cucumber may exist as part of that Test Framework box in the figure above, or they may wrap the Test Framework entirely in their own implementation.
-
-
Driver requirements
-
-
Through WebDriver, Selenium supports all major browsers on the market
- such as Chrom(ium), Firefox, Internet Explorer, Opera, and Safari.
- Where possible, WebDriver drives the browser
- using the browser's built-in support for automation,
- although not all browsers have official support for remote control.
-
-
WebDriver's aim is to emulate a real user's interaction
- with the browser as closely as possible.
- This is possible at varying levels in different browsers.
- For more details on the different driver idiosyncracies,
- please see Driver Idiosyncracies.
-
-
Even though all the drivers share a single user-facing interface
- for contolling the browser,
- they have slightly different ways of setting up browser sessions.
- Since many of the driver implementations are provided by third parties,
- they are not included in the standard Selenium distribution.
-
-
Driver instantiation, profile management, and various browser specific settings
- are examples of parameters that have different requirements depending on the browser.
- This section explains the basic requirements
- for getting you started with the different browsers.
-
-
Adding Executables to your PATH
-
Most drivers require an extra executable for Selenium to communicate
- with the browser. You can manually specify where the executable lives
- before starting WebDriver, but this can make your tests less portable,
- as the executables will need to be in the same place on every machine,
- or included within your test code repository.
-
By adding a folder containing WebDriver's binaries to your system's
- path, Selenium will be able to locate the additional binaries without
- requiring your test code to locate the exact location of the driver.
-
-
Create a directory to place the executables in, like
- C:\WebDriver\bin or /opt/WebDriver/bin
-
Add the directory to your PATH:
-
-
On Windows - Open a command prompt as administrator
- and the run the following command
- to permanently add the directory to your path
- for all users on your machine:
-
You are now ready to test your changes.
- Close all open command prompts and open a new one.
- Type out the name of one of the binaries
- in the folder you created in the previous step,
- e.g:
chromedriver
- If your PATH is configured correctly,
- you will see some some output relating to the startup of the driver:
-
-
Starting ChromeDriver 2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1) on port 9515
-Only local connections are allowed.
-
-
You can regain control of your command prompt
- by pressing Ctrl + C.
-
To drive Chrome or Chromium, you have to download
- chromedriver
- and put it in a folder that is on your system's path.
-
-
On Linux or macOS, this means modifying
- the PATH environmental variable.
- You can see what directories, separated by a colon,
- make up your system's path by executing the following command:
-
-
To include chromedriver on the path if it isn't already,
- make sure you include the chromedriver binary's parent directory.
- The following line will set the PATH environmental variable
- its current content, plus an additional path added after the colon:
-
-
$ export PATH="$PATH:/path/to/chromedriver"
-
-
When chromedriver is available on your path,
- you should be able to execute the _chromedriver_ executable from any directory.
-
-
To instantiate a Chrome/Chromium session, you can do the following:
-
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-
-WebDriver driver = new ChromeDriver();
- #Simple assignment
-from selenium.webdriver import Chrome
-
-driver = Chrome()
- #Or use the context manager
-from selenium.webdriver import Chrome
-
-with Chrome() as driver:
- #your code inside this indent
- using OpenQA.Selenium;
-using OpenQA.Selenium.Chrome;
-
-IWebDriver driver = new ChromeDriver();
- require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :chrome
- const {Builder} = require('selenium-webdriver');
-
-(async function myFunction() {
- let driver = await new Builder().forBrowser('chrome').build();
- //your code inside this block
-})();
-
-
-
Remember that you have to set the path to the chromedriver executable.
- This is possible using the following line:
-
-
The chromedriver is implemented as a WebDriver remote server
- that by exposing Chrome's internal automation proxy interface
- instructs the browser what to do.
-
-
-
Firefox
-
-
Starting with Selenium 3, Mozilla has taken over implementation of
- Firefox Driver, with geckodriver.
- The new driver for Firefox is called geckodriver and works with Firefox
- 48 and newer. Since the Firefox WebDriver is under development, the
- newer the Firefox version the better the support.
-
-
As geckodriver is the new default way of launching Firefox, you can
- instantiate Firefox in the same way as Selenium 2:
-
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.Firefox.FirefoxDriver;
-
-WebDriver driver = new FirefoxDriver();
- #Simple assignment
-from selenium.webdriver import Firefox
-
-driver = Firefox()
- #Or use the context manager
-from selenium.webdriver import Firefox
-
-with Firefox() as driver:
- #your code inside this indent
- using OpenQA.Selenium;
-using OpenQA.Selenium.Firefox;
-
-IWebDriver driver = new FirefoxDriver();
- require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :firefox
- const {Builder} = require('selenium-webdriver');
-
-(async function myFunction() {
- let driver = await new Builder().forBrowser('firefox').build();
- //your code inside this block
-})();
-
-
-
-
If you prefer not to set geckodriver's location using PATH,
- set the geckodriver binary location programmatically:
-
-
It is also possible to set the property at run time:
-
-
mvn test -Dwebdriver.gecko.driver=/path/to/geckodriver
-
-
It is currently possible to revert to the older, more feature complete
- Firefox driver, by installing Firefox
- 47.0.1
- or 45 ESR
- and specifying a desired capability of marionette as
- false. Later releases of Firefox are no longer compatible.
-
-
-
Edge
-
-
Edge is Microsoft's newest browser, included with Windows 10 and Server 2016.
- Updates to Edge are bundled with major Windows updates,
- so you'll need to download a binary which matches the build number of your currently installed build of Windows.
- The Edge Developer site
- contains links to all the available binaries. Bugs against the EdgeDriver implementation can be raised with
- Microsoft. If you'd like to run tests against Edge, but aren't running Windows 10, Microsoft offer free VMs for testers on the Edge Developer site.
-
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.edge.EdgeDriver;
-
-WebDriver driver = new EdgeDriver();
-#Simple assignment
-from selenium.webdriver import Edge
-
-driver = Edge()
-#Or use the context manager
-from selenium.webdriver import Edge
-
-with Edge() as driver:
- #your code inside this indent
-using OpenQA.Selenium;
-using OpenQA.Selenium.Edge;
-
-IWebDriver driver = new EdgeDriver();
-require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :edge
-const {Builder} = require('selenium-webdriver');
-
-(async function myFunction() {
- let driver = await new Builder().forBrowser('MicrosoftEdge').build();
- //your code inside this block
-})();
-
-
-
If Edge driver is not present in your path, you can set the path using the following line:
-
-
Internet Explorer was Microsoft's default browser until Windows 10, although it is still included in Windows 10. Internet Explorer Driver is the only driver The Selenium project aims to support the same releases
-
- Microsoft considers current. Older releases may work, but will be unsupported.
-
While the Selenium project provides binaries for both the 32-bit and 64-bit versions of Internet Explorer, there are some limitations with Internet Explorer 10 & 11 with the 64-bit driver, but using the 32-bit driver continues to work well. It should be noted that as Internet Explorer preferences are saved against the logged in user's account, some additional setup is required.
-
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.ie.InternetExplorerDriver;
-
-WebDriver driver = new InternetExplorerDriver();
- #Simple assignment
-from selenium.webdriver import Ie
-
-driver = Ie()
- #Or use the context manager
-from selenium.webdriver import Ie
-
-with Ie() as driver:
- #your code inside this indent
- using OpenQA.Selenium;
-using OpenQA.Selenium.IE;
-
-IWebDriver driver = new InternetExplorerDriver();
- require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :internet_explorer
- const {Builder} = require('selenium-webdriver');
-
-(async function myFunction() {
- let driver = await new Builder().forBrowser('internet explorer').build();
- //your code inside this block
-})();
-
-
-
If Internet Explorer driver is not present in your path, you can set the path using the following line:
-
-
-
-Microsoft also offer a WebDriver binary for Internet Explorer 11 on Windows 7 & 8.1. It has not been updated since 2014 and is based of a draft version of the W3 specification. Jim Evans has an excellent writeup on Microsoft's implementation.
-
-
-
Opera
-
-
Current releases of Opera are built on top of the Chromium engine,
- and WebDriver is now supported via the closed-source
- Opera Chromium Driver,
- which can be added to your PATH
- or as a system property.
-
-
Instantiating a driver session is similar to Firefox and Chromium:
-
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.opera.OperaDriver;
-
-WebDriver driver = new OperaDriver();
-#Simple assignment
-from selenium.webdriver import Opera
-
-driver = Opera()
-#Or use the context manager
-from selenium.webdriver import Opera
-
-with Opera() as driver:
- #your code inside this indent
-using OpenQA.Selenium;
-using OpenQA.Selenium.Opera;
-
-IWebDriver driver = new OperaDriver();
-require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :opera
-
-
-
Safari
-
-
Starting with Safari 10 on macOS El Capitan and Sierra,
- WebDriver support is included with each release of the browser.
- To enable support:
-
-
-
Enable the Developer menu from Safari preferences
-
Check the Allow Remote Automation option
- from with the Develop menu
-
Run
/usr/bin/safaridriver -p 1337
from the terminal
- for the first time and type your password
- at the prompt to authorise WebDriver
-
-
-
You can then start a driver session using:
-
- import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.safari.SafariDriver;
-
-WebDriver driver = new SafariDriver();
-#Simple assignment
-from selenium.webdriver import Safari
-
-driver = Safari()
- #Or use the context manager
-from selenium.webdriver import Safari
-
-with Safari() as driver:
- #your code inside this indent
- using OpenQA.Selenium;
-using OpenQA.Selenium.Safari;
-
-IWebDriver driver = new SafariDriver();
- require "selenium-webdriver"
-
-driver = Selenium::WebDriver.for :safari
- const {Builder} = require('selenium-webdriver');
-
-(async function myFunction() {
- let driver = await new Builder().forBrowser('safari').build();
- //your code inside this block
-})();
-
-
-
Those looking to automate Safari on iOS should look to the
- Appium project. Whilst Safari was previously
- available for Windows, Apple has long since dropped support, making it
- a poor choice of test platform.
-
-
-
Mock browsers
-
-
-
HtmlUnit
-
-
HtmlUnit is a "GUI-Less browser for Java programs". It models HTML documents and provides an API that allows you
-to invoke pages, fill out forms, click links, etc. It has JavaScript support and is able to work with AJAX libraries,
-simulating Chrome, Firefox or Internet Explorer depending on the configuration used. It has been moved to a
-new location.
The source is maintained on svn.
-
-
-
PhantomJS
-
-
PhantomJS is a headless browser based on Webkit, albeit a version much older than that used by Google Chrome or
- Safari. . Whilst historically a popular choice, it would now be
- wise to avoid PhantomJS. The project has been unmaintained
- since the 5th of August, so whilst the web
- will continue to change, PhantomJS will not be updated. This was after Google announced the ability to run Chrome
- headlessly, something also now offered by Mozilla's Firefox.
-
-
Browser launching and manipulation
-
-
-
-
-
-
Ruby
-
-
Ruby is not installed by default on Windows. Download the latest version and run the installer. You can leave all settings at default values, except at the Installation Destination and Optional Tasks screen check Add Ruby executables to your PATH checkbox. To drive any browser, you have to install selenium-webdriver Ruby gem. To install it, open command prompt and type this:
-
-
$ gem install selenium-webdriver
-
-Or, if you use Bundler, add this line to your application's Gemfile:
-
-
gem "selenium-webdriver"
-
-And then execute the following command in prompt:
-
-
$ bundle install
-
-
Internet Explorer
-
-
Internet Explorer is installed by default on Windows, so no installation is needed. To drive Internet Explorer on Windows, you have to download the latest Internet Explorer Driver and put the file into a folder that is in PATH. To find out which directories are in PATH, type echo %PATH% in command prompt.
-
-
-
-C:\Ruby200\bin looks like a good place. Unzip `IEDriverServer` file and move `IEDriverServer.exe` there.
-
-This should open a new Internet Explorer window:
-
-
WebDriver doesn't make the distinction between windows and tabs. If
- your site opens a new tab or window, Selenium will let you work with it
- using a window handle. Each window has a unique identifier which remains
- persistent in a single session. You can get the window handle of the
- current window by using:
Clicking a link which opens in a
- new window will visible focus the new window or tab on screen, but
- WebDriver will not know which window the Operating System considers
- active. To work with the new window you will need to switch to it. If
- you have only two tabs or windows open, and you know which window you
- start with, by the process of elimination you can loop over both windows
- or tabs that WebDriver can see, and switch to the one which is not the
- original.
-
- //Store the ID of the original window
-String originalWindow = driver.getWindowHandle();
-
-//Check we don't have other windows open already
-assert driver.getWindowHandles().size() == 1;
-
-//Click the link which opens in a new window
-driver.findElement(By.linkText("new window")).click();
-
-//Wait for the new window or tab
-wait.until(numberOfWindowsToBe(2));
-
-//Loop through until we find a new window handle
-for (String windowHandle : driver.getWindowHandles()) {
- if(!originalWindow.contentEquals(windowHandle)) {
- driver.switchTo().window(windowHandle);
- break;
- }
-}
-
-//Wait for the new tab to finish loading content
-wait.until(titleIs("Selenium documentation"));
- from selenium import webdriver
-from selenium.webdriver.support.ui import WebDriverWait
-from selenium.webdriver.support import expected_conditions as EC
-
-# Start the driver
-with webdriver.Firefox() as driver:
- # Open URL
- driver.get("https://seleniumhq.github.io/docs/wd.html")
-
- # Setup wait for later
- wait = WebDriverWait(driver, 10)
-
- # Store the ID of the original window
- original_window = driver.current_window_handle
-
- # Check we don't have other windows open already
- assert len(driver.window_handles) == 1
-
- # Click the link which opens in a new window
- driver.find_element_by_link_text("new window").click()
-
- # Wait for the new window or tab
- wait.until(EC.number_of_windows_to_be(2))
-
- # Loop through until we find a new window handle
- for window_handle in driver.window_handles:
- if window_handle != original_window:
- driver.switch_to.window(window_handle)
- break
-
- # Wait for the new tab to finish loading content
- wait.until(EC.title_is("Selenium documentation"))
- //Store the ID of the original window
-String originalWindow = driver.CurrentWindowHandle;
-
-//Check we don't have other windows open already
-Assert.AreEqual(driver.WindowHandles.Count, 1);
-
-//Click the link which opens in a new window
-driver.FindElement(By.LinkText("new window")).Click();
-
-//Wait for the new window or tab
-wait.Until(wd => wd.WindowHandles.Count == 2);
-
-//Loop through until we find a new window handle
-foreach(String window in driver.WindowHandles)
-{
- if(originalWindow != window)
- {
- driver.SwitchTo().Window(window);
- break;
- }
-}
-//Wait for the new tab to finish loading content
-wait.Until(wd => wd.Title == "Selenium documentation");
- #Store the ID of the original window
-original_window = driver.window_handle
-
-#Check we don't have other windows open already
-assert(driver.window_handles.length == 1, 'Expected one window')
-
-#Click the link which opens in a new window
-driver.find_element(link: 'new window').click
-
-#Wait for the new window or tab
-wait.until { driver.window_handles.length == 2 }
-
-#Loop through until we find a new window handle
-driver.window_handles.each do |handle|
- if handle != original_window
- driver.switch_to.window handle
- break
- end
-end
-
-#Wait for the new tab to finish loading content
-wait.until { driver.title == 'Selenium documentation'}
-
- //Store the ID of the original window
-const originalWindow = await driver.getWindowHandle();
-
-//Check we don't have other windows open already
-assert((await driver.getAllWindowHandles()).length === 1);
-
-//Click the link which opens in a new window
-await driver.findElement(By.linkText('new window')).click();
-
-//Wait for the new window or tab
-await driver.wait(function() {
- return driver.getAllWindowHandles().then(function(windows) {
- return windows.length === 2;
- });
-}, 10000);
-
-//Loop through until we find a new window handle
-const windows = (await driver.getAllWindowHandles());
-for (let i = 0; i < windows.length; i++) {
- if(windows[i]!==originalWindow) {
- await driver.switchTo().window(windows[i]);
- }
-}
-
-//Wait for the new tab to finish loading content
-await driver.wait(until.titleIs('Selenium documentation'), 10000);
-
-
-
Closing a window or tab
-
When you are finished with a window or tab and it is not the
- last window or tab open in your browser, you should close it and switch
- back to the window you were using previously. Assuming you followed the
- code sample in the previous section you will have the previous window
- handle stored in a variable. Put this together and you will get:
-
- //Close the tab or window
-driver.close();
-
-//Switch back to the old tab or window
-driver.switchTo().window(originalWindow);
- #Close the tab or window
-driver.close()
-
-#Switch back to the old tab or window
-driver.switch_to.window(original_window)
- //Close the tab or window
-driver.Close();
-
-//Switch back to the old tab or window
-driver.SwitchTo().Window(originalWindow);
- #Close the tab or window
-driver.close
-
-#Switch back to the old tab or window
-driver.switch_to.window original_window
- //Close the tab or window
-await driver.close();
-
-//Switch back to the old tab or window
-await driver.switchTo().window(originalWindow);
-
-
-
Forgetting to switch back to another window handle after closing a
- window will leave WebDriver executing on the now closed page, and will
- trigger a No Such Window Exception. You must switch
- back to a valid window handle in order to continue execution.
-
-
Quiting the browser at the end of a session
-
When you are finished with the browser session you should call quit,
- instead of close:
-
If not running WebDriver in a test context, you may consider using
- try / finally which is offered by most languages so that an exception
- will still clean up the WebDriver session.
Python's WebDriver now supports the python context manager,
- which when using the with keyword can automatically quit the driver at
- the end of execution.
-
- with webdriver.Firefox() as driver:
- #WebDriver code here...
-
-#WebDriver will automatically quit after indentation
-
-
-
Window Management
-
Screen resolution can impact how your web application renders, so
- WebDriver provides mechanisms for moving and resizing the browser
- window.
-
-
Get Window Size
-
Fetches the size of the browser window in pixels.
-
- //Access each dimension individually
-int width = driver.manage().window().getSize().getWidth();
-int height = driver.manage().window().getSize().getHeight();
-
-//Or store the dimensions and query them later
-Dimension size = driver.manage().window().getSize();
-int width1 = size.getWidth();
-int height1 = size.getHeight();
- //Access each dimension individually
-width = driver.get_window_size().get("width")
-height = driver.get_window_size().get("height")
-
-//Or store the dimensions and query them later
-size = driver.get_window_size()
-width1 = size.get("width")
-height1 = size.get("height")
-
Fetches the coordinates of the top left coordinate of the browser window.
-
- //Access each dimension individually
-int x = driver.manage().window().getPosition().getX();
-int y = driver.manage().window()..getPosition().getY();
-
-//Or store the dimensions and query them later
-Point position = driver.manage().window().getPosition();
-int x1 = position.getX();
-int y1 = position.getY();
- //Access each dimension individually
-x = driver.get_window_position().get('x')
-y = driver.get_window_position().get('y')
-
-//Or store the dimensions and query them later
-position = driver.get_window_position()
-x1 = position.get('x')
-y1 = position.get('y')
-
-
-
Set Window Position
-
Moves the window to the chosen position.
-
- //Move the window to the top left of the primary monitor
-driver.manage().window().setPosition(new Point(0,0));
- //Move the window to the top left of the primary monitor
-driver.set_window_position(0, 0)
-
-
-
Maximise Window
-
Enlarges the window. For most operating systems, the window will fill
- the screen, without blocking the operating system's own menus and
- toolbars.
-
WebDriver can generally be said to have a blocking API.
- Because it is an out-of-process library that
- instructs the browser what to do,
- and because the web platform has an intrinsically asynchronous nature,
- WebDriver doesn't track the active, real-time state of the DOM.
- This comes with some challenges that we will discuss here.
-
-
From experience,
- most intermittents that arise from use of Selenium and WebDriver
- are connected to race conditions that occur between
- the browser and the user's instructions.
- An example could be that the user instructs the browser to navigate to a page,
- then gets a no such element error
- when trying to find an element.
-
-
The WebDriver instructions might look innocent enough:
-
-
-driver.navigate("file:///race_condition.html")
-el = driver.find_element_by_tag_name("p")
-assert el.text == "Hello from JavaScript!"
-
-driver.get("file:///race_condition.html");
-WebElement element = driver.findElement(By.tagName("p"));
-assertEquals(element.getText(), "Hello from JavaScript!");
-
-
-
-
The issue here is that the default
- page load strategy
- used in WebDriver listens for the document.readyState
- to change to "complete" before returning from the call to navigate.
- Because the p element is
- added after the document has completed loading,
- this WebDriver script might be intermittent.
- It “might” be intermittent because no guarantees can be made
- about elements or events that trigger asynchronously
- without explicitly waiting—or blocking—on those events.
-
-
Fortunately, using the normal instruction set available on
- the WebElement interface—such
- as WebElement.click and WebElement.sendKeys—are
- guaranteed to be synchronous,
- in that the function calls won't return
- (or the callback won't trigger in callback-style languages)
- until the command has been completed in the browser.
- The advanced user interaction APIs,
- Keyboard and
- Mouse,
- are exceptions as they are explicitly intended as
- “do what I say” asynchronous commands.
-
-
Waiting is having the automated task execution
- elapse a certain amount of time before continuing with the next step.
-
-
To overcome the problem of race conditions
- between the browser and your WebDriver script,
- most Selenium clients ship with a wait package.
- When employing a wait,
- you are using what is commonly referred to
- as an explicit wait.
-
-
-
Explicit Wait
-
-
Explicit waits are available to Selenium clients
- for imperative, procedural languages.
- They allow your code to halt program execution,
- or freeze the thread,
- until the condition you pass it resolves.
- The condition is called with a certain frequency
- until the timeout of the wait is elapsed.
- This means that for as long as the condition returns a falsy value,
- it will keep trying and waiting.
-
-
Since explicit waits allow you to wait for a condition to occur,
- they make a good fit for synchronising the state between the browser and its DOM,
- and your WebDriver script.
-
-
To remedy our buggy instruction set from earlier,
- we could employ a wait to have the findElement call
- wait until the dynamically added element from the script
- has been added to the DOM:
-
-
We pass in the condition as a function reference
- that the wait will run repeatedly until its return value is truthy.
- A “truthful” return value is anything that evaluates to boolean true
- in the language at hand, such as a string, number, a boolean,
- an object (including a WebElement),
- or a populated (non-empty) sequence or list.
- That means an empty list evaluates to false.
- When the condition is truthful and the blocking wait is aborted,
- the return value from the condition becomes the return value of the wait.
-
-
With this knowledge,
- and because the wait utility ignores no such element errors by default,
- we can refactor our instructions to be more concise:
-
-
from selenium.webdriver.support.ui import WebDriverWait
-
-driver.navigate("file:///race_condition.html")
-el = WebDriverWait(driver).until(lambda d: return d.find_element_by_tag_name("p"))
-assert el.text == "Hello from JavaScript!"
-
-
In that example, we pass in an anonymous function
- (but we could also define it explicitly as we did earlier so it may be reused).
- The first and only argument that is passed to our condition
- is always a reference to our driver object, WebDriver
- (called d in the example).
- In a multi-threaded environment, you should be careful
- to operate on the driver reference passed in to the condition
- rather than the reference to the driver in the outer scope.
-
-
Because the wait will swallow no such element errors
- that are raised when the element isn't found,
- the condition will retry until the element is found.
- Then it will take the return value, a WebElement,
- and pass it back through to our script.
-
-
If the condition fails,
- e.g. a truthful return value from the condition is never reached,
- the wait will throw/raise an error/exception called a timeout error.
-
-
-
Options
-
-
The wait condition can be customised to match your needs.
- Sometimes it's unnecessary to wait the full extent of the default timeout,
- as the penalty for not hitting a successful condition can be expensive.
-
-
The wait lets you pass in an argument to override the timeout:
-
-
Because it's quite a common occurrence
- to have to synchronise the DOM and your instructions,
- most clients also come with a set of predefined expected conditions.
- As might be obvious by the name,
- they are conditions that are predefined for frequent wait operations.
-
-
The conditions available in the different language bindings vary,
- but this is a non-exhaustive list of a few:
-
-
-
-
alert is present
-
-
-
element exists
-
-
-
element is visible
-
-
-
title contains
-
-
-
title is
-
-
-
element staleness
-
-
-
visible text
-
-
-
-
You can refer to the API documentation for each client binding
- to find an exhaustive list of expected conditions:
-
-
There is a second type of wait that is distinct from
- explicit wait called implicit wait.
- By implicitly waiting, WebDriver polls the DOM
- for a certain duration when trying to find any element.
- This can be useful when certain elements on the webpage
- are not available immediately and need some time to load.
-
-
Implicit waiting for elements to appear is disabled by default
- and will need to be manually enabled on a per-session basis.
- Mixing explicit waits and implicit waitis
- will cause unintended consequences, namely waits sleeping for the maximum
- time even if the element is available or condition is true.
-
-
Warning:
- Do not mix implicit and explicit waits.
- Doing so can cause unpredictable wait times.
- For example, setting an implicit wait of 10 seconds
- and an explicit wait of 15 seconds
- could cause a timeout to occur after 20 seconds.
-
-
An implicit wait is to tell WebDriver to poll the DOM
- for a certain amount of time when trying to find an element or elements
- if they are not immediately available.
- The default setting is 0, meaning disabled.
- Once set, the implicit wait is set for the life of the session.
-
-
FluentWait instance defines the maximum amount of time to wait for a condition,
- as well as the frequency with which to check the condition.
-
-
Users may configure the wait to ignore specific types of exceptions whilst waiting,
- such as NoSuchElementExceptions when searching for an element on the page.
-
-
// Waiting 30 seconds for an element to be present on the page, checking
-// for its presence once every 5 seconds.
-Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
- .withTimeout(30, SECONDS)
- .pollingEvery(5, SECONDS)
- .ignoring(NoSuchElementException.class);
-
-WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
- public WebElement apply(WebDriver driver) {
- return driver.findElement(By.id("foo"));
- }
-});
WebDriver provides an API for working with the three types of native
- popup message offered by JavaScript. These popups are styled by the
- browser and offer limited customisation.
-
-
Alerts
-
-
The simplest of these is referred to as an alert, which shows a
- custom message, and a single button which dismisses the alert, labelled
- in most browsers as OK. It can also be dismissed in most browsers by
- pressing the close button, but this will always do the same thing as
- the OK button. See an example alert.
-
-
WebDriver can get the text from the popup and accept or dismiss these
- alerts.
-
-
-
-//Click the link to activate the alert
-driver.findElement(By.linkText("See an example alert")).click();
-
-//Wait for the alert to be displayed and store it in a variable
-Alert alert = wait.until(ExpectedConditions.alertIsPresent());
-
-//Store the alert text in a variable
-String text = alert.getText();
-
-//Press the OK button
-alert.accept();
-
-
-# Click the link to activate the alert
-driver.find_element_by_link_text("See an example alert").click()
-
-# Wait for the alert to be displayed and store it in a variable
-alert = wait.until(expected_conditions.alert_is_present())
-
-# Store the alert text in a variable
-text = alert.text
-
-# Press the OK button
-alert.accept()
-
-
-
-
Confirm
-
-
A confirm box is similar to an alert, except the user can also choose
- to cancel the message. See
- a sample confirm.
-
-
This example also shows a different approach to storing an alert:
-
-
-
-//Click the link to activate the alert
-driver.findElement(By.linkText("See a sample confirm")).click();
-
-//Wait for the alert to be displayed
-wait.until(ExpectedConditions.alertIsPresent());
-
-//Store the alert in a variable
-Alert alert = driver.switchTo().alert();
-
-//Store the alert in a variable for reuse
-String text = alert.getText();
-
-//Press the Cancel button
-alert.dismiss();
-
-
-# Click the link to activate the alert
-driver.find_element_by_link_text("See a sample confirm").click()
-
-# Wait for the alert to be displayed
-wait.until(expected_conditions.alert_is_present())
-
-# Store the alert in a variable for reuse
-alert = driver.switch_to.alert
-
-# Store the alert text in a variable
-text = alert.text
-
-# Press the Cancel button
-alert.dismiss()
-
-
-
-
Prompt
-
-
Prompts are similar to confirm boxes, except they also include a text
- input. Similar to working with form elements, you can use WebDriver's
- send keys to fill in a response. This will completely replace the placeholder
- text. Pressing the cancel button will not submit any text.
-
- See a sample prompt.
-
-
-
-//Click the link to activate the alert
-driver.findElement(By.linkText("See a sample prompt")).click();
-
-//Wait for the alert to be displayed and store it in a variable
-Alert alert = wait.until(ExpectedConditions.alertIsPresent());
-
-//Type your message
-alert.sendKeys("Selenium");
-
-//Press the OK button
-alert.accept();
-
-
-# Click the link to activate the alert
-driver.find_element_by_link_text("See a sample prompt").click()
-
-# Wait for the alert to be displayed
-wait.until(expected_conditions.alert_is_present())
-
-# Store the alert in a variable for reuse
-alert = Alert(driver)
-
-# Type your message
-alert.send_keys("Selenium")
-
-# Press the OK button
-alert.accept()
-
-
-
-
HTTP proxies
-
-
Page Load Strategy
-
-
Web Element
-
-
Represents a DOM element. WebElements can be found by searching from the
- document root using a WebDriver instance, or by searching under another
- WebElement:
-
-
CAPTCHA, short for Completely Automated Public Turing test
- to tell Computers and Humans Apart,
- is explicitly designed to prevent automation, so don’t try!
- There are two primary strategies to get around CAPTCHA checks:
-
-
-
Disable CAPTCHAs in your test environment
-
Add a hook to allow tests to bypass the CAPTCHA
-
-
-
-
File downloads
-
-
Whilst it is possible to start a download
- by clicking a link with a browser under Selenium's control,
- the API does not expose download progress,
- making it less than ideal for testing downloaded files.
- This is because downloading files is not considered an important aspect
- of emulating user interaction with the web platform.
- Instead, find the link using Selenium
- (and any required cookies)
- and pass it to a HTTP request library like
- libcurl.
-
-
-
HTTP response codes
-
-
For some browser configurations in Selenium RC,
- Selenium acted as a proxy between the browser
- and the site being automated.
- This meant that all browser traffic passed through Selenium
- could be captured or manipulated.
- The captureNetworkTraffic() method
- purported to capture all of the network traffic between the browser
- and the site being automated,
- including HTTP response codes.
-
-
Selenium WebDriver is a completely different approach
- to browser automation,
- preferring to act more like a user
- and this is represented in the way you write tests with WebDriver.
- In automated functional testing,
- checking the status code
- is not a particularly important detail of a test's failure;
- the steps that preceded it are more important.
-
-
The browser will always represent the HTTP status code,
- imagine for example a 404 or a 500 error page.
- A simple way to “fail fast” when you encounter one of these error pages
- is to check the page title or content of a reliable point
- (e.g. the <h1> tag) after every page load.
- If you are using the page object model,
- you can include this check in your class constructor
- or similar point where the page load is expected.
- Occasionally, the HTTP code may even be represented
- in the browser's error page
- and you could use WebDriver to read this
- and improve your debugging output.
-
-
Checking the webpage itself is in line
- with WebDriver's ideal practice
- of representing and asserting upon the user’s view of the website.
-
-
If you insist, an advanced solution to capturing HTTP status codes
- is to replicate the behaviour of Selenium RC by using a proxy.
- WebDriver API provides the ability to set a proxy for the browser,
- and there are a number of proxies that will
- programmatically allow you to manipulate
- the contents of requests sent to and received from the web server.
- Using a proxy lets you decide how you want to respond
- to redirection response codes.
- Additionally, not every browser
- makes the response codes available to WebDriver,
- so opting to use a proxy
- allows you to have a solution that works for every browser.
-
-
-
Gmail, email, and Facebook logins
-
-
For multiple reasons, logging into sites like Gmail and Facebook
- using WebDriver is not recommended.
- Aside from being against the usage terms for these sites
- (where you risk having the account shut down),
- it is slow and unreliable.
-
-
The ideal practice is to use the APIs that email providers offer,
- or in the case of Facebook the developer tools service
- which exposes an API for creating test accounts, friends and so forth.
- Although using an API might seem like a bit of extra hard work,
- you will be paid back in speed, reliability, and stability.
- The API is also unlikely to change
- whereas webpages and HTML locators change often
- and require you to update your test framework.
-
-
Logging in to third party sites using WebDriver
- at any point of your test increases the risk
- of your test failing because it makes your test longer.
- A general rule of thumb is that longer tests
- are more fragile and unreliable.
-
-
WebDriver implementations that are
- W3C conformant
- also annotate the navigator object
- with a webdriver property
- so that Denial of Service attacks can be mitigated.
-
-
-
Test dependency
-
- A common idea and misconception about automated testing is regarding a
- specific test order. Your tests should be able to run in any order,
- and not rely on other tests to complete in order to be successful.
-
-
-
-
Performance testing
-
-
Performance testing using Selenium and WebDriver
- is generally not advised.
- Not because it is incapable
- but because it is not optimised for the job
- and you are unlikely to get good results.
-
-
It may seem ideal to performance test
- in the context of the user but a suite of WebDriver tests
- are subjected to many points of external and internal fragility
- which are beyond your control;
- for example browser startup speed,
- speed of HTTP servers,
- response of third party servers that host JavaScript or CSS,
- and the instrumentation penalty
- of the WebDriver implementation itself.
- Variation at these points will cause variation in your results.
- It is difficult to separate the difference
- between the performance of your website
- and the performance of external resources,
- and it is also hard to tell what the performance penalty is
- for using WebDriver in the browser,
- especially if you are injecting scripts.
-
-
The other potential attraction is "saving time" —
- carrying out functional and performance tests at the same time.
- However, functional and performance tests have opposing objectives.
- To test functionality, a tester may need to be patient
- and wait for loading,
- but this will cloud the performance testing results and vice versa.
-
-
To improve the performance of your website,
- you will need to be able to analyse overall performance
- independent of environment differences,
- identify poor code practices,
- breakdown of performance of individual resources
- (i.e. CSS or JavaScript)
- in order to know what to improve.
- There are performance testing tools available
- that can do this job already,
- and which provide reporting and analysis
- which can even make improvement suggestions.
-
-
Example (open source) packages to use are: Jmeter ?
-
-
-
Link spidering
-
-
Using WebDriver to spider through links
- is not a recommended practice not because it cannot be done,
- but because it’s definitely not the most ideal tool.
- WebDriver needs time to start up,
- and can take several seconds up to a minute
- depending on how your test is written,
- just to get to the page and traverse through the DOM.
-
-
Instead of using WebDriver for this,
- you could save a ton of time
- by executing a curl command,
- or using a library such as BeautifulSoup
- since these methods don’t rely
- on creating a browser and navigating to a page.
- You are saving tonnes of time by not using WebDriver for this task.
diff --git a/docs_source_files/archetypes/default.md b/docs_source_files/archetypes/default.md
new file mode 100644
index 00000000000..00e77bd79be
--- /dev/null
+++ b/docs_source_files/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
+
diff --git a/docs_source_files/config.toml b/docs_source_files/config.toml
new file mode 100644
index 00000000000..9111a243e3c
--- /dev/null
+++ b/docs_source_files/config.toml
@@ -0,0 +1,196 @@
+baseURL = ""
+languageCode = "en-US"
+defaultContentLanguage = "en"
+# Force to have /en/my-page and /fr/my-page routes, even for default language.
+defaultContentLanguageInSubdir= true
+
+canonifyurls = "true"
+
+title = "Documentation for Selenium"
+theme = "hugo-theme-learn"
+copyright = "2013-{year}"
+
+# Code highlighting
+pygmentsUseClasses = false
+pygmentsCodeFences = true
+pygmentsCodefencesGuessSyntax = true
+pygmentsStyle = "solarized-dark"
+
+enableGitInfo = true
+
+[params]
+ # Change default color scheme with a variant one. Can be "red", "blue", "green".
+ themeVariant = "selenium"
+ editURL = "https://github.com/SeleniumHQ/docs/edit/gh-pages/docs_source_files/content/"
+ ghrepo = "https://github.com/SeleniumHQ/docs/"
+ description = "Documentation for Selenium"
+ showVisitedLinks = true
+ disableBreadcrumb = false
+ disableNextPrev = false
+
+# For search functionality
+[outputs]
+home = [ "HTML", "RSS", "JSON"]
+
+[Languages]
+[Languages.en]
+title = "Documentation for Selenium"
+weight = 1
+languageName = "English"
+baseURL = "/documentation/en"
+
+[[Languages.en.menu.shortcuts]]
+name = " GitHub repo"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[[Languages.en.menu.shortcuts]]
+name = " Report a bug"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.en.menu.shortcuts]]
+name = " Credits"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.en.menu.shortcuts]]
+name = " How to contribute"
+url = "contributing"
+weight = 30
+
+[Languages.es]
+title = "Documentación de Selenium"
+weight = 2
+languageName = "Español"
+baseURL = "/documentation/es"
+
+[[Languages.es.menu.shortcuts]]
+name = " Repo en GitHub"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[[Languages.es.menu.shortcuts]]
+name = " Reportar un problema"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.es.menu.shortcuts]]
+name = " Créditos"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.es.menu.shortcuts]]
+name = " Cómo contribuír"
+url = "contributing"
+weight = 30
+
+[Languages.nl]
+title = "Selenium documentatie"
+weight = 3
+languageName = "Nederlands"
+baseURL = "/documentation/nl"
+
+[[Languages.nl.menu.shortcuts]]
+name = " GitHub repo"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[[Languages.nl.menu.shortcuts]]
+name = " Meld een probleem"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.nl.menu.shortcuts]]
+name = " Credits"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.nl.menu.shortcuts]]
+name = " Hoe bij te dragen"
+url = "contributing"
+weight = 30
+
+[Languages.zh-cn]
+title = "Selenium 文档"
+weight = 4
+languageName = "中文简体"
+baseURL = "/documentation/zh-cn"
+
+[[Languages.zh-cn.menu.shortcuts]]
+name = " GitHub repo"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[[Languages.zh-cn.menu.shortcuts]]
+name = " Report a bug"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.zh-cn.menu.shortcuts]]
+name = " Credits"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.zh-cn.menu.shortcuts]]
+name = " How to contribute"
+url = "contributing"
+weight = 30
+
+[Languages.fr]
+title = "Documentation Selenium"
+weight = 5
+languageName = "Français"
+baseURL = "/documentation/fr"
+
+[[Languages.fr.menu.shortcuts]]
+name = " Signaler un problème"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.fr.menu.shortcuts]]
+name = " Crédits"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.fr.menu.shortcuts]]
+name = " Comment contribuer"
+url = "contributing"
+weight = 30
+
+[[Languages.fr.menu.shortcuts]]
+name = " GitHub repo"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[Languages.ja]
+title = "Seleniumドキュメント"
+weight = 6
+languageName = "日本語"
+baseURL = "/documentation/ja"
+
+[[Languages.ja.menu.shortcuts]]
+name = " GitHub リポ"
+identifier = "ds"
+url = "https://github.com/SeleniumHQ/docs"
+weight = 10
+
+[[Languages.ja.menu.shortcuts]]
+name = " バグ報告"
+url = "https://github.com/seleniumhq/docs/issues"
+weight = 11
+
+[[Languages.ja.menu.shortcuts]]
+name = " クレジット"
+url = "front_matter/copyright_and_attributions"
+weight = 20
+
+[[Languages.ja.menu.shortcuts]]
+name = " 貢献方法"
+url = "contributing"
+weight = 30
diff --git a/docs_source_files/content/CONTRIBUTING.en.md b/docs_source_files/content/CONTRIBUTING.en.md
new file mode 100644
index 00000000000..d293b865699
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.en.md
@@ -0,0 +1,190 @@
+---
+title: Contributing to the Selenium Documentation
+disableToc: true
+---
+
+Selenium is a big software project and documentation is key to
+understanding how things work and learning effective ways to exploit
+its potential.
+
+Part of the documentation of Selenium is still served from our
+[**www.seleniumhq.org** repository](https://github.com/SeleniumHQ/www.seleniumhq.org).
+We are however phasing out this documentation which focuses too much
+on Selenium RC and other antiquated pieces, in favour of this rewrite.
+
+The new documentation is a project started to rewrite Selenium's
+documentation from scratch. This is an ongoing effort (not targetted
+at any specific release) to provide an updated handbook on how to use
+Selenium effectively. We hope to bring over the pieces of the old
+documentation that makes sense.
+
+Contributions toward the new docs follow the process described in
+the below section about contributions. You should spend some time
+familiarising yourself with the documentation by reading
+[more about it]({{< ref "/introduction/about_this_documentation.en.md" >}}).
+
+---
+
+The Selenium project welcomes contributions from everyone. There are a
+number of ways you can help:
+
+## Report an issue
+
+When reporting a new issues or commenting on existing issues please
+make sure discussions are related to concrete technical issues with the
+Selenium software and/or its documentation.
+
+All of the Selenium components change quite fast over time, so this
+might cause the documentation to be out of date. If you find this to
+be the case, as mentioned, don't doubt to create an issue for that.
+It also might be possible that you know how to bring up to date the
+documentation, so please send us a pull request with the related
+changes.
+
+If you are not sure about what you have found is an issue or not,
+please ask first about it to the
+[selenium-users@ mailing list](https://groups.google.com/forum/#!forum/selenium-users),
+or join us in the `#selenium` channel
+on [irc.freenode.org](https://webchat.freenode.net/) or [Slack](https://seleniumhq.herokuapp.com/).
+
+## Contributions
+
+The Selenium project welcomes new contributors. Individuals making
+significant and valuable contributions over time are made _Committers_
+and given commit-access to the project.
+
+This document will guide you through the contribution process.
+
+### Step 1: Fork
+
+Fork the project [on Github](https://github.com/seleniumhq/docs)
+and check out your copy locally.
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+#### Dependencies: Hugo
+
+The docs use [Hugo](https://gohugo.io/) to build and render the site.
+To verify everything locally before even commiting any changes, please
+[install Hugo](https://gohugo.io/getting-started/installing/) and
+[run the local server](https://gohugo.io/getting-started/usage/#livereload)
+to render the site locally.
+
+### Step 2: Branch
+
+Create a feature branch and start hacking:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+We practice HEAD-based development, which means all changes are applied
+directly on top of master.
+
+### Step 3: Commit
+
+First make sure git knows your name and email address:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**Writing good commit messages is important.** A commit message
+should describe what changed, why, and reference issues fixed (if
+any). Follow these guidelines when writing one:
+
+1. The first line should be around 50 characters or less and contain a
+ short description of the change.
+2. Keep the second line blank.
+3. Wrap all other lines at 72 columns.
+4. Include `Fixes #N`, where _N_ is the issue number the commit
+ fixes, if any.
+
+A good commit message can look like this:
+
+```text
+explain commit normatively in one line
+
+Body of commit message is a few lines of text, explaining things
+in more detail, possibly giving some background about the issue
+being fixed, etc.
+
+The body of the commit message can be several paragraphs, and
+please do proper word-wrap and keep columns shorter than about
+72 characters or so. That way `git log` will show things
+nicely even when it is indented.
+
+Fixes #141
+```
+
+The first line must be meaningful as it's what people see when they
+run `git shortlog` or `git log --oneline`.
+
+### Step 4: Rebase
+
+Use `git rebase` (not `git merge`) to sync your work from time to time.
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### Step 5: Test
+
+Always remember to [run the local server](https://gohugo.io/getting-started/usage/#livereload),
+with this you can be safe that your changes have not broken anything.
+
+### Step 6: Translations
+
+If you are updating the docs, adding new ones, or deleting deprecated ones, please remember
+to update the translations of it. Of course, it is possible that you do not speak all the
+translated languages in the docs. For that, please create an
+[issue](https://github.com/SeleniumHQ/docs/issues) where you clearly describe that something
+in the docs has changed and its translation needs to be updated. With that, someone who speaks
+that needed language can chime in and help us to keep it up to date.
+
+### Step 7: Sign the CLA
+
+Before we can accept, we first ask people to sign a
+[Contributor License Agreement](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0)
+(or CLA). We ask this so that we know that contributors have the right
+to donate the code.
+
+When you open your pull request we ask that you indicate that you've
+signed the CLA. This will reduce the time it takes for us to integrate
+it.
+
+### Step 8: Push
+
+```shell
+% git push origin my-feature-branch
+```
+
+Go to https://github.com/yourusername/docs.git and press the _Pull
+Request_ and fill out the form. **Please indicate that you've signed
+the CLA** (see Step 7).
+
+Pull requests are usually reviewed within a few days. If there are
+comments to address, apply your changes in new commits (preferably
+[fixups](http://git-scm.com/docs/git-commit)) and push to the same
+branch.
+
+### Step 9: Integration
+
+When code review is complete, a committer will take your PR and
+integrate it on the docs's gh-pages branch. Because we like to keep a
+linear history on the master branch, we will normally squash and rebase
+your branch history.
+
+## Communication
+
+Selenium contributors frequent the `#selenium` channel on
+[`irc.freenode.org`](https://webchat.freenode.net/) or on
+or [Slack](https://seleniumhq.herokuapp.com/). You can also join
+the [`selenium-developers@` mailing list](https://groups.google.com/forum/#!forum/selenium-developers).
+
diff --git a/docs_source_files/content/CONTRIBUTING.es.md b/docs_source_files/content/CONTRIBUTING.es.md
new file mode 100644
index 00000000000..6c2a0a83566
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.es.md
@@ -0,0 +1,133 @@
+---
+title: Contribuyendo a la documentación de Selenium
+disableToc: true
+---
+
+Selenium es un gran proyecto de software y la documentación es clave para comprender cómo funcionan las cosas y aprender formas efectivas de explotar su potencial.
+
+Parte de la documentación de Selenium todavía se sirve de nuestro [repositorio ** www.seleniumhq.org ** ](https://github.com/SeleniumHQ/www.seleniumhq.org). Sin embargo, estamos eliminando gradualmente esta documentación que se centra demasiado en Selenium RC y otras piezas anticuadas, a favor de esta reescritura.
+
+La nueva documentación es un proyecto que comenzó a reescribir la documentación de Selenium desde cero. Este es un esfuerzo continuo (no dirigido a ninguna versión específica) para proporcionar un manual actualizado sobre cómo usar Selenium de manera efectiva. Esperamos traer las piezas de la documentación antigua que aún tienen sentido.
+
+Los aportes a los nuevos documentos siguen el proceso descrito en la sección a continuación sobre las contribuciones. Debería pasar un tiempo familiarizándose con la documentación leyendo [más sobre ella]({{}}).
+
+---
+
+El proyecto Selenium agradece las contribuciones de todos. Hay varias formas de colaborar:
+
+## Reportar un problema
+
+Al informar un nuevo problema o al comentar problemas existentes, asegúrese de que las discusiones estén relacionadas con temas técnicos concretos con el software Selenium o su documentación.
+
+Todos los componentes de Selenium cambian bastante rápido en el tiempo, por lo que esto puede hacer que la documentación esté desactualizada. Si considera que este es el caso, como se mencionó, no dude en reportar un problema. También es posible que sepa cómo actualizar la documentación, así que envíenos una solicitud (_pull request_) con los cambios relacionados.
+
+Si no está seguro de si lo que encontró es un problema o no, consulte primero a la [lista de correo de selenium-users@](https://groups.google.com/forum/#!forum/selenium-users), o únase a nosotros en el canal `#selenium` en [irc.freenode.org](https://webchat.freenode.net/) o [Slack](https://seleniumhq.herokuapp.com/).
+
+## Contribuciones
+
+El proyecto Selenium da la bienvenida a nuevos contribuyentes. Las personas que hacen contribuciones significativas y valiosas a lo largo del tiempo se hacen _Committers_ y se les da acceso para realizar _commit_ al proyecto.
+
+Este documento lo guiará a través del proceso de contribución.
+
+### Step 1: Bifurcar (_Fork_)
+
+Haga _fork_ al proyecto [en Github](https://github.com/seleniumhq/docs)
+y verifique su copia localmente.
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+#### Dependencias: Hugo
+
+La documentación usa [Hugo](https://gohugo.io/) para construir y renderizar el sitio.
+Por favor, verifique todo localmente incluso antes de hacer _commit_ a cualquier cambio
+[instale Hugo](https://gohugo.io/getting-started/installing/) y
+[corra el servidor local](https://gohugo.io/getting-started/usage/#livereload)
+para renderizar el sitio localmente.
+
+### Step 2: Ramificación (_Branch_)
+
+Cree una rama nueva (_feature branch_) y comience a hackear:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+Practicamos el desarrollo basado en HEAD (_HEAD-based development_), lo que significa que todos los cambios se aplican directamente sobre la rama maestra (_master_).
+
+### Step 3: Confirmar (_Commit_)
+
+Primero asegúrese de que git sepa su nombre y dirección de correo electrónico:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**Escribir buenos mensajes de confirmación (_commit_) es importante.** Un mensaje de confirmación debe describir qué cambió, por qué y los problemas de referencia corregidos (si los hay). Siga estas pautas al escribir uno:
+
+1. Procure que el texto sea en inglés. Se colocan los ejemplos en Español para aumentar la comprensión.
+2. La primera línea debe tener alrededor de 50 caracteres o menos y contener una breve descripción del cambio.
+3. Mantenga la segunda línea en blanco.
+4. Envuelva todas las demás líneas en 72 columnas.
+5. Incluya `Fixes # N`, donde _N_ es el número de problema (_issue_) que corrige la confirmación, si corresponde.
+
+Un buen mensaje de confirmación puede verse así:
+
+```texto
+explicar cometer normativamente en una línea
+
+El cuerpo del mensaje de confirmación es unas pocas líneas de texto, que explican las cosas con más detalle, posiblemente brindando algunos antecedentes sobre la resolución del problema, etc.
+
+El cuerpo del mensaje de confirmación puede tener varios párrafos y, por favor, ajuste correctamente las palabras y mantenga las columnas con menos de 72 caracteres aproximadamente. De esa manera, 'git log' mostrará las cosas muy bien incluso cuando está sangrado.
+
+Fixes # 141
+```
+
+La primera línea debe ser significativa, ya que es lo que las personas ven cuando ejecutan `git shortlog` o` git log --oneline`.
+
+### Step 4: Rebase
+
+Use `git rebase` (not `git merge`) para sincronizar tu trabajo de vez en cuando.
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### Paso 5: Prueba
+
+Recuerde siempre [ejecutar el servidor local](https://gohugo.io/getting-started/usage/#livereload), con esto puede estar seguro de que sus cambios no han roto nada.
+
+### Paso 6: Traducciones
+
+Si está actualizando los documentos, agregando nuevos o eliminando los obsoletos, recuerde actualizar las traducciones. Por supuesto, es posible que no hables todos los idiomas traducidos en los documentos. Para eso, cree un hallazgo [issue](https://github.com/SeleniumHQ/docs/issues) donde describa claramente que algo en los documentos ha cambiado y su traducción debe actualizarse. Con eso, alguien que habla ese idioma necesario puede intervenir y ayudarnos a mantenerlo actualizado.
+
+### Paso 7: Firme el CLA
+
+Antes de que podamos aceptar, primero le pedimos a las personas que firmen un
+[Acuerdo de licencia de colaborador](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0) (o CLA). Pedimos esto para que sepamos que los contribuyentes tienen el derecho de donar el código.
+
+Cuando abre su solicitud (_pull request_), le pedimos que indique que ha firmado el CLA. Esto reducirá el tiempo que nos lleva integrarlo.
+
+### Paso 8: Empuje (_Push_)
+
+```shell
+% git push origin my-feature-branch
+```
+
+Vaya a https://github.com/yourusername/docs.git y presione _Pull Request_ y complete el formulario. **Indique que ha firmado el CLA** (consulte el Paso 7).
+
+Las solicitudes generalmente se revisan en unos pocos días. Si hay comentarios que abordar, aplique sus cambios en los nuevos commits (preferiblemente [arreglos o _fixups_](http://git-scm.com/docs/git-commit)) y avance a la misma rama (_branch_).
+
+### Paso 9: Integración
+
+Cuando se completa la revisión del código, un committer tomará su PR (_pull request_) y lo integrará en la rama (_branch_) gh-pages de los documentos. Como nos gusta mantener un historial lineal en la rama maestra, normalmente resumiremos los cambios (_squash and rebase_) del historial de su rama.
+
+## Comunicación
+
+Los contribuyentes de Selenium frecuentan el canal `#selenium` en [`irc.freenode.org`](https://webchat.freenode.net/) o en [Slack](https://seleniumhq.herokuapp.com/). También puede unirse a la [lista de correo `selenium-developers@`](https://groups.google.com/forum/#!forum/selenium-developers).
+
diff --git a/docs_source_files/content/CONTRIBUTING.fr.md b/docs_source_files/content/CONTRIBUTING.fr.md
new file mode 100644
index 00000000000..44a7127cc59
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.fr.md
@@ -0,0 +1,186 @@
+---
+title: Contribuer à la Documentation Selenium
+disableToc: true
+---
+
+Selenium est un gros projet logiciel
+et sa documentation est la clé
+pour comprendre comment fonctionnent les choses
+et apprendre à exploiter son potentiel efficacement.
+
+Une partie de la documentation Selenium est toujours hébergée sur notre [dépôt **www.seleniumhq.org**](https://github.com/SeleniumHQ/www.seleniumhq.org).
+Cependant nous abandonnons progressivement cette documentation
+qui se concrentre trop sur Selenium RC et autres parties obsolètes,
+ en faveur de cette réécriture.
+
+C'est un projet démarré dans le but de réécrire la documentation Selenium à partir de zéro.
+C'est un effort continu (sans cible de release spécifique)
+dans le but de fournir un manuel à jour sur l'utilisation effective de Selenium.
+Nous espérons rappatrier les parties de l'ancienne documentation lorsque nécessaire.
+
+Les contributions à cette nouvelle documentation suivent le process décrit
+dans la section _Contribution_ ci-dessous.
+Il est recommandé de se familiariser avec la documentation
+en en[lisant un peu plus ici]({{< ref "/introduction/about_this_documentation.fr.md" >}}).
+
+---
+
+Le projet Selenium accueille tout type de contribution.
+Voici les différentes aides que vous pouvez apporter:
+
+## Signaler un problème
+
+Lorsque vous signalez une nouveau issue ou en commentez une existante,
+merci de vous assurer que la discussion se concentre sur des problèmes techniques concrets liés à Selenium et/ou sa documentation.
+
+Tous les composants de Selenium évoluent assez rapidement au cours du temps,
+ce qui peut engendrer une documentation dépassée.
+Si cela se trouve être le cas,
+comme mentionné précédemment n'hésitez pas à créer une issue.
+Il se peut que vous souhaitiez également contribuer à mettre à jour la documentation,
+dans ce cas envoyez nous une pull request avec les modifications associées.
+
+Si vous avez un doute sur la réalité d'un problème que vous rencontrez,
+merci de d'abord poser la question à la [mailing list selenium-users@](https://groups.google.com/forum/#!forum/selenium-users),
+ou de nous rejoindre sur le canal `#selenium` sur [irc.freenode.org](https://webchat.freenode.net/)
+ou [Slack](https://seleniumhq.herokuapp.com/).
+
+## Contributions
+
+Le projet Selenium appécie les nouveaux contributeurs.
+Les personnes contribuant de façon significative et répétée dans le temps
+sont promus _Committers_ et ont un commit-access sur le projet.
+
+Ce document va vous guider à travers le process de contribution.
+
+### Etape 1: Fork
+
+Forker le projet [sur Github](https://github.com/seleniumhq/docs)
+et faites un check out sur votre copie locale.
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+#### Dépendences: Hugo
+
+La documentation utilise [Hugo](https://gohugo.io/) afin de construire et afficher le site.
+Afin de tester localement avant de commiter tout changement,
+merci d'[installer Hugo](https://gohugo.io/getting-started/installing/)
+et de [démarrer le serveur local](https://gohugo.io/getting-started/usage/#livereload) pour afficher le site en local.
+
+### Etape 2: Branch
+
+Créez une branche pour votre fonctionnalité
+et commencez à faire vos modifications:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+Nous utilisons un développement basé sur le HEAD, ce qui veut dire que tous les changements sont appliqués
+directement sur le master.
+
+### Etape 3: Commit
+
+Assurez-vous d'abord que git connaisse votre nom et votre adresse mail:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**Ecrire de bon message de commit est important.**
+Un message de commit devrait décrire le changement,
+la raison du changement, et référencer les issues corrigées (si nécessaire).
+Suivez les lignes directrices suivantes:
+
+1. La première ligne devrait faire approximativement 50 caractères ou moins et contenir une description courte du changement
+2. La seoncde ligne doit rester vide
+3. Retourner à la ligne à la colonne 72 pour chaque ligne du corps du message
+4. Inclure `Fixes #N`, lorsque nécessaire. Où _N_ est le numéro de li'ssue que le commit corrige
+
+Un bon message de commit peut ressembler à ceci:
+```text
+explique le commit en une ligne
+
+Corps du commit de message constitué de quelques lignes, expliquant
+les choses de façon plus détaillé, contextualisant si besoin
+le problème corrigé, etc.
+
+Le corps du message peut être constitué de plusieurs paragraphes.
+Et encore merci de garder des lignes de moins de 72 caractères.
+Grâce à cela, la sortie de `git log` restera propre même avec
+indentation.
+
+Fixes #141
+```
+La première ligne doit être la plus parlante possible,
+c'est ce que les gens verront lors d'un `git shortlog` ou `git log --oneline`.
+
+### Etape 4: Rebase
+
+Faites un `git rebase` (et non pas `git merge`) afin de synchroniser votre travail de temps en temps.
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### Etape 5: Test
+
+Rappelez-vous bien de toujours [lancer le serveur local](https://gohugo.io/getting-started/usage/#livereload),
+pour vous assurez que vos changements non rien cassé.
+
+### Etape 6: Traduction
+
+Si vous mettez à jour des infos, en ajouter de nouvelles, ou supprimer des infos obsolètes,
+merci de garder la traduction à jour également.
+Bien sûr il est possible que vous ne parliez pas toutes les langues disponibles.
+Dans ce cas, créez une nouvelle [issue](https://github.com/SeleniumHQ/docs/issues)
+dans laquelle vous décrivez clairement que telle partie de la documentation a évolué
+et qu'une traduction est nécessaire.
+De cette manière, un contributeur parlant une des langues disponibles pourra intervenir
+et nous aider à garder la traduction à jour.
+
+### Etape 7: Signer le CLA
+
+Avant que nous puissions accepter,
+nous vous demandons de signer un [Contributor License Agreement](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0) (ou CLA).
+Et ce afin de nous assurer que les contributeurs ont le droit de céder leur code.
+
+Lorsque vous ouvrez votre pull request,
+nous vous demandons d'indiquer que vous avez signé le CLA.
+Cela réduira d'autant le temps d'intégration de votre demande.
+
+### Etape 8: Push
+
+```shell
+% git push origin my-feature-branch
+```
+
+Rendez-vous sur https://github.com/yourusername/docs.git
+et cliquez sur le bouton _Pull Request_
+et remplissez le formulaire.
+**Merci d'indiquer que vous avez signé le CLA** (voir Etape 7).
+
+Les Pull Requests sont généralement traitées en quelques jours.
+Si il y a des commentaires à prendre en compte de votre part,
+appliquer vos modifications dans de nouveaux commits (de préférence via [fixups](http://git-scm.com/docs/git-commit))
+et faites un push sur la même branche.
+
+### Etape 9: Intégration
+
+Lorsque la revue de code est terminée,
+un commiter intégrera votre PR sur la branche gh-pages de la documentation.
+Comme nous aimons garder un historique linéraire de la branche master,
+nous ferons normalement un squash et rebase de l'historique de votre branche.
+
+## Communication
+
+Les contributeurs Selenium fréquentent le canal `#selenium` sur
+[`irc.freenode.org`](https://webchat.freenode.net/) ou sur [Slack](https://seleniumhq.herokuapp.com/).
+vous pouvez également rejoindre la [mailing list `selenium-developers@`](https://groups.google.com/forum/#!forum/selenium-developers).
+
diff --git a/docs_source_files/content/CONTRIBUTING.ja.md b/docs_source_files/content/CONTRIBUTING.ja.md
new file mode 100644
index 00000000000..061db924202
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.ja.md
@@ -0,0 +1,136 @@
+---
+title: Seleniumドキュメンテーションに貢献
+disableToc: true
+---
+
+Seleniumは大きなソフトウェアプロジェクトです、そしてドキュメンテーションはどのように機能しているかを理解し、ソフトウェアの持ち得る可能性の効果的な利用方法を学ぶための鍵です。
+
+ドキュメンテーションの一部はまだ[**www.seleniumhq.org** リポジトリ](https://github.com/SeleniumHQ/www.seleniumhq.org)から配信されています。
+このドキュメンテーションはSelenium RCと他の旧式の機能にあまりにも重点が置かれているので私達は段階的に廃止し、新しく書き直しをしていきます。
+
+この新しいドキュメンテーションプロジェクトはSeleniumのドキュメンテーションを一から書き直すことから始まりました。これは更新されたSeleniumを効果的に使用する為のハンドブックを提供する為の継続的な努力です(特定なリリースを目標するのではない)。私達は古いドキュメンテーションのうちまだ有効なものを移行したいと思っています。
+
+新しいドキュメンテーションの貢献には下記の貢献についてのセクションに書いてある手順をもとにしてます。多少の時間をかけて読むことによってドキュメンテーションに馴染んでください。
+[もっと詳しく読む]({{< ref "/introduction/about_this_documentation.ja.md" >}})
+
+---
+
+Seleniumプロジェクトはすべての人からの貢献を歓迎します。手伝うにはいくつかの方法があります:
+
+## 課題を報告する
+
+新たに問題を報告する時や、既存の課題についてコメントする時にはSeleniumソフトウェアそのものかそれに関わるドキュメンテーションの具体的な技術問題に付いてのみ討議するようにしてください。
+
+すべてのSeleniumのコンポーネントは時間と共にかなり早く更新されます、なのでこれがドキュメンテーションを形骸化を招くかもしれません。もしそのようなことを発見した場合には、迷わず問題を報告してください。または、ひょっとしてドキュメンテーションの更新方法を知っているならば、修正点を含むプルリクエストを提出してください。
+
+もし、見つけたものが問題かどうか確信がないときは[selenium-users@ メーリングリスト](https://groups.google.com/forum/#!forum/selenium-users)で質問してください,または[irc.freenode.org](https://webchat.freenode.net/)か[Slack](https://seleniumhq.herokuapp.com/)の`#selenium`チャンネルに参加してください。
+
+## 貢献
+
+Seleniumプロジェクトは新たな貢献者を歓迎します。 重要かつ価値のある貢献をある程度の期間して頂いた方には_コミッター_(_Committers_)になっていただきプロジェクトへのcommit-accessの権限が譲与されます。
+
+このドキュメンテーションは貢献プロセスを案内します。
+
+### ステップ 1: フォーク (_Fork_)
+
+[Github](https://github.com/seleniumhq/docs)のプロジェクトをフォークして
+ローカル環境にチェックアウトしてください。
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+https://gohugo.io/getting-started/installing/
+
+#### 依存関係: ヒューゴ (Hugo)
+
+ドキュメンテーションは[ヒューゴ (Hugo)](https://gohugo.io/) を用いてサイトの生成とレンダーしています。
+変更点をコミットする前にすべてをローカル環境で確認するために、
+[ヒューゴ (Hugo)をインストール](https://gohugo.io/getting-started/installing/) して
+サイトをローカル環境でレンダーするために[ローカルサーバーを実行](https://gohugo.io/getting-started/usage/#livereload)してください。
+
+### ステップ 2:ブランチ (_Branch_)
+
+フィーチャーブランチを作成して、取り組み始める:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+私達はHEAD-based開発を実践しています、すなわち全ての変更はmaster上に直接反映されます。
+
+### ステップ 3:コミット(_Commit_)
+
+初めにgitにあなたの名前とメールアドレスを登録済みか確認してください:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**良質なコミットメッセージを書くことは重要です。**コミットメッセージには変更点、理由、修正したissueへの参照(もし存在するならば)を記述すべきです。コミットメッセージを書く時には次のガイドラインに従ってください:
+
+1. 1行目は50字以内で、変更内容の要約を含める。
+2. 2行目は空行にする。
+3. 各行を72列で改行する。
+4. もしあるならば`Fixes #N`を含める, 但し_N_はこのコミットが修正するissueナンバーです。
+
+良質なコミットメッセージとはこんな感じです:
+
+```text
+一行でコミットを規範的に説明する
+
+コミットメッセージの本文は2〜3行でより詳しく説明し、修正されるissueに
+ついての背景など可能な限り入れます。
+
+コミットメッセージいくつかのパラグラフになる場合があります、そして正し
+く改行して、一行が72文字以内になるよう努めてください。そうすると
+`git log`がインデントされていてもきれいに表示されます。
+
+Fixes #141
+```
+
+一行目は意味のあるものではないといけません、というのは`git shortlog`又は`git log --oneline`を実行したときに人に見えるものだからです。
+
+### ステップ 4: リーベース(_Rebase_)
+
+ (`git merge`ではなく)`git rebase`を使用してコードの同期化時々します。
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### ステップ 5: 検証
+
+いつも[ローカルサーバーを実行すること](https://gohugo.io/getting-started/usage/#livereload)を覚えてくださいそうすることで変更点が他の物を壊さない確証が得られます。
+
+### ステップ 6: 翻訳
+
+もし新しいものを付け加えたり、いらなくなったものを削除したりして、ドキュメンテーションを更新するならば翻訳も忘れずに更新してください。もちろんすべての翻訳言語が話せるとは限りませんです。そのような場合には[課題(issue)](https://github.com/SeleniumHQ/docs/issues)を作成し、ドキュメンテーション上どこが変更されたのかと翻訳が必要であること明記してください。それによって、その必要な言語が話せるどなたかが立候補してドキュメンテーションが更新され続ける事を手助けしてくれます。
+
+### ステップ 7:CLAに署名する
+
+受け入れができる前に、私達は最初に[貢献者ライセンス同意書(_Contributor License Agreement_)](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0)(又はCLA)に署名をお願いしています。私達がお願いするのには貢献者がコードを寄付する権利を有することを私達が知るためです。
+
+プルリクエストを提出する時にCLA貢献者ライセンス同意書に署名したことを提示してください。そうすると統合させるまでの時間を減らせます。
+
+### ステップ 8: プッシュ(_Push_)
+
+```shell
+% git push origin my-feature-branch
+```
+
+https://github.com/yourusername/docs.git へ行き _PullRequest_ を押して、フォームに記入します。**CLAに署名したことを提示してください** (ステップ 6参照)。
+
+通常プルリクエストは2−3日中にレビューされます。もし処理しなくてはいけないコメントがあるならば、新たなコミット(_commit_)に修正箇所を含めます。(なるべく[フィックスアップ(_fixups_)](http://git-scm.com/docs/git-commit)を使用する)そして同じブランチ(_branch_)にプッシュ(_push_)します。
+
+### ステップ 9: 統合
+
+コードレビュー終了した時に、_コミッター_(_Committers_)がPR(プルリクエスト)を受取り、ドキュメントのgh-pagesブランチと統合させます。masterブランチの履歴を一本線で維持したいので、スクワッシュ(_squash_)とリーベース(_rebase_)をあなたのブランチに対して通常行います。
+
+## コミュニケーション
+
+Seleniumの貢献者は頻繁に[`irc.freenode.org`](https://webchat.freenode.net/)や[Slack](https://seleniumhq.herokuapp.com/)の`#selenium`チャンネルに集まります。[`selenium-developers@` メーリングリスト](https://groups.google.com/forum/#!forum/selenium-developers)にも参加することができます。
diff --git a/docs_source_files/content/CONTRIBUTING.nl.md b/docs_source_files/content/CONTRIBUTING.nl.md
new file mode 100644
index 00000000000..45ac161ab6b
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.nl.md
@@ -0,0 +1,196 @@
+---
+title: Contributing to the Selenium Documentation
+disableToc: true
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium is a big software project and documentation is key to
+understanding how things work and learning effective ways to exploit
+its potential.
+
+Part of the documentation of Selenium is still served from our
+[**www.seleniumhq.org** repository](https://github.com/SeleniumHQ/www.seleniumhq.org).
+We are however phasing out this documentation which focuses too much
+on Selenium RC and other antiquated pieces, in favour of this rewrite.
+
+The new documentation is a project started to rewrite Selenium's
+documentation from scratch. This is an ongoing effort (not targetted
+at any specific release) to provide an updated handbook on how to use
+Selenium effectively. We hope to bring over the pieces of the old
+documentation that makes sense.
+
+Contributions toward the new docs follow the process described in
+the below section about contributions. You should spend some time
+familiarising yourself with the documentation by reading
+[more about it]({{< ref "/introduction/about_this_documentation.nl.md" >}}).
+
+---
+
+The Selenium project welcomes contributions from everyone. There are a
+number of ways you can help:
+
+## Report an issue
+
+When reporting a new issues or commenting on existing issues please
+make sure discussions are related to concrete technical issues with the
+Selenium software and/or its documentation.
+
+All of the Selenium components change quite fast over time, so this
+might cause the documentation to be out of date. If you find this to
+be the case, as mentioned, don't doubt to create an issue for that.
+It also might be possible that you know how to bring up to date the
+documentation, so please send us a pull request with the related
+changes.
+
+If you are not sure about what you have found is an issue or not,
+please ask first about it to the
+[selenium-users@ mailing list](https://groups.google.com/forum/#!forum/selenium-users),
+or join us in the `#selenium` channel
+on [irc.freenode.org](https://webchat.freenode.net/) or [Slack](https://seleniumhq.herokuapp.com/).
+
+## Contributions
+
+The Selenium project welcomes new contributors. Individuals making
+significant and valuable contributions over time are made _Committers_
+and given commit-access to the project.
+
+This document will guide you through the contribution process.
+
+### Step 1: Fork
+
+Fork the project [on Github](https://github.com/seleniumhq/docs)
+and check out your copy locally.
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+#### Dependencies: Hugo
+
+The docs use [Hugo](https://gohugo.io/) to build and render the site.
+To verify everything locally before even commiting any changes, please
+[install Hugo](https://gohugo.io/getting-started/installing/) and
+[run the local server](https://gohugo.io/getting-started/usage/#livereload)
+to render the site locally.
+
+### Step 2: Branch
+
+Create a feature branch and start hacking:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+We practice HEAD-based development, which means all changes are applied
+directly on top of master.
+
+### Step 3: Commit
+
+First make sure git knows your name and email address:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**Writing good commit messages is important.** A commit message
+should describe what changed, why, and reference issues fixed (if
+any). Follow these guidelines when writing one:
+
+1. The first line should be around 50 characters or less and contain a
+ short description of the change.
+2. Keep the second line blank.
+3. Wrap all other lines at 72 columns.
+4. Include `Fixes #N`, where _N_ is the issue number the commit
+ fixes, if any.
+
+A good commit message can look like this:
+
+```text
+explain commit normatively in one line
+
+Body of commit message is a few lines of text, explaining things
+in more detail, possibly giving some background about the issue
+being fixed, etc.
+
+The body of the commit message can be several paragraphs, and
+please do proper word-wrap and keep columns shorter than about
+72 characters or so. That way `git log` will show things
+nicely even when it is indented.
+
+Fixes #141
+```
+
+The first line must be meaningful as it's what people see when they
+run `git shortlog` or `git log --oneline`.
+
+### Step 4: Rebase
+
+Use `git rebase` (not `git merge`) to sync your work from time to time.
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### Step 5: Test
+
+Always remember to [run the local server](https://gohugo.io/getting-started/usage/#livereload),
+with this you can be safe that your changes have not broken anything.
+
+### Step 6: Translations
+
+If you are updating the docs, adding new ones, or deleting deprecated ones, please remember
+to update the translations of it. Of course, it is possible that you do not speak all the
+translated languages in the docs. For that, please create an
+[issue](https://github.com/SeleniumHQ/docs/issues) where you clearly describe that something
+in the docs has changed and its translation needs to be updated. With that, someone who speaks
+that needed language can chime in and help us to keep it up to date.
+
+### Step 7: Sign the CLA
+
+Before we can accept, we first ask people to sign a
+[Contributor License Agreement](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0)
+(or CLA). We ask this so that we know that contributors have the right
+to donate the code.
+
+When you open your pull request we ask that you indicate that you've
+signed the CLA. This will reduce the time it takes for us to integrate
+it.
+
+### Step 8: Push
+
+```shell
+% git push origin my-feature-branch
+```
+
+Go to https://github.com/yourusername/docs.git and press the _Pull
+Request_ and fill out the form. **Please indicate that you've signed
+the CLA** (see Step 7).
+
+Pull requests are usually reviewed within a few days. If there are
+comments to address, apply your changes in new commits (preferably
+[fixups](http://git-scm.com/docs/git-commit)) and push to the same
+branch.
+
+### Step 9: Integration
+
+When code review is complete, a committer will take your PR and
+integrate it on the docs's gh-pages branch. Because we like to keep a
+linear history on the master branch, we will normally squash and rebase
+your branch history.
+
+## Communication
+
+Selenium contributors frequent the `#selenium` channel on
+[`irc.freenode.org`](https://webchat.freenode.net/) or on
+or [Slack](https://seleniumhq.herokuapp.com/). You can also join
+the [`selenium-developers@` mailing list](https://groups.google.com/forum/#!forum/selenium-developers).
+
diff --git a/docs_source_files/content/CONTRIBUTING.zh-cn.md b/docs_source_files/content/CONTRIBUTING.zh-cn.md
new file mode 100644
index 00000000000..b66a3eee6f8
--- /dev/null
+++ b/docs_source_files/content/CONTRIBUTING.zh-cn.md
@@ -0,0 +1,146 @@
+---
+title: 为 Selenium 文档做贡献
+disableToc: true
+---
+
+Selenium 是一个大型软件项目,文档是了解事物如何运作和学习有效利用其潜力的关键。
+
+Selenium 的部分文档仍然在我们的 [**www.seleniumhq.org** 存储库](https://github.com/SeleniumHQ/www.seleniumhq.org) 中提供。
+然而,我们正在逐步淘汰这个过分关注 Selenium RC 和其他陈旧作品的文档,以重写。
+
+新的文档是一个从头开始重写 Selenium 项目的文档。这是一项正在进行的工作(不针对任何特定的发行版),目的是提供一个关于如何有效使用 Selenium 的更新手册。我们希望带回来一些有意义的旧文档。
+
+对新文档的贡献遵循以下关于贡献的部分中描述的过程。
+您应该花一些时间通过阅读 [更多相关信息]({{< ref "/introduction/about_this_documentation.zh-cn.md" >}}) 来熟悉文档。
+
+---
+
+Selenium 项目欢迎来自每个人的贡献。有很多方法可以帮助您:
+
+## 报告问题
+
+在报告新问题或评论现有问题时,请确保讨论涉及使用 Selenium 软件或其文档的具体技术问题。
+
+所有 Selenium 组件随着时间的推移变化非常快,因此这可能导致文档过时。
+如果您发现情况确实如此,就像上面提到的那样,不要怀疑要为此创建一个问题。
+您也可能知道如何更新文档,因此请向我们发送带有相关更改的请求。
+
+如果您不确定您发现的是否有问题,
+请先向 [selenium-users@ mailing list](https://groups.google.com/forum/#!forum/selenium-users) 咨询,
+或者加入我们在 [irc.freenode.org](https://webchat.freenode.net/) 或 [Slack](https://seleniumhq.herokuapp.com/) 的 `#selenium` 频道。
+
+## 贡献
+
+Selenium 项目欢迎新的贡献者。
+随着时间的推移,作出重要和有价值贡献的个人成为提交者,并获得对项目的提交访问权。
+
+本文将指导您完成贡献流程。
+
+### Step 1: Fork
+
+在 [Github](https://github.com/seleniumhq/docs) 上 Fork 项目,并在本地检查您的副本。
+
+```shell
+% git clone git@github.com:username/docs.git
+% cd docs
+% git remote add upstream git://github.com/seleniumhq/docs.git
+```
+
+#### 依赖关系:Hugo
+
+文档使用 [Hugo](https://gohugo.io/) 来建立和渲染网站。
+要在执行任何更改之前在本地验证所有内容,请 [安装 Hugo](https://gohugo.io/getting-started/installing/) 并 [运行本地服务器](https://gohugo.io/getting-started/usage/#livereload) 以在本地呈现站点。
+
+### Step 2: Branch
+
+创建一个分支并开始工作:
+
+```shell
+% git checkout -b my-feature-branch
+```
+
+我们实行基于 HEAD-based 的开发,这意味着所有的变更都直接应用于 master 之上。
+
+### Step 3: Commit
+
+首先确保 git 知道您的名字和电子邮件地址:
+
+First make sure git knows your name and email address:
+
+```shell
+% git config --global user.name 'Santa Claus'
+% git config --global user.email 'santa@example.com'
+```
+
+**编写好的提交消息很重要。** 提交的信息应该描述改变什么,为什么要改变,和引用问题(如果有的话)。
+写作时遵循以下准则:
+
+1. 第一行应该大约 50 个字符或更少,并包含对更改的简短描述。
+2. 保持第二行为空白。
+3. 72 个字符后应该换行。
+4. 包括 `Fixes #N`, 其中 N 是提交修复的问题编号,如果有的话。
+
+一个好的提交消息可能如下所示:
+
+```text
+用一行解释规范地提交
+
+提交消息的主体是几行文本,更详细地解释事情,可能提供有关修复问题的一些背景,等等。
+
+提交消息的主体可以是几个段落,请进行适当的换行,并将列的长度控制在 72 个字符左右。
+这样,“git log” 即使缩进也能很好地显示内容。
+
+Fixes #141
+```
+
+第一行必须是有意义的,因为这是人们在运行 `git shortlog` 或 `git log --oneline` 时看到的内容。
+
+### Step 4: Rebase
+
+使用 `git rebase` (不是 `git merge`) 时不时地同步您的工作。
+
+```shell
+% git fetch upstream
+% git rebase upstream/master
+```
+
+### Step 5: Test
+
+始终记住[运行本地服务器](https://gohugo.io/getting-started/usage/#livereload),有了它,您就可以安全地确保您的更改没有破坏任何东西。
+
+### Step 6: Translations
+
+如果您正在更新文档、添加新文档或删除不推荐的文档,请记住更新文档的翻译。
+当然,您可能不会在文档中更新所有的翻译语言。
+为此,请创建一个[issue](https://github.com/SeleniumHQ/docs/issues),清楚地描述文档中的某些内容发生了变化,需要更新其翻译。
+有了这些信息,那些熟悉所需语言的人就可以帮助我们保持语言的更新。
+
+### Step 7: Sign the CLA
+
+在我们可以接受之前,我们首先要求人们签署[贡献者许可协议 CLA](https://spreadsheets.google.com/spreadsheet/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0)。
+我们这样问,是为了让我们知道贡献者有权提交代码。
+
+当您打开您的拉请求时,我们要求您表明您已经签署了 CLA。 这将减少我们整合它所需的时间。
+
+### Step 8: Push
+
+```shell
+% git push origin my-feature-branch
+```
+
+去 并按下 _Pull
+Request_ 并填写表单。
+**请注明您已签署了 CLA** (见 Step 7)。
+
+Pull requests 通常会在几天内被审查。
+如果有需要处理的注释,在新的提交中应用您的更改(最好是 [fixups](http://git-scm.com/docs/git-commit)) 并推送到同一个分支。
+
+### Step 9: Integration
+
+当代码审查完成后,提交者会将您的 PR 整合到文档的 gh-pages 分支上。
+因为我们喜欢在主分支上保持一个线性历史,所以我们通常会压缩并重建分支历史。
+
+## Communication
+
+Selenium 贡献者经常在 [`irc.freenode.org`](https://webchat.freenode.net/) 或 [Slack](https://seleniumhq.herokuapp.com/) 上的 `#selenium` 频道。
+您还可以加入 [`selenium-developers@` mailing list](https://groups.google.com/forum/#!forum/selenium-developers)。
diff --git a/docs_source_files/content/_index.en.md b/docs_source_files/content/_index.en.md
new file mode 100644
index 00000000000..3dda355847f
--- /dev/null
+++ b/docs_source_files/content/_index.en.md
@@ -0,0 +1,153 @@
+---
+title: "The Selenium Browser Automation Project"
+---
+
+# The Selenium Browser Automation Project
+
+Selenium is an umbrella project for a range of tools and libraries
+that enable and support the automation of web browsers.
+
+It provides extensions to emulate user interaction with browsers,
+a distribution server for scaling browser allocation,
+and the infrastructure for implementations of the
+[W3C WebDriver specification](//www.w3.org/TR/webdriver/)
+that lets you write interchangeable code for all major web browsers.
+
+This project is made possible by volunteer contributors
+who have put in thousands of hours of their own time,
+and made the source code [freely available](attr.md#license)
+for anyone to use, enjoy, and improve.
+
+Selenium brings together browser vendors, engineers, and enthusiasts
+to further an open discussion around automation of the web platform.
+The project organises [an annual conference](//seleniumconf.com/)
+to teach and nurture the community.
+
+At the core of Selenium is _[WebDriver]({{< ref "/webdriver/_index.md" >}})_,
+an interface to write instruction sets that can be run interchangeably in many
+browsers. Here is one of the simplest instructions you can make:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
+ System.out.println(firstResult.getAttribute("textContent"));
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#This example requires Selenium WebDriver 3.13 or newer
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
+ print(first_result.get_attribute("textContent"))
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
+ Console.WriteLine(firstResult.GetAttribute("textContent"));
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>div') }
+ puts first_result.attribute('textContent')
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ // Navigate to Url
+ await driver.get('https://www.google.com');
+
+ // Enter text "cheese" and perform keyboard action "Enter"
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
+
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>div')), 10000);
+
+ console.log(await firstResult.getAttribute('textContent'));
+ }
+ finally{
+ driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+See the _[Quick Tour]({{< ref "/getting_started/quick.en.md" >}})_ for a full explanation
+of what goes on behind the scenes when you run this code.
+You should continue on to the [narrative documentation]({{< ref "/introduction/_index.md" >}})
+to understand how you can [install]({{< ref "/selenium_installation/_index.md" >}}) and
+successfully use Selenium as a test automation tool,
+and scaling simple tests like this to run
+in large, distributed environments on multiple browsers,
+on several different operating systems.
+
+## Getting started
+
+If you are new to Selenium,
+we have a few resources that can help you
+get up to speed right away.
+
+* [Quick tour]({{< ref "/getting_started/quick.en.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.en.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.en.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.en.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.en.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.en.md#html-runner" >}})
+
diff --git a/docs_source_files/content/_index.es.md b/docs_source_files/content/_index.es.md
new file mode 100644
index 00000000000..0390798e9ae
--- /dev/null
+++ b/docs_source_files/content/_index.es.md
@@ -0,0 +1,135 @@
+---
+title: "El Proyecto para Automatización de Navegadores Selenium"
+---
+
+# El Proyecto para Automatización de Navegadores Selenium
+
+Selenium es un proyecto padre que cobija a una gama de herramientas y bibliotecas que permiten y soportan la automatización de los navegadores web.
+
+Proporciona extensiones para emular la interacción del usuario con los navegadores, un servidor de distribución para escalar la asignación del navegador y la infraestructura para implementaciones de la
+[Especificación W3C del WebDriver](//www.w3.org/TR/webdriver/) que le permite escribir código intercambiable para todos los principales navegadores web.
+
+Este proyecto es posible gracias a los colaboradores voluntarios que han dedicado miles de horas de su propio tiempo y han hecho que el código fuente [esté disponible gratuitamente](licencia attr.md #) para que cualquiera pueda usarlo, disfrutarlo y mejorarlo.
+
+Selenium reúne a proveedores de navegadores, ingenieros y entusiastas para promover una discusión abierta sobre la automatización de la plataforma web.
+El proyecto organiza [una conferencia anual](//seleniumconf.com/) para enseñar y nutrir a la comunidad.
+
+En el núcleo de Selenium se encuentra el _[WebDriver]({{< ref "/webdriver/_index.md" >}})_, una interfaz para escribir conjuntos de instrucciones que se pueden ejecutar indistintamente en muchos navegadores. Aquí está una de las instrucciones más simples que puede hacer:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
+ System.out.println(firstResult.getAttribute("textContent"));
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#Este ejemplo requiere Selenium WebDriver 3.13 o posterior
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
+ print(first_result.get_attribute("textContent"))
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
+ Console.WriteLine(firstResult.GetAttribute("textContent"));
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>div') }
+ puts first_result.attribute('textContent')
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ // Navigate to Url
+ await driver.get('https://www.google.com');
+
+ // Enter text "cheese" and perform keyboard action "Enter"
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
+
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>div')), 10000);
+
+ console.log(await firstResult.getAttribute('textContent'));
+ }
+ finally{
+ driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+Consulte la _[Guía rápida]({{< ref "/getting_started/quick.es.md" >}})_ para obtener una explicación completa de lo que sucede detrás de escena cuando ejecuta este código.
+Debe continuar con la [documentación narrativa]({{< ref "/introduction/_index.md" >}}) para comprender cómo puede [instalar]({{< ref "/selenium_installation/_index.md" >}}) y utilizar con éxito Selenium como herramienta de automatización de pruebas, y escalar pruebas simples como esta para ejecutar en entornos grandes y distribuidos en múltiples navegadores, en varios sistemas operativos diferentes.
+
+
+## Empezando
+
+Si es nuevo en Selenium, tenemos algunos recursos que pueden ayudarlo a ponerse al día de inmediato.
+
+* [Guía rápida]({{< ref "/getting_started/quick.es.md" >}})
+ * [El WebDriver]({{< ref "/getting_started/quick.es.md#webdriver" >}})
+ * [Control remoto]({{< ref "/getting_started/quick.es.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.es.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.es.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.es.md#html-runner" >}})
+
diff --git a/docs_source_files/content/_index.fr.md b/docs_source_files/content/_index.fr.md
new file mode 100644
index 00000000000..3055783b793
--- /dev/null
+++ b/docs_source_files/content/_index.fr.md
@@ -0,0 +1,150 @@
+---
+title: "Le Projet d'Automatisation de Navigateur Selenium"
+---
+
+# Le Projet d'Automatisation de Navigateur Selenium
+
+Selenium est projet englobant un éventail d'outils et de librairies
+permettant l'automtisation des navigateurs internet.
+
+Il fournit des extensions afin d'émuler des interactions utilisateur avec les navigateurs,
+un serveur de distribution permettant la mise à l'échelle de l'allocation de navigateur
+ainsi que l'infrastructure pour l'implémentation de la [spécification W3C WebDriver](//www.w3.org/TR/webdriver/)
+permettant l'écriture de code interchangeable pour tous les principaux navigateurs.
+
+Ce projet est rendu possible grâce au contributeurs volontaires
+ayant investi des milliers d'heures de leur temps
+et rendu le code source [disponible librement](attr.md#license)
+à quiconque souhaitant l'utiliser et l'améliorer ou simplement s'amuser.
+
+Selenium rassemble distributeurs de navigateur, ingénieurs et entousiastes
+pour favoriser une discussion ouverte autour de l'automatisation de la platerforme web.
+Le projet organise [une conférence annuelle](//seleniumconf.com/) afin d'entretenir cette communauté.
+
+Au coeur de Selenium se trouve _[WebDriver]({{< ref "/webdriver/_index.md" >}})_,
+une interface permettant d'écrire des instructions pouvant être exécutées indifférement par de nombreux navigateurs.
+Voici par exemple une des plus simples instructions disponibles:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
+ System.out.println(firstResult.getAttribute("textContent"));
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#Cet exemple requiert Selenium WebDriver 3.13 ou plus récent
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
+ print(first_result.get_attribute("textContent"))
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
+ Console.WriteLine(firstResult.GetAttribute("textContent"));
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>div') }
+ puts first_result.attribute('textContent')
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ // Navigate to Url
+ await driver.get('https://www.google.com');
+
+ // Enter text "cheese" and perform keyboard action "Enter"
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
+
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>div')), 10000);
+
+ console.log(await firstResult.getAttribute('textContent'));
+ }
+ finally{
+ driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+Suivez le _[Quick Tour]({{< ref "/getting_started/quick.fr.md" >}})_
+pour une explication complète de ce qu'il se passe derrière ces exemples de code.
+Il est conseillé de poursuivre cette [documentation narrative]({{< ref "/introduction/_index.md" >}})
+afin de voir comment [installer]({{< ref "/selenium_installation/_index.md" >}})
+et utiliser Selenium en tant qu'outil d'automatisation de test,
+ainsi que pour mettre à l'echelle l'exécution de tels tests sur de larges environnements distribués,
+avec de multiples navigateurs et des systèmes d'exploitation différents.
+
+## Getting started
+
+Si Selenium est nouveau pour vous,
+nous vous proposons quelques ressources qui
+pourront vous aider à vous mettre à niveau très rapidement.
+
+* [Tour rapide]({{< ref "/getting_started/quick.fr.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.fr.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.fr.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.fr.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.fr.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.fr.md#html-runner" >}})
+
diff --git a/docs_source_files/content/_index.ja.md b/docs_source_files/content/_index.ja.md
new file mode 100644
index 00000000000..97bd19e16d7
--- /dev/null
+++ b/docs_source_files/content/_index.ja.md
@@ -0,0 +1,127 @@
+---
+title: "Seleniumブラウザー自動化プロジェクト"
+---
+
+# Seleniumブラウザー自動化プロジェクト
+
+Seleniumはブラウザー自動化を可能にし、それを支えるツール群とライブラリー群プロジェクトです。
+
+ユーザーとブラウザーのやり取りのエミュレーション、ブラウザーの割当を増強したり縮減する分散型サーバー、そしてすべてのメジャーなブラウザー用に置換可能なコードの実装を可能にする[W3C WebDriver 仕様](//www.w3.org/TR/webdriver/)インフラの提供します。
+
+このプロジェクトは多くの有志貢献者の何千時間に及ぶ個々の時間を費やした事とソースコード[自由に利用可能](attr.md#license)を誰にでも利用、楽しめ、そして改良できることによって実現しました。
+
+Seleniumはウェブプラットフォームの自動化のより開かれた議論をするためブラウザーベンダー、エンジニア、愛好家をまとめます。このプロジェクトはコミュニティーを導きと育成のために[年次カンファレンス](//seleniumconf.com/)開催します。
+
+Seleniumの中核は[_WebDriver_]({{< ref "/webdriver/_index.md" >}})であり、様々なブラウザーを変えてインストラクション集を実行できるインターフェースです。これは作りえる一番基本的な
+インストラクションの一つです:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>a")));
+ System.out.println(firstResult.getText());
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#この例にはSelenium WebDriver 3.13 または新しいのが必要です
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>a")))
+ print(first_result.text)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>a")));
+ Console.WriteLine(firstResult.Text);
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>a') }
+ puts first_result.text
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ await driver.get('https://www.google.com/ncr');
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.RETURN);
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>a')),10000);
+ console.log(await firstResult.getText());
+ } finally {
+ await driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+上記のコードを実行した時、舞台裏で何が起きているかの詳しい説明には[_クイックツアー_]({{< ref "/getting_started/quick.ja.md" >}})を参照してください。
+どのように[インストール]({{< ref "/selenium_installation/_index.md" >}})するのか、そしてSeleniumをテスト自動化ツールとして上手く利用し、上記の様な基本的なテストを大きいスケールの分散型環境で複数のブラウザー、様々オペレーティングシステムで実行するため拡張方法を理解するため[順序順ドキュメンテーション]({{< ref "/introduction/_index.md" >}})に進んでください。
+
+## 入門
+
+もしSeleniumが初めてでしたら、素早く知識を得るためのリソースを用意しました。
+
+* [クイックツアー]({{< ref "/getting_started/quick.ja.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.ja.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.ja.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.ja.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.ja.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.ja.md#html-runner" >}})
diff --git a/docs_source_files/content/_index.nl.md b/docs_source_files/content/_index.nl.md
new file mode 100644
index 00000000000..099d5139cca
--- /dev/null
+++ b/docs_source_files/content/_index.nl.md
@@ -0,0 +1,159 @@
+---
+title: "The Selenium Browser Automation Project"
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# The Selenium Browser Automation Project
+
+Selenium is an umbrella project for a range of tools and libraries
+that enable and support the automation of web browsers.
+
+It provides extensions to emulate user interaction with browsers,
+a distribution server for scaling browser allocation,
+and the infrastructure for implementations of the
+[W3C WebDriver specification](//www.w3.org/TR/webdriver/)
+that lets you write interchangeable code for all major web browsers.
+
+This project is made possible by volunteer contributors
+who have put in thousands of hours of their own time,
+and made the source code [freely available](attr.md#license)
+for anyone to use, enjoy, and improve.
+
+Selenium brings together browser vendors, engineers, and enthusiasts
+to further an open discussion around automation of the web platform.
+The project organises [an annual conference](//seleniumconf.com/)
+to teach and nurture the community.
+
+At the core of Selenium is _[WebDriver]({{< ref "/webdriver/_index.nl.md" >}})_,
+an interface to write instruction sets that can be run interchangeably in many
+browsers. Here is one of the simplest instructions you can make:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
+ System.out.println(firstResult.getAttribute("textContent"));
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#This example requires Selenium WebDriver 3.13 or newer
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
+ print(first_result.get_attribute("textContent"))
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
+ Console.WriteLine(firstResult.GetAttribute("textContent"));
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>div') }
+ puts first_result.attribute('textContent')
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ // Navigate to Url
+ await driver.get('https://www.google.com');
+
+ // Enter text "cheese" and perform keyboard action "Enter"
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
+
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>div')), 10000);
+
+ console.log(await firstResult.getAttribute('textContent'));
+ }
+ finally{
+ driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+See the _[Quick Tour]({{< ref "/getting_started/quick.nl.md" >}})_ for a full explanation
+of what goes on behind the scenes when you run this code.
+You should continue on to the [narrative documentation]({{< ref "/introduction/_index.md" >}})
+to understand how you can [install]({{< ref "/selenium_installation/_index.md" >}}) and
+successfully use Selenium as a test automation tool,
+and scaling simple tests like this to run
+in large, distributed environments on multiple browsers,
+on several different operating systems.
+
+## Getting started
+
+If you are new to Selenium,
+we have a few resources that can help you
+get up to speed right away.
+
+* [Quick tour]({{< ref "/getting_started/quick.nl.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.nl.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.nl.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.nl.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.nl.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.nl.md#html-runner" >}})
+
diff --git a/docs_source_files/content/_index.zh-cn.md b/docs_source_files/content/_index.zh-cn.md
new file mode 100644
index 00000000000..ffba83d3a3e
--- /dev/null
+++ b/docs_source_files/content/_index.zh-cn.md
@@ -0,0 +1,132 @@
+---
+title: "Selenium 浏览器自动化项目"
+---
+
+# Selenium 浏览器自动化项目
+
+Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。
+
+它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分配的分发服务器,以及用于实现 [W3C WebDriver 规范](//www.w3.org/TR/webdriver/) 的基础结构,该 规范 允许您为所有主要 Web 浏览器编写可互换的代码。
+
+这个项目是由志愿者贡献者实现的,他们投入了自己数千小时的时间,并使源代码[免费提供](attr.md#license)给任何人使用、享受和改进。
+
+Selenium 汇集了浏览器供应商,工程师和爱好者,以进一步围绕 Web 平台自动化进行公开讨论。
+该项目组织了[一次年度会议](//seleniumconf.com/),以教学和培养社区。
+
+Selenium 的核心是 [_WebDriver_]({{< ref "/webdriver/_index.md" >}}),这是一个编写指令集的接口,可以在许多浏览器中互换运行。
+这里有一个最简单的说明:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
+
+public class HelloSelenium {
+
+ public static void main(String[] args) {
+ WebDriver driver = new FirefoxDriver();
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ try {
+ driver.get("https://google.com/ncr");
+ driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
+ WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
+ System.out.println(firstResult.getAttribute("textContent"));
+ } finally {
+ driver.quit();
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support.expected_conditions import presence_of_element_located
+
+#This example requires Selenium WebDriver 3.13 or newer
+with webdriver.Firefox() as driver:
+ wait = WebDriverWait(driver, 10)
+ driver.get("https://google.com/ncr")
+ driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
+ first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
+ print(first_result.get_attribute("textContent"))
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+using System;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Firefox;
+using OpenQA.Selenium.Support.UI;
+using SeleniumExtras.WaitHelpers;
+
+class HelloSelenium
+{
+ static void Main()
+ {
+ using (IWebDriver driver = new FirefoxDriver())
+ {
+ WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
+ driver.Navigate().GoToUrl("https://www.google.com/ncr");
+ driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
+ IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
+ Console.WriteLine(firstResult.GetAttribute("textContent"));
+ }
+ }
+}
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :firefox
+wait = Selenium::WebDriver::Wait.new(timeout: 10)
+
+begin
+ driver.get 'https://google.com/ncr'
+ driver.find_element(name: 'q').send_keys 'cheese', :return
+ first_result = wait.until { driver.find_element(css: 'h3>div') }
+ puts first_result.attribute('textContent')
+ensure
+ driver.quit
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const {Builder, By, Key, until} = require('selenium-webdriver');
+
+(async function example() {
+ let driver = await new Builder().forBrowser('firefox').build();
+ try {
+ // Navigate to Url
+ await driver.get('https://www.google.com');
+
+ // Enter text "cheese" and perform keyboard action "Enter"
+ await driver.findElement(By.name('q')).sendKeys('cheese', Key.ENTER);
+
+ let firstResult = await driver.wait(until.elementLocated(By.css('h3>div')), 10000);
+
+ console.log(await firstResult.getAttribute('textContent'));
+ }
+ finally{
+ driver.quit();
+ }
+})();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+请参阅 _[快速浏览]({{< ref "/getting_started/quick.zh-cn.md" >}})_ 以获得运行此代码时幕后发生的事情的完整解释。
+您应该继续阅读[介绍]({{< ref "/introduction/_index.md" >}}),了解如何[安装]({{< ref "/selenium_installation/_index.md" >}})并成功地使用 Selenium 作为测试自动化工具,并将这样的简单测试扩展到多个浏览器上的大型分布式环境中,在多个不同的操作系统上运行。
+
+## 入门指南
+
+如果您刚刚接触 Selenium,我们有一些资源可以帮助您快速上手。
+
+* [快速浏览]({{< ref "/getting_started/quick.zh-cn.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.zh-cn.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.zh-cn.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.zh-cn.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.zh-cn.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.zh-cn.md#html-runner" >}})
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.en.md b/docs_source_files/content/driver_idiosyncrasies/_index.en.md
new file mode 100644
index 00000000000..76bc1d9e68f
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.en.md
@@ -0,0 +1,7 @@
+---
+title: "Driver idiosyncrasies"
+chapter: true
+weight: 10
+---
+
+# Driver idiosyncrasies
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.es.md b/docs_source_files/content/driver_idiosyncrasies/_index.es.md
new file mode 100644
index 00000000000..858fb32b641
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.es.md
@@ -0,0 +1,14 @@
+---
+title: "Carácter de los controladores"
+chapter: true
+weight: 10
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+
+# Carácter de los controladores
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.fr.md b/docs_source_files/content/driver_idiosyncrasies/_index.fr.md
new file mode 100644
index 00000000000..0cfb07f34d6
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.fr.md
@@ -0,0 +1,13 @@
+---
+title: "Singularités du Driver"
+chapter: true
+weight: 10
+---
+
+# Singularités du Driver
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.ja.md b/docs_source_files/content/driver_idiosyncrasies/_index.ja.md
new file mode 100644
index 00000000000..80e123398b3
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.ja.md
@@ -0,0 +1,12 @@
+---
+title: "Driver idiosyncrasies"
+chapter: true
+weight: 10
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Driver idiosyncrasies
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.nl.md b/docs_source_files/content/driver_idiosyncrasies/_index.nl.md
new file mode 100644
index 00000000000..fff90231f7e
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.nl.md
@@ -0,0 +1,7 @@
+---
+title: "Driver eigenschappen"
+chapter: true
+weight: 10
+---
+
+# Driver eigenschappen
diff --git a/docs_source_files/content/driver_idiosyncrasies/_index.zh-cn.md b/docs_source_files/content/driver_idiosyncrasies/_index.zh-cn.md
new file mode 100644
index 00000000000..3c85d5155d7
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/_index.zh-cn.md
@@ -0,0 +1,7 @@
+---
+title: "驱动特性"
+chapter: true
+weight: 10
+---
+
+# 驱动特性
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.en.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.en.md
new file mode 100644
index 00000000000..aa6301df8a9
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.en.md
@@ -0,0 +1,74 @@
+---
+title: "Driver specific capabilities"
+weight: 2
+---
+
+## Firefox
+
+### Define Capabilities using `FirefoxOptions`
+
+`FirefoxOptions` is the new way to define capabilities for the Firefox
+browser and should generally be used in preference to DesiredCapabilities.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Setting a custom profile
+
+It is possible to create a custom profile for Firefox as demonstrated below.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+In some environments, Internet Explorer may timeout when opening the
+File Upload dialog. IEDriver has a default timeout of 1000ms, but you
+can increase the timeout using the fileUploadDialogTimeout capability.
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.es.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.es.md
new file mode 100644
index 00000000000..0bc0f3c1068
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.es.md
@@ -0,0 +1,73 @@
+---
+title: "Capacidades especificas de los controladores"
+weight: 2
+---
+
+
+## Firefox
+
+### Definir Capacidades (_Capabilities_) usando `FirefoxOptions`
+
+`FirefoxOptions` es la nueva forma de definir capacidades para el navegador Firefox y, por lo general, debe usarse con preferencia a las capacidades deseadas.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// Todavía no tenemos una muestra de código C#: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Todavía no tenemos una muestra de código Ruby: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// Todavía no tenemos una muestra de código JavaScript: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Configuración de un perfil personalizado
+
+Es posible crear un perfil personalizado para Firefox como se muestra a continuación.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// Todavía no tenemos una muestra de código C#: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Todavía no tenemos una muestra de código Ruby: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// Todavía no tenemos una muestra de código JavaScript: ayúdenos y genere un PR (_pull request_)
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+En algunos entornos, Internet Explorer puede agotar el tiempo de espera al abrir el cuadro de diálogo Cargar archivo. IEDriver tiene un tiempo de espera predeterminado de 1000 ms, pero puede aumentar el tiempo de espera usando la _capability_ fileUploadDialogTimeout.
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.fr.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.fr.md
new file mode 100644
index 00000000000..2a7b97ab399
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.fr.md
@@ -0,0 +1,80 @@
+---
+title: "Capabilities spécifiques du Driver"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Firefox
+
+### Define Capabilities using `FirefoxOptions`
+
+`FirefoxOptions` is the new way to define capabilities for the Firefox
+browser and should generally be used in preference to DesiredCapabilities.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Setting a custom profile
+
+It is possible to create a custom profile for Firefox as demonstrated below.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+In some environments, Internet Explorer may timeout when opening the
+File Upload dialog. IEDriver has a default timeout of 1000ms, but you
+can increase the timeout using the fileUploadDialogTimeout capability.
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.ja.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.ja.md
new file mode 100644
index 00000000000..ead08297f68
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.ja.md
@@ -0,0 +1,78 @@
+---
+title: "Driver specific capabilities"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+## Firefox
+
+### Define Capabilities using `FirefoxOptions`
+
+`FirefoxOptions` is the new way to define capabilities for the Firefox
+browser and should generally be used in preference to DesiredCapabilities.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Setting a custom profile
+
+It is possible to create a custom profile for Firefox as demonstrated below.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+In some environments, Internet Explorer may timeout when opening the
+File Upload dialog. IEDriver has a default timeout of 1000ms, but you
+can increase the timeout using the fileUploadDialogTimeout capability.
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.nl.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.nl.md
new file mode 100644
index 00000000000..b8827e11cf1
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.nl.md
@@ -0,0 +1,72 @@
+---
+title: "Driver specifieke capabilities"
+weight: 2
+---
+
+## Firefox
+
+### Definieer Capabilities met `FirefoxOptions`
+
+`FirefoxOptions` is de nieuwe manier om capabilities te bepalen voor Firefox. Het is aangeraden om FirefoxOptions te gebruiken in plaats van `DesiredCapabilities`.
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Setting a custom profile
+
+Het is mogelijk om een eigen Firefox profiel te gebruiken zoals hieronder word getoond.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+Het kan gebeuren dat Internet Explorer een timeout gooit wanneer het File Upload venster geopend word. IEDriver heeft standaard een timeout van 1000ms. Deze kan, in het geval van het File Upload venster, verhoogd worden via de `fileUploadDialogTimeout`-capability.
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.zh-cn.md b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.zh-cn.md
new file mode 100644
index 00000000000..dd1ec1ebda3
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/driver_specific_capabilities.zh-cn.md
@@ -0,0 +1,79 @@
+---
+title: "Driver specific capabilities"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+## Firefox
+
+### Define Capabilities using `FirefoxOptions`
+
+`FirefoxOptions` is the new way to define capabilities for the Firefox
+browser and should generally be used in preference to DesiredCapabilities.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions options = new FirefoxOptions();
+options.addPreference("network.proxy.type", 0);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+options = Options()
+options.headless = True
+driver = webdriver.Firefox(options=options)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+### Setting a custom profile
+
+It is possible to create a custom profile for Firefox as demonstrated below.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxProfile profile = new FirefoxProfile();
+FirefoxOptions options = new FirefoxOptions();
+options.setProfile(profile);
+driver = new RemoteWebDriver(options);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.firefox.options import Options
+from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
+options=Options()
+firefox_profile = FirefoxProfile()
+firefox_profile.set_preference("javascript.enabled", False)
+options.profile = firefox_profile
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Internet Explorer
+
+### fileUploadDialogTimeout
+
+In some environments, Internet Explorer may timeout when opening the
+File Upload dialog. IEDriver has a default timeout of 1000ms, but you
+can increase the timeout using the fileUploadDialogTimeout capability.
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.en.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.en.md
new file mode 100644
index 00000000000..e01af9dd4c1
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.en.md
@@ -0,0 +1,23 @@
+---
+title: "Shared capabilities"
+weight: 1
+---
+
+### pageLoadStrategy
+When navigating to a new page via URL, by default Selenium will wait
+until the page has fully loaded before responding. This works well for
+beginners, but can cause long wait times on pages that load a large
+number of third party resources. Using a non default strategy can make
+test execution faster in cases like this, but can also introduce flakiness
+where elements on the page change position as elements load in and change
+size.
+
+The page load strategy queries the
+[document.readyState](//developer.mozilla.org/en-US/docs/Web/API/Document/readyState)
+as described in the table below:
+
+| Strategy | Ready State | Notes |
+| -------- | ----------- | ----- |
+| normal | complete | Used by default, waits for all resources to download |
+| eager | interactive | DOM access is ready, but other resources like images may still be loading |
+| none | Any | Does not block WebDriver at all |
\ No newline at end of file
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.es.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.es.md
new file mode 100644
index 00000000000..5a7abbe8ea9
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.es.md
@@ -0,0 +1,18 @@
+---
+title: "Capacidades compartidas"
+weight: 1
+---
+
+
+## Estrategia de carga de la página (_pageLoadStrategy_)
+
+Al navegar a una nueva página a través de URL, por defecto Selenium esperará hasta que la página se haya cargado completamente antes de responder. Esto funciona bien para principiantes, pero puede causar largos tiempos de espera en páginas que cargan una gran cantidad de recursos de terceros. El uso de una estrategia no predeterminada puede hacer que la ejecución de la prueba sea más rápida en casos como este, pero también puede introducir inestabilidad donde los elementos en la página cambian de posición a medida que los elementos se cargan y cambian de tamaño.
+
+La estrategia de carga de la página consulta el [document.readyState](// developer.mozilla.org/en-US/docs/Web/API/Document/readyState) como se describe en la tabla a continuación:
+
+| Estrategia | Ready State | Notas |
+| -------- | ----------- | ----- |
+| normal | complete | Usado por defecto, espera a que se descarguen todos los recursos |
+| eager | interactive | El acceso DOM está listo, pero otros recursos como las imágenes aún pueden estar cargando |
+| none | Any | No bloquea WebDriver en absoluto |
+
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.fr.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.fr.md
new file mode 100644
index 00000000000..72a4c2a709f
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.fr.md
@@ -0,0 +1,29 @@
+---
+title: "Capabilities partagées"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+### pageLoadStrategy
+When navigating to a new page via URL, by default Selenium will wait
+until the page has fully loaded before responding. This works well for
+beginners, but can cause long wait times on pages that load a large
+number of third party resources. Using a non default strategy can make
+test execution faster in cases like this, but can also introduce flakiness
+where elements on the page change position as elements load in and change
+size.
+
+The page load strategy queries the
+[document.readyState](//developer.mozilla.org/en-US/docs/Web/API/Document/readyState)
+as described in the table below:
+
+| Strategy | Ready State | Notes |
+| -------- | ----------- | ------------------------------------------------------------------------- |
+| normal | complete | Used by default, waits for all resources to download |
+| eager | interactive | DOM access is ready, but other resources like images may still be loading |
+| none | Any | Does not block WebDriver at all |
\ No newline at end of file
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.ja.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.ja.md
new file mode 100644
index 00000000000..6bb432b6521
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.ja.md
@@ -0,0 +1,28 @@
+---
+title: "Shared capabilities"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+### pageLoadStrategy
+When navigating to a new page via URL, by default Selenium will wait
+until the page has fully loaded before responding. This works well for
+beginners, but can cause long wait times on pages that load a large
+number of third party resources. Using a non default strategy can make
+test execution faster in cases like this, but can also introduce flakiness
+where elements on the page change position as elements load in and change
+size.
+
+The page load strategy queries the
+[document.readyState](//developer.mozilla.org/en-US/docs/Web/API/Document/readyState)
+as described in the table below:
+
+| Strategy | Ready State | Notes |
+| -------- | ----------- | ----- |
+| normal | complete | Used by default, waits for all resources to download |
+| eager | interactive | DOM access is ready, but other resources like images may still be loading |
+| none | Any | Does not block WebDriver at all |
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.nl.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.nl.md
new file mode 100644
index 00000000000..9676e279fd4
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.nl.md
@@ -0,0 +1,17 @@
+---
+title: "Gedeelde capabilities"
+weight: 1
+---
+
+### pageLoadStrategy
+Bij het navigeren naar een nieuwe pagina, zal Selenium standaard wachten totdat de pagina volledig geladen is. Deze strategie werkt goed voor beginners maar kan snel resulteren in lange wachttijden op paginas die veel externe resources moeten ophalen. Het gebruik van niet-standaard laadstrategieen kan de doorlooptijd aanzienlijk versnellen maar kan eveneens flakiness introduceren doordat elementen van grootte en/of positie veranderen tijdens het laden.
+
+The page load strategy bevraagt
+[document.readyState](//developer.mozilla.org/en-US/docs/Web/API/Document/readyState)
+zoals hieronder beschreven:
+
+| Strategie | Ready State | Opmerkingen |
+| -------- | ----------- | ----- |
+| normal | complete | Standaard, wacht tot alle resources gedownload zijn |
+| eager | interactive | DOM access is gereed, maar andere resources, zoals grafische elementen, zijn mogelijks nog niet volledig ingeladen. |
+| none | Any | Webdriver houdt geen rekening met wachttijden |
diff --git a/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.zh-cn.md b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.zh-cn.md
new file mode 100644
index 00000000000..4e654234f87
--- /dev/null
+++ b/docs_source_files/content/driver_idiosyncrasies/shared_capabilities.zh-cn.md
@@ -0,0 +1,28 @@
+---
+title: "Shared capabilities"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+### pageLoadStrategy
+When navigating to a new page via URL, by default Selenium will wait
+until the page has fully loaded before responding. This works well for
+beginners, but can cause long wait times on pages that load a large
+number of third party resources. Using a non default strategy can make
+test execution faster in cases like this, but can also introduce flakiness
+where elements on the page change position as elements load in and change
+size.
+
+The page load strategy queries the
+[document.readyState](//developer.mozilla.org/en-US/docs/Web/API/Document/readyState)
+as described in the table below:
+
+| Strategy | Ready State | Notes |
+| -------- | ----------- | ----- |
+| normal | complete | Used by default, waits for all resources to download |
+| eager | interactive | DOM access is ready, but other resources like images may still be loading |
+| none | Any | Does not block WebDriver at all |
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.en.md b/docs_source_files/content/front_matter/_index.en.md
new file mode 100644
index 00000000000..4fc0707eac8
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.en.md
@@ -0,0 +1,7 @@
+---
+title: "Front matter"
+chapter: true
+weight: 12
+---
+
+# Front matter
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.es.md b/docs_source_files/content/front_matter/_index.es.md
new file mode 100644
index 00000000000..ce8e510a13e
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.es.md
@@ -0,0 +1,13 @@
+---
+title: "Texto preliminar"
+chapter: true
+weight: 12
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Texto preliminar
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.fr.md b/docs_source_files/content/front_matter/_index.fr.md
new file mode 100644
index 00000000000..4c3546f6ecd
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.fr.md
@@ -0,0 +1,13 @@
+---
+title: "Front matter"
+chapter: true
+weight: 12
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Front matter
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.ja.md b/docs_source_files/content/front_matter/_index.ja.md
new file mode 100644
index 00000000000..4fc0707eac8
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.ja.md
@@ -0,0 +1,7 @@
+---
+title: "Front matter"
+chapter: true
+weight: 12
+---
+
+# Front matter
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.nl.md b/docs_source_files/content/front_matter/_index.nl.md
new file mode 100644
index 00000000000..4ab64a72aff
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.nl.md
@@ -0,0 +1,13 @@
+---
+title: "Front matter"
+chapter: true
+weight: 12
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Front matter
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/_index.zh-cn.md b/docs_source_files/content/front_matter/_index.zh-cn.md
new file mode 100644
index 00000000000..863c5715ea0
--- /dev/null
+++ b/docs_source_files/content/front_matter/_index.zh-cn.md
@@ -0,0 +1,7 @@
+---
+title: "版权页"
+chapter: true
+weight: 12
+---
+
+# 版权页
diff --git a/content/documentation/attr.html b/docs_source_files/content/front_matter/copyright_and_attributions.en.md
old mode 100755
new mode 100644
similarity index 65%
rename from content/documentation/attr.html
rename to docs_source_files/content/front_matter/copyright_and_attributions.en.md
index 52a2c2a8b2c..61cdff53b15
--- a/content/documentation/attr.html
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.en.md
@@ -1,129 +1,75 @@
-
-Copyright and attributions
-
-
-
-
-
-
-
Every effort has been made to make this documentation
- as complete and as accurate as possible,
- but no warranty or fitness is implied.
- The information provided is on an “as-is” basis.
- The authors and the publisher shall have
- neither liability nor responsibility to any person or entity
- with respect to any loss or damages arising
- from the information contained in this book.
- No patent liability is assumed with respect
- to the use of the information contained herein.
-
-
-
All code and documentation originating from the Selenium project
- is licensed under the Apache 2.0 license,
- with the Software Freedom Conservancy
- as the copyright holder.
-
-
The license is included here for convenience,
- but you can also find it on the
- Apache Foundation's websites:
-
-
Apache License
+---
+title: "Copyright and attributions"
+weight: 1
+---
+
+## **The Documentation of Selenium**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------- | ------- | ------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
@@ -323,4 +269,5 @@
License
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
- limitations under the License.
+ limitations under the License.
+```
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/copyright_and_attributions.es.md b/docs_source_files/content/front_matter/copyright_and_attributions.es.md
new file mode 100644
index 00000000000..68dd4da42d5
--- /dev/null
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.es.md
@@ -0,0 +1,280 @@
+---
+title: "Derechos de autor y atribuciones"
+menuTitle: "Derechos de autor"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## **The Documentation of Selenium**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------------------------------------------------------- | ------- | --------------------------------------------------------------------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+```
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/copyright_and_attributions.fr.md b/docs_source_files/content/front_matter/copyright_and_attributions.fr.md
new file mode 100644
index 00000000000..9a05a787e34
--- /dev/null
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.fr.md
@@ -0,0 +1,279 @@
+---
+title: "Copyright et attributions"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## **The Documentation of Selenium**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------------------------------------------------------- | ------- | --------------------------------------------------------------------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+```
\ No newline at end of file
diff --git a/docs_source_files/content/front_matter/copyright_and_attributions.ja.md b/docs_source_files/content/front_matter/copyright_and_attributions.ja.md
new file mode 100644
index 00000000000..46eec24bbb9
--- /dev/null
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.ja.md
@@ -0,0 +1,278 @@
+---
+title: "Copyright and attributions"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+## **The Documentation of Selenium**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------- | ------- | ------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+```
diff --git a/docs_source_files/content/front_matter/copyright_and_attributions.nl.md b/docs_source_files/content/front_matter/copyright_and_attributions.nl.md
new file mode 100644
index 00000000000..2737b41cd20
--- /dev/null
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.nl.md
@@ -0,0 +1,285 @@
+---
+title: "Copyright and attributions"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## **The Selenium Documentation**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Er is veel tijd en werk gestroken in het maken van deze
+documentatie met als doel zo correct en compleet mogelijk te zijn
+maar dit impliceert geen geschiktheid of garantie.
+Deze informatie wordt aangeboden op een "as-is" basis.
+De auteur en de uitgever
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------------------------------------------------------- | ------- | --------------------------------------------------------------------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+```
diff --git a/docs_source_files/content/front_matter/copyright_and_attributions.zh-cn.md b/docs_source_files/content/front_matter/copyright_and_attributions.zh-cn.md
new file mode 100644
index 00000000000..7ccaa9be75d
--- /dev/null
+++ b/docs_source_files/content/front_matter/copyright_and_attributions.zh-cn.md
@@ -0,0 +1,274 @@
+---
+title: "Copyright and attributions"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+## **The Documentation of Selenium**
+
+Copyright {{< copyright >}}, Software Freedom Conservancy.
+
+Every effort has been made to make this documentation
+as complete and as accurate as possible,
+but no warranty or fitness is implied.
+The information provided is on an “as-is” basis.
+The authors and the publisher shall have
+neither liability nor responsibility to any person or entity
+with respect to any loss or damages arising
+from the information contained in this book.
+No patent liability is assumed with respect
+to the use of the information contained herein.
+
+## Attributions
+
+### Thanks to:
+
+#### [Documentation](//github.com/SeleniumHQ/docs/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docs/contributors?per_page=100" %}}
+
+#### [Selenium Main Repo](//github.com/SeleniumHQ/selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/selenium/contributors?per_page=100" %}}
+
+#### [Docker Selenium](//github.com/SeleniumHQ/docker-selenium/)
+
+{{% ghcontributors "https://api.github.com/repos/seleniumhq/docker-selenium/contributors?per_page=100" %}}
+
+## Third-Party software used by Selenium documentation project:
+
+| Software | Version | License |
+| -------- | ------- | ------- |
+| [Hugo](//gohugo.io/) | v0.55.6 | [Apache 2.0](//gohugo.io/about/license/) |
+| [Hugo Learn Theme](//themes.gohugo.io/hugo-theme-learn/) | v2.3.0 | [MIT](//github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md) |
+| [Code Tabs Style](//codepen.io/markcaron/pen/MvGRYV) | --- | [MIT](//blog.codepen.io/legal/licensing/) |
+
+## HTML version and source code
+
+An HTML version of this documentation is freely available from
+[https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+
+The source code for the examples included,
+and for the book itself is available from the Selenium documentation repository
+at [https://seleniumhq.github.io/docs](//seleniumhq.github.io/docs).
+See instructions on how to check out the code via git at
+[https://help.github.com/articles/fetching-a-remote/](//help.github.com/articles/fetching-a-remote/).
+
+## License
+
+All code and documentation originating from the Selenium project
+is licensed under the Apache 2.0 license,
+with the [Software Freedom Conservancy](//sfconservancy.org/)
+as the copyright holder.
+
+The license is included here for convenience,
+but you can also find it on the
+[Apache Foundation's websites](//apache.org/licenses/LICENSE-2.0.html):
+
+```markdown
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+```
diff --git a/docs_source_files/content/front_matter/typographical_conventions.en.md b/docs_source_files/content/front_matter/typographical_conventions.en.md
new file mode 100644
index 00000000000..071d9fe712f
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.en.md
@@ -0,0 +1,38 @@
+---
+title: "Typographical conventions"
+weight: 2
+---
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/front_matter/typographical_conventions.es.md b/docs_source_files/content/front_matter/typographical_conventions.es.md
new file mode 100644
index 00000000000..17aa30a144c
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.es.md
@@ -0,0 +1,44 @@
+---
+title: "Convenciones tipográficas"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/front_matter/typographical_conventions.fr.md b/docs_source_files/content/front_matter/typographical_conventions.fr.md
new file mode 100644
index 00000000000..c1ba2db6202
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.fr.md
@@ -0,0 +1,44 @@
+---
+title: "Conventions typographique"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/front_matter/typographical_conventions.ja.md b/docs_source_files/content/front_matter/typographical_conventions.ja.md
new file mode 100644
index 00000000000..26b02462d1f
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.ja.md
@@ -0,0 +1,43 @@
+---
+title: "Typographical conventions"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/front_matter/typographical_conventions.nl.md b/docs_source_files/content/front_matter/typographical_conventions.nl.md
new file mode 100644
index 00000000000..480bed4ece3
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.nl.md
@@ -0,0 +1,44 @@
+---
+title: "Typographical conventions"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/front_matter/typographical_conventions.zh-cn.md b/docs_source_files/content/front_matter/typographical_conventions.zh-cn.md
new file mode 100644
index 00000000000..7a5d6070d42
--- /dev/null
+++ b/docs_source_files/content/front_matter/typographical_conventions.zh-cn.md
@@ -0,0 +1,43 @@
+---
+title: "Typographical conventions"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+## Capitalisation of titles
+
+One should avoid title capitalisation,
+such as _A Very Fine Heading_,
+and instead go for _A very fine heading_.
+Gratutious capitalisation, or title case,
+often show a misunderstanding of – or a disregard for –
+orthographic conventions.
+We prefer what is known as _sentence case_,
+with a single initial capital to start headers.
+
+## Line length
+
+When editing the documentation’s source,
+which is written in plain HTML,
+limit your line lengths to around 72 characters.
+
+Some of us take this one step further
+and use what is called
+[_semantic linefeeds_](//rhodesmill.org/brandon/2012/one-sentence-per-line),
+which is a technique whereby the HTML source lines,
+which are not read by the public,
+are split at ‘natural breaks’ in the prose.
+In other words, sentences are split
+at natural breaks between clauses.
+Instead of fussing with the lines of each paragraph
+so that they all end near the right margin,
+linefeeds can be added anywhere
+that there is a break between ideas.
+
+This can make diffs very easy to read
+when collaborating through git,
+but it is not something we enforce contributors to use.
diff --git a/docs_source_files/content/getting_started/_index.en.md b/docs_source_files/content/getting_started/_index.en.md
new file mode 100644
index 00000000000..ec9dc511a1c
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.en.md
@@ -0,0 +1,18 @@
+---
+title: "Getting started"
+chapter: true
+weight: 1
+---
+
+# Getting started
+
+If you are new to Selenium,
+we have a few resources that can help you
+get up to speed right away.
+
+* [Quick tour]({{< ref "/getting_started/quick.en.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.en.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.en.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.en.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.en.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.en.md#html-runner" >}})
\ No newline at end of file
diff --git a/docs_source_files/content/getting_started/_index.es.md b/docs_source_files/content/getting_started/_index.es.md
new file mode 100644
index 00000000000..a4198fe119e
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.es.md
@@ -0,0 +1,17 @@
+---
+title: "Primeros pasos"
+chapter: true
+weight: 1
+---
+
+
+# Primeros pasos
+
+Si es nuevo en Selenium, tenemos algunos recursos que pueden ayudarlo a ponerse al día de inmediato.
+
+* [Guía rápida]({{< ref "/getting_started/quick.es.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.es.md#webdriver" >}})
+ * [Control Remoto]({{< ref "/getting_started/quick.es.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.es.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.es.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.es.md#html-runner" >}})
diff --git a/docs_source_files/content/getting_started/_index.fr.md b/docs_source_files/content/getting_started/_index.fr.md
new file mode 100644
index 00000000000..4b2d02ca974
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.fr.md
@@ -0,0 +1,18 @@
+---
+title: "Pour débuter"
+chapter: true
+weight: 1
+---
+
+# Pour débuter
+
+Si Selenium est nouveau pour vous,
+nous vous proposons quelques ressources qui
+pourront vous aider à vous mettre à niveau très rapidement.
+
+* [Tour rapide]({{< ref "/getting_started/quick.fr.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.fr.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.fr.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.fr.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.fr.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.fr.md#html-runner" >}})
\ No newline at end of file
diff --git a/docs_source_files/content/getting_started/_index.ja.md b/docs_source_files/content/getting_started/_index.ja.md
new file mode 100644
index 00000000000..80333f65d30
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.ja.md
@@ -0,0 +1,23 @@
+---
+title: "Getting started"
+chapter: true
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Getting started
+
+If you are new to Selenium,
+we have a few resources that can help you
+get up to speed right away.
+
+* [Quick tour]({{< ref "/getting_started/quick.ja.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.ja.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.ja.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.ja.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.ja.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.ja.md#html-runner" >}})
diff --git a/docs_source_files/content/getting_started/_index.nl.md b/docs_source_files/content/getting_started/_index.nl.md
new file mode 100644
index 00000000000..ce5127063fb
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.nl.md
@@ -0,0 +1,17 @@
+---
+title: "Aan de slag"
+chapter: true
+weight: 1
+---
+
+# Aan de slag
+
+Hieronder vind je enkele links die je aan de slag helpen
+indien dit je eerste ervaring met Selenium is.
+
+* [Korte uitleg]({{< ref "/getting_started/quick.nl.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.nl.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.nl.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.nl.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.nl.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.nl.md#html-runner" >}})
diff --git a/docs_source_files/content/getting_started/_index.zh-cn.md b/docs_source_files/content/getting_started/_index.zh-cn.md
new file mode 100644
index 00000000000..6f84c8a0a6f
--- /dev/null
+++ b/docs_source_files/content/getting_started/_index.zh-cn.md
@@ -0,0 +1,16 @@
+---
+title: "入门指南"
+chapter: true
+weight: 1
+---
+
+# 入门指南
+
+如果您刚刚接触 Selenium,我们有一些资源可以帮助您快速上手。
+
+* [快速浏览]({{< ref "/getting_started/quick.zh-cn.md" >}})
+ * [WebDriver]({{< ref "/getting_started/quick.zh-cn.md#webdriver" >}})
+ * [Remote Control]({{< ref "/getting_started/quick.zh-cn.md#remote-control" >}})
+ * [IDE]({{< ref "/getting_started/quick.zh-cn.md#ide" >}})
+ * [Grid]({{< ref "/getting_started/quick.zh-cn.md#grid" >}})
+ * [HTML Runner]({{< ref "/getting_started/quick.zh-cn.md#html-runner" >}})
diff --git a/docs_source_files/content/getting_started/html-runner.en.md b/docs_source_files/content/getting_started/html-runner.en.md
new file mode 100644
index 00000000000..eec058db06e
--- /dev/null
+++ b/docs_source_files/content/getting_started/html-runner.en.md
@@ -0,0 +1,94 @@
+---
+title: "HTML runner"
+weight: 2
+---
+
+_Selenium HTML-runner_ allows you to run Test Suites from a
+command line. Test Suites are HTML exports from Selenium IDE or
+campatible tools.
+
+
+## Common information
+
+* Combination of releases of geckodriver / firefox /
+selenium-html-runner matters. There might be a software
+compatibility matrix somewhere.
+* selenium-html-runner runs only Test Suite (not Test Case -
+for example an export from Monitis Transaction Monitor). Be
+sure you comply with this.
+* For Linux users with no DISPLAY - you need to start html-runner
+with Virtual display (search for xvfb)
+
+## Example Linux environment
+Install / download following software packages:
+
+```shell
+[user@localhost ~]$ cat /etc/redhat-release
+CentOS Linux release 7.4.1708 (Core)
+
+[user@localhost ~]$ rpm -qa | egrep -i "xvfb|java-1.8|firefox"
+xorg-x11-server-Xvfb-1.19.3-11.el7.x86_64
+firefox-52.4.0-1.el7.centos.x86_64
+java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
+java-1.8.0-openjdk-headless-1.8.0.151-1.b12.el7_4.x86_64
+```
+
+Test Suite example:
+
+```html
+[user@localhost ~]$ cat testsuite.html
+
+
+
+
+
+ Test Suite
+
+
+
+
+
+```
+
+
+## How to run selenium-html-runner headless
+
+Now, the most important part, an example of how to run the
+selenium-html-runner! Your experience might vary depending on software
+combinations - geckodriver/FF/html-runner releases.
+
+```shell
+xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+```
+
+```shell
+[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+Multi-window mode is longer used as an option and will be ignored.
+1510061109691 geckodriver INFO geckodriver 0.18.0
+1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
+1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
+1510061111084 Marionette INFO Listening on port 43229
+1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
+Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
+INFO: Detected dialect: W3C
+2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
+2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
+2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
+2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
+2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
+Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |open | /auth_mellon.php | |
+Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |waitForPageToLoad | 3000 | |
+.
+.
+.etc
+
+
result:
+
PASS
+
+
+```
diff --git a/docs_source_files/content/getting_started/html-runner.es.md b/docs_source_files/content/getting_started/html-runner.es.md
new file mode 100644
index 00000000000..e55a7e00528
--- /dev/null
+++ b/docs_source_files/content/getting_started/html-runner.es.md
@@ -0,0 +1,86 @@
+---
+title: "HTML runner"
+weight: 2
+---
+
+_Selenium HTML-runner_ le permite ejecutar Test Suites desde una línea de comandos. Las suites de prueba son exportaciones HTML desde Selenium IDE o herramientas compatibles.
+
+
+## Información común
+
+* La combinación de lanzamientos de geckodriver / firefox / selenium-html runner es importante. Puede haber una matriz de compatibilidad de software en alguna parte.
+* selenium-html-runner solo ejecuta Test Suite (no Test Case, lo que es, por ejemplo, una exportación de _Monitis Transaction Monitor_). Asegúrese de cumplir con esto.
+* Para usuarios de Linux sin PANTALLA: debe iniciar html-runner con pantalla virtual (busque xvfb).
+
+
+## Ejemplo de un entorno Linux
+Descargue e instale los siguientes paquetes de software:
+
+```shell
+[user@localhost ~]$ cat /etc/redhat-release
+CentOS Linux release 7.4.1708 (Core)
+
+[user@localhost ~]$ rpm -qa | egrep -i "xvfb|java-1.8|firefox"
+xorg-x11-server-Xvfb-1.19.3-11.el7.x86_64
+firefox-52.4.0-1.el7.centos.x86_64
+java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
+java-1.8.0-openjdk-headless-1.8.0.151-1.b12.el7_4.x86_64
+```
+
+Ejemplo de la Test Suite:
+
+```html
+[user@localhost ~]$ cat testsuite.html
+
+
+
+
+
+ Test Suite
+
+
+
+
+
+```
+
+
+## Cómo ejecutar el elenium-html-runner sin cabeza (_headless_)
+
+Ahora, la parte más importante, ¡un ejemplo de cómo ejecutar selenium-html-runner! Su experiencia puede variar según las combinaciones de software: versiones geckodriver / Firefox / html-runner.
+
+```shell
+xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+```
+
+```shell
+[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+Multi-window mode is longer used as an option and will be ignored.
+1510061109691 geckodriver INFO geckodriver 0.18.0
+1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
+1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
+1510061111084 Marionette INFO Listening on port 43229
+1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
+Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
+INFO: Detected dialect: W3C
+2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
+2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
+2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
+2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
+2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
+Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |open | /auth_mellon.php | |
+Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |waitForPageToLoad | 3000 | |
+.
+.
+.etc
+
+
result:
+
PASS
+
+
+```
diff --git a/docs_source_files/content/getting_started/html-runner.fr.md b/docs_source_files/content/getting_started/html-runner.fr.md
new file mode 100644
index 00000000000..857ade34eb0
--- /dev/null
+++ b/docs_source_files/content/getting_started/html-runner.fr.md
@@ -0,0 +1,89 @@
+---
+title: "Runner HTML"
+weight: 2
+---
+
+_Selenium HTML-runner_ permet d'exécuter des Test Suites depuis la ligne de commande.
+Les Tests Suites sont des exports HTML depuis Selenium IDE ou autre outil compatible.
+
+## Informations générales
+
+* Les combinaisons de version de geckodriver / firefox /
+selenium-html-runner sont importantes. Il doit y avoir
+une matrice de compatibilité quelque part.
+* selenium-html-runner exécute seulement des Test Suites (et non pas des Test Case, comme un export de Monitis Transaction Monitor). Assurez-vous de vous y conformer.
+* Pour les utilisateurs Linux sans affichage - vous devez exécuter html-runner
+ avec un affichage virtuel (cherchez xvfb)
+
+## Exemple sur environnement Linux
+Installer / télécharger les packages suivants:
+
+```shell
+[user@localhost ~]$ cat /etc/redhat-release
+CentOS Linux release 7.4.1708 (Core)
+
+[user@localhost ~]$ rpm -qa | egrep -i "xvfb|java-1.8|firefox"
+xorg-x11-server-Xvfb-1.19.3-11.el7.x86_64
+firefox-52.4.0-1.el7.centos.x86_64
+java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
+java-1.8.0-openjdk-headless-1.8.0.151-1.b12.el7_4.x86_64
+```
+
+Example de Test Suite:
+
+```html
+[user@localhost ~]$ cat testsuite.html
+
+
+
+
+
+ Test Suite
+
+
+
+
+
+```
+
+
+## Comment exécuter selenium-html-runner en mode headless
+
+Pour la partie la plus importante, voici un exemple d'exécution de selenium-html-runner !
+Votre expérience peut varier selon les combinaisons logicielles - versions de geckodriver/FF/html-runner.
+
+```shell
+xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+```
+
+```shell
+[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+Multi-window mode is longer used as an option and will be ignored.
+1510061109691 geckodriver INFO geckodriver 0.18.0
+1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
+1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
+1510061111084 Marionette INFO Listening on port 43229
+1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
+Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
+INFO: Detected dialect: W3C
+2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
+2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
+2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
+2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
+2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
+Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |open | /auth_mellon.php | |
+Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |waitForPageToLoad | 3000 | |
+.
+.
+.etc
+
+
result:
+
PASS
+
+
+```
diff --git a/docs_source_files/content/getting_started/html-runner.ja.md b/docs_source_files/content/getting_started/html-runner.ja.md
new file mode 100644
index 00000000000..3ea45ee221b
--- /dev/null
+++ b/docs_source_files/content/getting_started/html-runner.ja.md
@@ -0,0 +1,99 @@
+---
+title: "HTML runner"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+_Selenium HTML-runner_ allows you to run Test Suites from a
+command line. Test Suites are HTML exports from Selenium IDE or
+campatible tools.
+
+
+## Common information
+
+* Combination of releases of geckodriver / firefox /
+selenium-html-runner matters. There might be a software
+compatibility matrix somewhere.
+* selenium-html-runner runs only Test Suite (not Test Case - what
+is for example an export from Monitis Transaction Monitor). Be
+sure you comply with this.
+* For Linux users with no DISPLAY - you need to start html-runner
+with Virtual display (search for xvfb)
+
+## Example Linux environment
+Install / download following software packages:
+
+```shell
+[user@localhost ~]$ cat /etc/redhat-release
+CentOS Linux release 7.4.1708 (Core)
+
+[user@localhost ~]$ rpm -qa | egrep -i "xvfb|java-1.8|firefox"
+xorg-x11-server-Xvfb-1.19.3-11.el7.x86_64
+firefox-52.4.0-1.el7.centos.x86_64
+java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
+java-1.8.0-openjdk-headless-1.8.0.151-1.b12.el7_4.x86_64
+```
+
+Test Suite example:
+
+```html
+[user@localhost ~]$ cat testsuite.html
+
+
+
+
+
+ Test Suite
+
+
+
+
+
+```
+
+
+## How to run selenium-html-runner headless
+
+Now, the most important part, an example of how to run the
+selenium-html-runner! Your experience might vary depending on software
+combinations - geckodriver/FF/html-runner releases.
+
+```shell
+xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+```
+
+```shell
+[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+Multi-window mode is longer used as an option and will be ignored.
+1510061109691 geckodriver INFO geckodriver 0.18.0
+1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
+1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
+1510061111084 Marionette INFO Listening on port 43229
+1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
+Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
+INFO: Detected dialect: W3C
+2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
+2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
+2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
+2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
+2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
+Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |open | /auth_mellon.php | |
+Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |waitForPageToLoad | 3000 | |
+.
+.
+.etc
+
+
result:
+
PASS
+
+
+```
diff --git a/docs_source_files/content/getting_started/html-runner.nl.md b/docs_source_files/content/getting_started/html-runner.nl.md
new file mode 100644
index 00000000000..47d2df3007d
--- /dev/null
+++ b/docs_source_files/content/getting_started/html-runner.nl.md
@@ -0,0 +1,94 @@
+---
+title: "HTML runner"
+weight: 2
+---
+
+Met de _Selenium HTML-runner_ kan je Test Suites starten vanaf de command
+line. Test Suites zijn HTML exports vanuit Selenium IDE of andere compatiebele
+tools.
+
+## Algemene informatie
+
+* De combinatie van geckodriver / firefox / selenium-html-runner
+is belangrijk. Er is mogelijks ergens een matrix die de
+compatibiliteit toelicht.
+* selenium-html-runner voert enkel Test Suites uit (geen Test Case -
+wat bijvoorbeeld een export van Monitis Transaction Monitor is).
+Wees zeker dat je hieraan voldoet.
+* html-runner moet met een virtuele display (xfvb) gestart worden
+op Linux distributies die niet over een display beschikken.
+
+
+## Voorbeeld Linux omgeving
+Installeer / download volgende software pakketten:
+
+```shell
+[user@localhost ~]$ cat /etc/redhat-release
+CentOS Linux release 7.4.1708 (Core)
+
+[user@localhost ~]$ rpm -qa | egrep -i "xvfb|java-1.8|firefox"
+xorg-x11-server-Xvfb-1.19.3-11.el7.x86_64
+firefox-52.4.0-1.el7.centos.x86_64
+java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
+java-1.8.0-openjdk-headless-1.8.0.151-1.b12.el7_4.x86_64
+```
+
+Test Suite voorbeeld:
+
+```html
+[user@localhost ~]$ cat testsuite.html
+
+
+
+
+
+ Test Suite
+
+
+
+
+
+```
+
+## 如何运行 selenium-html-runner headless
+
+现在,最重要的部分,一个如何运行 selenium-html-runner 的例子!
+您的体验可能因软件组合而异 - geckodriver / FF / html-runner 版本。
+
+```shell
+xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+```
+
+```shell
+[user@localhost ~]$ xvfb-run java -Dwebdriver.gecko.driver=/home/mmasek/geckodriver.0.18.0 -jar selenium-html-runner-3.7.1.jar -htmlSuite "*firefox" "https://YOUR-BASE-URL" "$(pwd)/testsuite.html" "results.html" ; grep result: -A1 results.html/firefox.results.html
+Multi-window mode is longer used as an option and will be ignored.
+1510061109691 geckodriver INFO geckodriver 0.18.0
+1510061109708 geckodriver INFO Listening on 127.0.0.1:2885
+1510061110162 geckodriver::marionette INFO Starting browser /usr/bin/firefox with args ["-marionette"]
+1510061111084 Marionette INFO Listening on port 43229
+1510061111187 Marionette WARN TLS certificate errors will be ignored for this session
+Nov 07, 2017 1:25:12 PM org.openqa.selenium.remote.ProtocolHandshake createSession
+INFO: Detected dialect: W3C
+2017-11-07 13:25:12.714:INFO::main: Logging initialized @3915ms to org.seleniumhq.jetty9.util.log.StdErrLog
+2017-11-07 13:25:12.804:INFO:osjs.Server:main: jetty-9.4.z-SNAPSHOT
+2017-11-07 13:25:12.822:INFO:osjsh.ContextHandler:main: Started o.s.j.s.h.ContextHandler@87a85e1{/tests,null,AVAILABLE}
+2017-11-07 13:25:12.843:INFO:osjs.AbstractConnector:main: Started ServerConnector@52102734{HTTP/1.1,[http/1.1]}{0.0.0.0:31892}
+2017-11-07 13:25:12.843:INFO:osjs.Server:main: Started @4045ms
+Nov 07, 2017 1:25:13 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |open | /auth_mellon.php | |
+Nov 07, 2017 1:25:14 PM org.openqa.selenium.server.htmlrunner.CoreTestCase run
+INFO: |waitForPageToLoad | 3000 | |
+.
+.
+.etc
+
+
result:
+
PASS
+
+
+```
diff --git a/docs_source_files/content/getting_started/quick.en.md b/docs_source_files/content/getting_started/quick.en.md
new file mode 100644
index 00000000000..6db17ee7c06
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.en.md
@@ -0,0 +1,62 @@
+---
+title: "Quick tour"
+weight: 1
+---
+
+Selenium is not just one tool or API
+but it composes many tools.
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.md" >}})_ is also known as Selenium 2.
+If you are beginning with desktop website test automation then you
+are going to be using WebDriver APIs. WebDriver uses browser
+automation APIs provided by browser vendors to control browser and
+run tests. This is as if a real user is operating the browser. Since
+WebDriver does not require its API to be compiled with application
+code, it is not intrusive in nature. Hence, you are testing the
+same application which you push live.
+
+
+## Remote Control
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp)
+is also known as Selenium 1.
+Selenium RC was the most prominent Selenium tool
+before the advent of Selenium WebDriver. Selenium RC would use a
+proxy server and inject JavaScript into a browser to be able to control
+it. Given the intrusive nature Selenium RC had on a browser,
+you could never be sure if what you were testing was the same as
+the application you wanted to push live. Selenium 2 APIs yet contain Selenium RC APIs but
+Selenium 3 would completely get rid of Selenium RC APIs. If you are
+still using Selenium RC then you must
+[_migrate_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0)
+to Selenium WebDriver.
+
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ is a
+Firefox plugin which can be used to record test steps in Firefox itself.
+Selenium IDE can be used to generate _quick and dirty_
+ test code in a variety of programming languages (i.e. C#,
+Java, Python, and Ruby). Given the maintainability of code generated
+through Selenium IDE, it is not recommended to use it for anything
+more than getting acquainted with element locators or generating
+_throw away code_. We are sure that once you get used to the
+WebDriver API, you will never use Selenium IDE.
+
+
+## Grid
+
+Soon after development of WebDriver tests, you may face a need of
+running your tests on multiple browser and operating system combinations.
+This is where _[Grid]({{< ref "/grid/_index.md" >}})_ comes to the rescue.
+
+
+## HTML Runner
+
+This tool allows you to run Test Suites from the command
+line. Test Suites are HTML exports from Selenium IDE or compatible
+tools. _[HTML Runner]({{< ref "/getting_started/html-runner.en.md" >}})_
+
diff --git a/docs_source_files/content/getting_started/quick.es.md b/docs_source_files/content/getting_started/quick.es.md
new file mode 100644
index 00000000000..6820e3532d7
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.es.md
@@ -0,0 +1,35 @@
+---
+title: "Guía rápida"
+weight: 1
+---
+
+
+Selenium no es solo una herramienta o API, sino que compone muchas herramientas.
+
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.md" >}})_ también se conoce como Selenium 2. Si está comenzando con la automatización de pruebas de sitios web de escritorio, entonces va a utilizar las API de WebDriver. WebDriver utiliza las API de automatización del navegador proporcionadas por los desarrolladores de los navegadores para controlar el navegador y ejecutar pruebas. Esto es como si un usuario real estuviera manipulando el navegador. Dado que el WebDriver no requiere que su API se compile con el código de la aplicación que va a probar, no es de naturaleza intrusiva. Por lo tanto, está probando la misma aplicación que está en vivo.
+
+
+## Control remoto
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp) también se conoce como Selenium 1.
+Selenium RC fue la herramienta de Selenium más destacada antes del advenimiento de Selenium WebDriver. Selenium RC usaba un servidor proxy e inyectaba JavaScript en un navegador para poder controlarlo. Dada la naturaleza intrusiva que Selenium RC tenía en un navegador, nunca podría estar seguro de si lo que estaba probando era lo mismo que la aplicación que quería publicar (desplegar). Las API de Selenium 2 todavía contienen API de Selenium RC, pero Selenium 3 eliminará completamente las API de Selenium RC. Si todavía utiliza Selenium RC, debe [_migrar_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0) a Selenium WebDriver.
+
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ es un complemento de Firefox que se puede utilizar para grabar los pasos de prueba en el propio Firefox. Selenium IDE se puede utilizar para generar código de prueba rápido y sucio (_quick and dirty_) en una variedad de lenguajes de programación (es decir, C #, Java, Python y Ruby).
+Dada la mantenibilidad del código generado a través de Selenium IDE, no se recomienda usarlo para nada más que familiarizarse con los localizadores (_locators_) de elementos o generar código descartable (_throw away code_). Estamos seguros de que una vez que se acostumbre a la API WebDriver, nunca usará Selenium IDE.
+
+
+## Grid
+
+Poco después del desarrollo de las pruebas de WebDriver, es posible que deba ejecutar sus pruebas en múltiples combinaciones de navegador y sistema operativo. Aquí es donde _[Grid]({{< ref "/grid/_index.md" >}})_ viene al rescate.
+
+
+## HTML Runner
+
+Esta herramienta le permite ejecutar Test Suites desde la línea de comandos. Las suites de prueba son exportaciones HTML desde Selenium IDE o herramientas compatibles. _[HTML Runner]({{< ref "/getting_started/html-runner.es.md">}})_
+
diff --git a/docs_source_files/content/getting_started/quick.fr.md b/docs_source_files/content/getting_started/quick.fr.md
new file mode 100644
index 00000000000..f6f4ef1ba09
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.fr.md
@@ -0,0 +1,61 @@
+---
+title: "Tour rapide"
+weight: 1
+---
+
+Selenium n'est pas juste un outil ou une API
+mais est composé de nombreux outils.
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.md" >}})_ aussi connu sous le nom de Selenium 2.
+Si vous débutez dans l'automatisation de test de site web _desktop_ vous allez utiliser les APIs WebDriver.
+WebDriver utilise les APIs d'automatisation fournies par les distributeurs de navigateur
+pour les contrôler et exécuter les tests.
+C'est comme si un utilisateur réel utilisait le navigateur.
+Puisque WebDriver n'a pas besoin que ses APIs soient compilées avec le code de l'application testée,
+il est non intrusif par nature. Ainsi vous testez exactement l'application qui sera en production.
+
+## Remote Control
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp) aussi connu sous le nom de Selenium 1.
+Selenium RC était l'outil Selenium central avant l'avènement de Selenium WebDriver.
+Selenium RC utilise un serveur proxy et injecte du Javascript dans le navigateur
+afin de pouvoir en prendre le contrôle.
+Etant donné la nature intrusive de Selenium RC sur la navigateur,
+vous ne pouvez jamais être sûr de tester la même application
+que celle qui sera déployée en production.
+A noter que les APIs Selenium 2 contiennent les APIs Selenium RC,
+mais les APIs Selenium 3, elles, se débarrasseront complètement de Selenium RC.
+Si vous utilisez toujours Selenium RC, vous devez
+[_migrer_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0)
+vers Selenium WebDriver.
+
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ est un plugin Firefox
+qui peut être utilisé pour enregistrer les étapes d'un test depuis firefox lui-même.
+Selenium IDE peut être utiliser pour générer des tests en mode _quick and dirty_
+dans une variété de langage (à savoir C#, Java, Python et Ruby).
+Etant donné la maintenabilité du code généré via Selenium IDE,
+il n'est pas recommandé de l'utiliser pour autre chose que
+de se familiariser avec des locators de web element
+ou générer du code temporaire (_throw away code_).
+Nous sommes sûr qu'une fois habitué à l'API WebDriver,
+vous n'utiliserez plus jamais Selenium IDE.
+
+
+## Grid
+
+Peu après le développement de tests basés sur WebDriver,
+il se peut que vous rencontriez le besoin d'exécuter ceux-ci
+sur des combinaisons différentes de navigateurs / système d'exploitation.
+C'est ici que _[Grid]({{< ref "/grid/_index.md" >}})_ intervient pour vous aider.
+
+
+## HTML Runner
+
+Cet outil permet de permet d'exécuter des Test Suites depuis la ligne de commande.
+Les Tests Suites sont des exports HTML depuis Selenium IDE ou autre outil compatible. _[HTML Runner]({{< ref "/getting_started/html-runner.fr.md" >}})_
+
diff --git a/docs_source_files/content/getting_started/quick.ja.md b/docs_source_files/content/getting_started/quick.ja.md
new file mode 100644
index 00000000000..9132b36d3cc
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.ja.md
@@ -0,0 +1,66 @@
+---
+title: "Quick tour"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Selenium is not just one tool or API
+but it composes many tools.
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.md" >}})_ is also known as Selenium 2.
+If you are beginning with desktop website test automation then you
+are going to be using WebDriver APIs. WebDriver uses browser
+automation APIs provided by browser vendors to control browser and
+run tests. This is as if a real user is operating the browser. Since
+WebDriver does not require its API to be compiled with application
+code, it is not intrusive in nature. Hence, you are testing the
+same application which you push live.
+
+
+## Remote Control
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp)
+is also known as Selenium 1.
+Selenium RC was the most prominent Selenium tool
+before the advent of Selenium WebDriver. Selenium RC would use a
+proxy server and inject JavaScript into a browser to be able to control
+it. Given the intrusive nature Selenium RC had on a browser,
+you could never be sure if what you were testing was the same as
+the application you wanted to push live. Selenium 2 APIs yet contain Selenium RC APIs but
+Selenium 3 would completely get rid of Selenium RC APIs. If you are
+still using Selenium RC then you must
+[_migrate_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0)
+to Selenium WebDriver.
+
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ is a
+Firefox plugin which can be used to record test steps in Firefox itself.
+Selenium IDE can be used to generate _quick and dirty_
+ test code in a variety of programming languages (i.e. C#,
+Java, Python, and Ruby). Given the maintainability of code generated
+through Selenium IDE, it is not recommended to use it for anything
+more than getting acquainted with element locators or generating
+_throw away code_. We're sure that once you get used to the
+WebDriver API, you will never use Selenium IDE.
+
+
+## Grid
+
+Soon after development of WebDriver tests, you may face a need of
+running your tests on multiple browser and operating system combinations.
+This is where _[Grid]({{< ref "/grid/_index.md" >}})_ comes to the rescue.
+
+
+## HTML Runner
+
+This tool allows you to run Test Suites from the command
+line. Test Suites are HTML exports from Selenium IDE or compatible
+tools. _[HTML Runner]({{< ref "/getting_started/html-runner.ja.md" >}})_
diff --git a/docs_source_files/content/getting_started/quick.nl.md b/docs_source_files/content/getting_started/quick.nl.md
new file mode 100644
index 00000000000..bb9a92feacc
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.nl.md
@@ -0,0 +1,50 @@
+---
+title: "Korte uitleg"
+weight: 1
+---
+
+Selenium is niet enkel een instrument of API,
+het bestaat uit verschillende instrumenten.
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.nl.md" >}})_ staat ook bekend als Selenium 2.
+Als je begint met het automatiseren van websites, dan zul je de WebDriver
+API's gebruiken. WebDriver gebruikt automatisatie API's die door de browsers zelf
+worden aangeboden. Laatstgenoemden worden gebruikt om de browser aan te sturen. Op die
+manier word een echte gebruiker gesimuleerd.WebDriver staat los van de applicatieve
+code en is daarom niet-intrusief. Zo test je dezelfde applicatie als diegene die live staat.
+
+## Remote Control
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp)
+staat ook bekend als Selenium 1.
+Selenium RC werd het meest gebruikt totdat Selenium WebDriver verscheen.
+Selenium RC gebruikte een proxy server om Javascript in de browser te injecteren, zodat deze
+kon aangestuurd worden. Wegens de grote impact op de browser, wegens Javascript injectie, was je
+nooit zeker of je dezelfde applicatie aan het testen was als diegene die live stond.
+In Selenium 2 zitten nog Selenium RC API's, maar sinds de release van Selenium 3, zijn al deze
+API's verwijderd. Als je nog steeds Selenium RC gebruikt, moet je
+[_overschakelen_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0) naar
+Selenium WebDriver.
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ is een Firefox plugin die gebruikt kan
+worden om testen op te nemen in Firefox. Selenium IDE kan gebruikt worden om _quick and dirty_
+testcode te genereren in verschillende programmeertalen (vb. C#, Java, Python en Ruby).
+De resulterende code vergt veel onderhoud en is daardoor alleen aan te raden om gewend te
+raken aan element locators of om snel _wergwerpcode_ te genereren. Als je de WebDriver API
+leert kennen, zal je geen nood meer hebben aan Selenium IDE.
+
+## Grid
+
+Nadat je enkele WebDriver testen hebt geschreven, zal je snel tot de constatatie komen
+dat je testen wil uitvoeren tegen verschillende (versies van) browsers.
+Hiervoor kun je _[Grid]({{< ref "/grid/_index.nl.md" >}})_ gebruiken.
+
+## HTML Runner
+
+Hiermee kun je Test Suites uitvoeren via de command line. Test Suites zijn
+HTML exports vanuit Selenium IDE of andere compatiebele tools _[HTML Runner]({{< ref "/getting_started/html-runner.nl.md" >}})_.
+
diff --git a/docs_source_files/content/getting_started/quick.zh-cn.md b/docs_source_files/content/getting_started/quick.zh-cn.md
new file mode 100644
index 00000000000..3a6e0379a59
--- /dev/null
+++ b/docs_source_files/content/getting_started/quick.zh-cn.md
@@ -0,0 +1,49 @@
+---
+title: "快速浏览"
+weight: 1
+---
+
+Selenium 不仅仅是一个工具或 API,它还包含许多工具。
+
+## WebDriver
+
+_[WebDriver]({{< ref "/webdriver/_index.md" >}})_ 也被称为 Selenium 2。
+如果您开始使用桌面网站测试自动化,那么您将使用 WebDriver APIs。
+WebDriver 使用浏览器供应商提供的浏览器自动化 API 来控制浏览器和运行测试。
+这就像真正的用户正在操作浏览器一样。
+由于 WebDriver 不要求使用应用程序代码编译其 API,因此它本质上不具有侵入性。
+因此,您测试的应用程序与实时推送的应用程序相同。
+
+## Remote Control
+
+[_Remote Control_](https://www.seleniumhq.org/docs/05_selenium_rc.jsp)
+也被称为 Selenium 1。
+Selenium RC 是 Selenium WebDriver 出现之前最突出的 Selenium 工具。
+Selenium RC 将使用一个代理服务器,并将 JavaScript 注入到浏览器中,以便能够控制它。
+考虑到 Selenium RC 在浏览器上的侵入性,
+您永远不能确定您测试的应用程序是否与您想要推送的应用程序相同。
+Selenium 2 APIs 包含有 Selenium RC APIs,
+但是 Selenium 3 会完全摆脱 Selenium RC APIs。
+如果您还在使用 Selenium RC,则必须
+[_迁移_](https://www.seleniumhq.org/docs/03_webdriver.jsp#migrating-from-selenium-1-0)
+到 Selenium WebDriver.
+
+## IDE
+
+_[IDE](https://www.seleniumhq.org/selenium-ide)_ 是一个 Firefox 插件,
+可以用来记录 Firefox 本身的测试步骤。
+Selenium IDE 可用于快速生成各种编程语言(C#、Java、Python 和 Ruby)的测试代码。
+考虑到通过 Selenium IDE 生成的代码的可维护性,除了熟悉元素定位器或生成丢弃的代码之外,
+不推荐将其用于其他任何用途。
+我们确信,一旦您习惯了 WebDriver API,您将永远不会使用 Selenium IDE。
+
+## Grid
+
+在 WebDriver 测试开发后不久,您可能需要在多个浏览器和操作系统组合上运行测试。
+这就是 _[Grid]({{< ref "/grid/_index.md" >}})_ 应用的地方。
+
+## HTML Runner
+
+此工具允许您从命令行运行 Test Suites。
+Test Suites 是从 Selenium IDE 或兼容工具导出的 HTML。
+_[HTML Runner]({{< ref "/getting_started/html-runner.zh-cn.md" >}})_
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.en.md b/docs_source_files/content/getting_started_with_webdriver/_index.en.md
new file mode 100644
index 00000000000..3079037b9cc
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.en.md
@@ -0,0 +1,29 @@
+---
+title: "Getting started with WebDriver"
+chapter: true
+weight: 4
+---
+
+# Getting started with WebDriver
+
+Selenium supports automation of all the major browsers in the market
+through the use of _WebDriver_.
+WebDriver is an API and protocol that defines a language-neutral interface
+for controlling the behaviour of web browsers.
+Each browser is backed by a specific WebDriver implementation, called a *driver*.
+The driver is the component responsible for delegating down to the browser,
+and handles communication to and from Selenium and the browser.
+
+This separation is part of a conscious effort to have browser vendors
+take responsibility for the implementation for their browsers.
+Selenium makes use of these third party drivers where possible,
+but also provides its own drivers maintained by the project
+for the cases when this is not a reality.
+
+The Selenium framework ties all of these pieces together
+through a user-facing interface that enables the different browser backends
+to be used transparently,
+enabling cross-browser and cross-platform automation.
+
+More details about drivers can be found in
+[Driver Idiosyncrasies]({{< ref "/driver_idiosyncrasies/_index.md" >}}).
\ No newline at end of file
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.es.md b/docs_source_files/content/getting_started_with_webdriver/_index.es.md
new file mode 100644
index 00000000000..fb573d28e12
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.es.md
@@ -0,0 +1,17 @@
+---
+title: "Primeros pasos con WebDriver"
+chapter: true
+weight: 4
+---
+
+
+# Primeros pasos con WebDriver
+
+Selenium admite la automatización de todos los principales navegadores del mercado mediante el uso del _WebDriver_. WebDriver es una API y un protocolo que define una interfaz de lenguaje neutral para controlar el comportamiento de los navegadores web. Cada navegador está respaldado por una implementación específica de WebDriver, llamada *controlador* (o _driver_). El controlador es el componente responsable de manipular el navegador, y maneja la comunicación hacia y desde Selenium y el navegador.
+
+Esta separación es parte de un esfuerzo consciente para que los proveedores de navegadores se hagan responsables de la implementación de sus navegadores. Selenium hace uso de estos controladores de terceros cuando es posible, pero también proporciona sus propios controladores mantenidos por el proyecto para los casos en que esto no pueda ser realizado.
+
+El marco Selenium une todas estas piezas a través de una interfaz orientada al usuario que permite que los diferentes backends del navegador se utilicen de forma transparente, lo que permite la automatización entre navegadores (_cross-browser_) y plataformas cruzadas (_cross-platform_).
+
+Se pueden encontrar más detalles sobre los controladores en [Driver Idiosyncrasies]({{< ref "/driver_idiosyncrasies/_index.md" >}}).
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.fr.md b/docs_source_files/content/getting_started_with_webdriver/_index.fr.md
new file mode 100644
index 00000000000..a2dcbded17e
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.fr.md
@@ -0,0 +1,30 @@
+---
+title: "Débuter avec WebDriver"
+chapter: true
+weight: 4
+---
+
+# Débuter avec WebDriver
+
+Selenium permet l'automatisation des navigateurs les plus courants du marché
+à travers l'utilisation de _WebDriver_.
+WebDriver est une API et un protocole définissant une interface agnostique
+(non orientée vers un langage spécifique)
+permettant de controller le comportement des navigateurs web.
+Chaque navigateur est appuyé par une implémentation spécifique de WebDriver,
+appelée un *driver*.
+Ce driver est le composant responsable de la délégation vers le navigateur,
+et gère la communication entre Selenium et le navigateur.
+
+Cette séparation fait partie d'un effor conscient afin de responsabiliser
+les fournisseurs de navigateurs quant à l'implémentation de ceux-ci.
+Selenium tire parti de drivers tierces lorsque c'est possible,
+mais fournit également ces propres drivers, maintenus par le projet,
+lorsque nécessaire.
+
+Le framework Selenium relie toutes ces pièces ensemnle via une interface
+user-friendly qui permet d'utiliser différents navigateurs de manière transparente,
+permettant ainsi l'automatisation cross-platform et cross-browser.
+
+Plus de détail à propos des driver peut être trouvé au chapitre
+[Singularités du Driver]({{< ref "/driver_idiosyncrasies/_index.md" >}}).
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.ja.md b/docs_source_files/content/getting_started_with_webdriver/_index.ja.md
new file mode 100644
index 00000000000..0eaa5fc3aa5
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.ja.md
@@ -0,0 +1,34 @@
+---
+title: "Getting started with WebDriver"
+chapter: true
+weight: 4
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Getting started with WebDriver
+
+Selenium supports automation of all the major browsers in the market
+through the use of _WebDriver_.
+WebDriver is an API and protocol that defines a language-neutral interface
+for controlling the behaviour of web browsers.
+Each browser is backed by a specific WebDriver implementation, called a *driver*.
+The driver is the component responsible for delegating down to the browser,
+and handles communication to and from Selenium and the browser.
+
+This separation is part of a conscious effort to have browser vendors
+take responsibility for the implementation for their browsers.
+Selenium makes use of these third party drivers where possible,
+but also provides its own drivers maintained by the project
+for the cases when this is not a reality.
+
+The Selenium framework ties all of these pieces together
+through a user-facing interface that enables the different browser backends
+to be used transparently,
+enabling cross-browser and cross-platform automation.
+
+More details about drivers can be found in
+[Driver Idiosyncrasies]({{< ref "/driver_idiosyncrasies/_index.md" >}}).
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.nl.md b/docs_source_files/content/getting_started_with_webdriver/_index.nl.md
new file mode 100644
index 00000000000..98daf28b949
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.nl.md
@@ -0,0 +1,28 @@
+---
+title: "Aan de slag met WebDriver"
+chapter: true
+weight: 4
+---
+
+# Aan de slag met WebDriver
+
+Door middel van _WebDriver_ ondersteunt Selenium alle grote browsers op de markt.
+WebDriver is een API en protocol dat een taal-onafhankelijke interface aanbied die
+de browser kan aansturen. Elke browser bevat een specifieke WebDriver implementatie.
+We verwijzen naar deze implementatie als *driver*.
+De driver is verantwoordelijk voor de vertaalslag naar de browser en staat in voor
+de communicatie van en naar Selenium en de browser.
+
+Deze opsplitsing is bewust gedaan zodat de leverancier van de browser de
+verantwoordelijkheid van de implementatie op zich neemt. Selenium maakt gebruik
+van deze aangeleverde drivers indien mogelijk. Eveneens bied ze haar eigen drivers
+aan voor het geval dat de leverancier hierover niet beschikt. Deze worden onderhouden
+door de community.
+
+Selenium schakelt al deze stukken aan elkaar door middel van een interface.
+Deze zorgt voor een transparante en gebruiksvriendelijke manier om de backend
+van de verschillende browsers aan te spreken. Hierdoor onstaat een browser en
+platform onafhankelijke oplossing.
+
+Meer info over de drivers kan je terugvinden via
+[Driver Eigenschappen]({{< ref "/driver_idiosyncrasies/_index.nl.md" >}}).
diff --git a/docs_source_files/content/getting_started_with_webdriver/_index.zh-cn.md b/docs_source_files/content/getting_started_with_webdriver/_index.zh-cn.md
new file mode 100644
index 00000000000..8024320868a
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/_index.zh-cn.md
@@ -0,0 +1,28 @@
+---
+title: "WebDriver 入门"
+chapter: true
+weight: 4
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+# WebDriver 入门
+
+Selenium 通过使用 _WebDriver_ 支持市场上所有主流浏览器的自动化。
+Webdriver 是一个 API 和协议,它定义了一个语言中立的接口,用于控制 web 浏览器的行为。
+每个浏览器都有一个特定的 WebDriver 实现,称为驱动程序。
+驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。
+
+这种分离是有意识地努力让浏览器供应商为其浏览器的实现负责的一部分。
+Selenium 在可能的情况下使用这些第三方驱动程序,
+但是在这些驱动程序不存在的情况下,它也提供了由项目自己维护的驱动程序。
+
+Selenium 框架通过一个面向用户的界面将所有这些部分连接在一起,
+该界面允许透明地使用不同的浏览器后端,
+从而实现跨浏览器和跨平台自动化。
+
+有关驱动程序的更多详细信息,请参阅
+[驱动特性]({{< ref "/driver_idiosyncrasies/_index.md" >}}).
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.en.md b/docs_source_files/content/getting_started_with_webdriver/browsers.en.md
new file mode 100644
index 00000000000..fd0c1da29d8
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.en.md
@@ -0,0 +1,27 @@
+---
+title: "Browsers"
+weight: 1
+---
+
+## Consumer browsers
+
+The Selenium framework officially supports the following browsers:
+
+| Browser | Maintainer | Versions Supported |
+| -------- | ---------- | ------------------ |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | All versions |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 and newer |
+| Internet Explorer | Selenium | 6 and newer |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 and newer |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 and newer |
+
+## Specialized browsers
+
+There is also a set of specialized browsers out there
+typically used in development environments.
+We can make use of some of these browsers for automation purposes also,
+and Selenium ties in support for the following specialized drivers:
+
+| Driver Name | Purpose | Maintainer |
+| -------- | ---------- | ------------------ |
+| HtmlUnitDriver | Headless browser emulator backed by Rhino | Selenium project |
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.es.md b/docs_source_files/content/getting_started_with_webdriver/browsers.es.md
new file mode 100644
index 00000000000..4d2d94576da
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.es.md
@@ -0,0 +1,26 @@
+---
+title: "Navegadores"
+weight: 1
+---
+
+
+## Navegadores (_Browsers_) de consumidores
+
+El marco Selenium admite oficialmente los siguientes navegadores:
+
+| Navegador | Desarrollador | Versiones soportadas |
+| -------- | ---------- | ------------------ |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | Todas las versiones |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 y recientes |
+| Internet Explorer | Selenium | 6 y recientes |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 y recientes |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 y recientes |
+
+## Navegadores especializados
+
+También hay un conjunto de navegadores especializados que generalmente se usan en entornos de desarrollo. También podemos utilizar algunos de estos navegadores para fines de automatización, y Selenium se vincula con el soporte para los siguientes controladores especializados:
+
+| Nombre del controlador | Propósito | Desarrollador |
+| -------- | ---------- | ------------------ |
+| HtmlUnitDriver | Emulador de navegador sin cabeza (_headless_) por Rhino | Selenium project |
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.fr.md b/docs_source_files/content/getting_started_with_webdriver/browsers.fr.md
new file mode 100644
index 00000000000..134e283424e
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.fr.md
@@ -0,0 +1,28 @@
+---
+title: "Navigateurs"
+weight: 1
+---
+
+## Navigateurs consommateurs
+
+Le framework Selenium supporte officiellement les navigateurs suivants:
+
+| Navigateur | Mainteneur | Versions supportées |
+| ----------------- | -------------------------------------------------------------------------------------------------------------------------- | --------------------- |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | Toutes versions |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 and plus récentes |
+| Internet Explorer | Selenium | 6 et plus récentes |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 et plus récentes |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 et plus récentes |
+
+## Navigateurs spécialisés
+
+Il existe également un ensemble de navigateurs spécialisés,
+utilisés typiquement dans des environnements de développement.
+
+Ils peuvent également être utilisés à des fins d'automatisation,
+et Selenium fournit un support pour les navigateurs spécialisés suivants:
+
+| Nom Driver | Utilisation | Mainteneur |
+| -------------- | --------------------------------------------------- | --------------- |
+| HtmlUnitDriver | Emulateur de navigateur headless supproté par Rhino | Projet Selenium |
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.ja.md b/docs_source_files/content/getting_started_with_webdriver/browsers.ja.md
new file mode 100644
index 00000000000..685b6e85d08
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.ja.md
@@ -0,0 +1,32 @@
+---
+title: "Browsers"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+## Consumer browsers
+
+The Selenium framework officially supports the following browsers:
+
+| Browser | Maintainer | Versions Supported |
+| -------- | ---------- | ------------------ |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | All versions |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 and newer |
+| Internet Explorer | Selenium | 6 and newer |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 and newer |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 and newer |
+
+## Specialised browsers
+
+There is also a set of specialized browsers out there
+typically used in development environments.
+We can make use of some of these browsers for automation purposes also,
+and Selenium ties in support for the following specialized drivers:
+
+| Driver Name | Purpose | Maintainer |
+| -------- | ---------- | ------------------ |
+| HtmlUnitDriver | Headless browser emulator backed by Rhino | Selenium project |
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.nl.md b/docs_source_files/content/getting_started_with_webdriver/browsers.nl.md
new file mode 100644
index 00000000000..8c18dee7de6
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.nl.md
@@ -0,0 +1,26 @@
+---
+title: "Browsers"
+weight: 1
+---
+
+## Algemene browsers
+
+Selenium ondersteunt officieel volgende browsers:
+
+| Browser | Beheerder | Ondersteunde versies |
+| -------- | ---------- | ------------------ |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | Alle versies |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 en nieuwer |
+| Internet Explorer | Selenium | 6 en nieuwer |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 en nieuwer |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 en nieuwer |
+
+## Gespecialiseerde browsers
+
+Er bestaan ook gespecialiseerde browser die enkel in ontwikkelomgevingen gebruikt
+worden. Deze kunnen ook gebruikt worden voor het automatiseren van de browser.
+Selenium biedt ondersteuning voor de volgende drivers:
+
+| Driver | Doel | Beheerder |
+| -------- | ---------- | ------------------ |
+| HtmlUnitDriver | Headless browser emulator ontwikkeld door Rhino | Selenium project |
diff --git a/docs_source_files/content/getting_started_with_webdriver/browsers.zh-cn.md b/docs_source_files/content/getting_started_with_webdriver/browsers.zh-cn.md
new file mode 100644
index 00000000000..025717fe8af
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/browsers.zh-cn.md
@@ -0,0 +1,32 @@
+---
+title: "Browsers"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+## Consumer browsers
+
+The Selenium framework officially supports the following browsers:
+
+| Browser | Maintainer | Versions Supported |
+| -------- | ---------- | ------------------ |
+| Chromium | [Chromium](//sites.google.com/a/chromium.org/chromedriver/) | All versions |
+| Firefox | [Mozilla](//github.com/mozilla/geckodriver/) | 54 and newer |
+| Internet Explorer | Selenium | 6 and newer |
+| Opera | Opera [Chromium](//github.com/operasoftware/operachromiumdriver/) / [Presto](//github.com/operasoftware/operaprestodriver) | 10.5 and newer |
+| Safari | [Apple](//webkit.org/blog/6900/webdriver-support-in-safari-10/) | 10 and newer |
+
+## Specialised browsers
+
+There is also a set of specialized browsers out there
+typically used in development environments.
+We can make use of some of these browsers for automation purposes also,
+and Selenium ties in support for the following specialized drivers:
+
+| Driver Name | Purpose | Maintainer |
+| -------- | ---------- | ------------------ |
+| HtmlUnitDriver | Headless browser emulator backed by Rhino | Selenium project |
\ No newline at end of file
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.en.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.en.md
new file mode 100644
index 00000000000..49e9297f61c
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.en.md
@@ -0,0 +1,186 @@
+---
+title: "Locating elements"
+weight: 3
+---
+
+### Locating one element
+
+One of the most fundamental techniques to learn when using WebDriver is
+how to find elements on the page. WebDriver offers a number of built-in selector
+types, amongst them finding an element by its ID attribute:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As seen in the example, locating elements in WebDriver is done on the
+`WebDriver` instance object. The `findElement(By)` method returns
+another fundamental object type, the `WebElement`.
+
+* `WebDriver` represents the browser
+* `WebElement` represents a particular DOM node
+ (a control, e.g. a link or input field, etc.)
+
+Once you have a reference to a web element that's been “found”,
+you can narrow the scope of your search
+by using the same call on that object instance:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+WebElement cheddar = cheese.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheese = driver.find_element_by_id("cheese")
+cheddar = cheese.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement cheese = driver.FindElement(By.Id("cheese"));
+IWebElement cheddar = cheese.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+cheese = driver.find_element(id: "cheese")
+cheddar = cheese.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+const cheddar = await cheese.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can do this because both the _WebDriver_ and _WebElement_ types
+implement the [_SearchContext_](//seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext)
+interface. In WebDriver, this is known as a _role-based interface_.
+Role-based interfaces allow you to determine whether a particular
+driver implementation supports a given feature. These interfaces are
+clearly defined and try to adhere to having only a single role of
+responsibility. You can read more about WebDriver's design and what
+roles are supported in which drivers in the [Some Other Section Which
+Must Be Named](#).
+
+
+Consequently, the _By_ interface used above also supports a
+number of additional locator strategies. A nested lookup might not be
+the most effective cheese location strategy since it requires two
+separate commands to be issued to the browser; first searching the DOM
+for an element with ID “cheese”, then a search for “cheddar” in a
+narrowed context.
+
+To improve the performance slightly, we should try to use a more
+specific locator: WebDriver supports looking up elements
+by CSS locators, allowing us to combine the two previous locators into
+one search:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#cheese #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Locating multiple elements
+
+It is possible that the document we are working with may turn out to have an
+ordered list of the cheese we like the best:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+
+Since more cheese is undisputably better, and it would be cumbersome
+to have to retrieve each of the items individually, a superior
+technique for retrieving cheese is to make use of the pluralized
+version `findElements(By)`. This method returns a collection of web
+elements. If only one element is found, it will still return a
+collection (of one element). If no element matches the locator, an
+empty list will be returned.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList muchoCheese = driver.FindElements(By.CssSelector(“#cheese li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const muchoCheese = await driver.findElements(By.css('#cheese li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Element selection strategies
+
+There are eight different built-in element location strategies in WebDriver:
+
+| Locator | Description |
+| -------- | ---------- |
+| class name | Locates elements whose class name contains the search value (compound class names are not permitted) |
+| css selector | Locates elements matching a CSS selector |
+| id | Locates elements whose ID attribute matches the search value |
+| name | Locates elements whose NAME attribute matches the search value |
+| link text | Locates anchor elements whose visible text matches the search value |
+| partial link text | Locates anchor elements whose visible text matches the search value |
+| tag name | Locates elements whose tag name matches the search value |
+| xpath | Locates elements matching an XPath expression |
+
+### Tips on using selectors
+
+In general, if HTML IDs are available, unique, and consistently
+predictable, they are the preferred method for locating an element on
+a page. They tend to work very quickly, and forego much processing
+that comes with complicated DOM traversals.
+
+If unique IDs are unavailable, a well-written CSS selector is the
+preferred method of locating an element. XPath works as well as CSS
+selectors, but the syntax is complicated and frequently difficult to
+debug. Though XPath selectors are very flexible, they are typically
+not performance tested by browser vendors and tend to be quite slow.
+
+Selection strategies based on link text and partial link text have
+drawbacks in that they only work on link elements. Additionally, they
+call down to XPath selectors internally in WebDriver.
+
+Tag name can be a dangerous way to locate elements. There are
+frequently multiple elements of the same tag present on the page.
+This is mostly useful when calling the _findElements(By)_ method which
+returns a collection of elements.
+
+The recommendation is to keep your locators as compact and
+readable as possible. Asking WebDriver to traverse the DOM structure
+is an expensive operation, and the more you can narrow the scope of
+your search, the better.
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.es.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.es.md
new file mode 100644
index 00000000000..c9ff23914f7
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.es.md
@@ -0,0 +1,145 @@
+---
+title: "Localizando elementos"
+weight: 3
+---
+
+
+## Localizando un elemento
+
+Una de las técnicas más fundamentales por aprender al usar WebDriver es cómo encontrar elementos en la página. WebDriver ofrece varios tipos de selectores integrados, entre ellos encontrar un elemento por su atributo ID:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Como se ve en el ejemplo, la localización de elementos en WebDriver se realiza en el objeto de instancia `WebDriver`. El método `findElement(By)` devuelve otro tipo de objeto fundamental, el `WebElement`.
+
+* `WebDriver` representa al navegador.
+* `WebElement` representa a un nodo DOM particular (un control, por ejemplo, un enlace o campo de entrada, etc.).
+
+Una vez que tenga la referencia a un elemento web que se ha "encontrado", puede reducir el alcance de su búsqueda utilizando la misma llamada en esa instancia de objeto:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+WebElement cheddar = cheese.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheese = driver.find_element_by_id("cheese")
+cheddar = cheese.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement cheese = driver.FindElement(By.Id("cheese"));
+IWebElement cheddar = cheese.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+cheese = driver.find_element(id: "cheese")
+cheddar = cheese.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+const cheddar = await cheese.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Usted puede hacer esto porque los tipos _WebDriver_ y _WebElement_ implementan la interfaz [_SearchContext_](// seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext). En WebDriver, esto se conoce como _interfaz basada en roles_. Las interfaces basadas en roles le permiten determinar si una implementación de controlador particular admite una característica determinada. Estas interfaces están claramente definidas y tratan de cumplir con tener un solo rol de responsabilidad. Puede leer más sobre el diseño de WebDriver y qué roles se admiten en qué controladores en [Alguna otra sección que debe nombrarse](#).
+
+
+En consecuencia, la interfaz _By_ utilizada anteriormente también admite una serie de estrategias de localización adicionales. Una búsqueda anidada podría no ser la estrategia de ubicación más efectiva, ya que requiere que se envíen dos comandos separados al navegador; primero buscando en el DOM un elemento con ID "_cheese_", luego una búsqueda de "cheddar" en un contexto restringido.
+
+Para mejorar ligeramente el rendimiento, deberíamos tratar de usar un localizador más específico: WebDriver admite la búsqueda de elementos mediante localizadores CSS, lo que nos permite combinar los dos localizadores anteriores en una sola búsqueda:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#cheese #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+## Localizando múltiples elementos
+
+Es posible que el documento con el que estamos trabajando tenga una lista ordenada de quesos que más nos gustan:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+
+Dado que más queso es indiscutiblemente mejor, y sería engorroso tener que recuperar cada uno de los elementos individualmente, una técnica superior para recuperar queso es utilizar la versión pluralizada `findElements(By)`. Este método devuelve una colección de elementos web. Si solo se encuentra un elemento, aún devolverá una colección (de un elemento). Si ningún elemento coincide con el localizador, se devolverá una lista vacía.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList muchoCheese = driver.FindElements(By.CssSelector(“#cheese li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const muchoCheese = await driver.findElements(By.css('#cheese li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Estrategias de localización de elementos
+
+Hay ocho estrategias diferentes de ubicación de elementos integrados en WebDriver:
+
+| Localizador | Descripción |
+| -------- | ---------- |
+| class name | Localiza elementos cuyo nombre de clase contiene el valor de búsqueda (no se permiten nombres de clase compuestos) |
+| css selector | Localiza elementos que coinciden con un selector CSS |
+| id | Localiza elementos cuyo atributo ID coincide con el valor de búsqueda |
+| name | Localiza elementos cuyo atributo NAME coincide con el valor de búsqueda |
+| link text | Localiza elementos de hipervínculo cuyo texto visible coincide con el valor de búsqueda |
+| partial link text | Localiza elementos de vínculo o enlace cuyo texto visible coincide con el valor de búsqueda |
+| tag name | Localiza elementos cuyo nombre de etiqueta coincide con el valor de búsqueda |
+| xpath | Localiza elementos que coinciden con una expresión XPath |
+
+
+## Consejos para usar selectores
+
+En general, si las ID de HTML están disponibles, son únicas y predecibles de manera consistente, son el método preferido para ubicar un elemento en una página. Tienden a funcionar muy rápidamente y renuncian a mucho procesamiento que viene con recorridos DOM complicados.
+
+Si las ID únicas no están disponibles, un selector CSS bien escrito es el método preferido para localizar un elemento. XPath funciona tan bien como los selectores CSS, pero la sintaxis es complicada y con frecuencia difícil de depurar. Aunque los selectores XPath son muy flexibles, generalmente no son probados por los proveedores de navegadores y tienden a ser bastante lentos.
+
+Las estrategias de selección basadas en texto de enlace y texto parcial de enlace tienen inconvenientes en el sentido de que solo funcionan en elementos de enlace. Además, llaman a los selectores XPath internamente en WebDriver.
+
+La etiqueta nombre (_name_) puede ser una forma peligrosa de localizar elementos. Con frecuencia hay varios elementos de la misma etiqueta presentes en la página. Esto es principalmente útil cuando se llama al método _findElements(By)_ que devuelve una colección de elementos.
+
+La recomendación es mantener sus localizadores lo más compactos y legibles posible. Pedirle al WebDriver que atraviese la estructura DOM es una operación costosa, y cuanto más pueda reducir el alcance de su búsqueda, mejor.
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.fr.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.fr.md
new file mode 100644
index 00000000000..a710ef9b491
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.fr.md
@@ -0,0 +1,190 @@
+---
+title: "Localiser des éléments"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+### Localiser des éléments
+
+Une des techniques fondamentales à maîtriser lorsque l'on utilise WebDriver
+consiste à chercher des éléments sur une page.
+WebDriver offre pour cela un ensemble pré-défini de type de selecteurs,
+parmi lesquels la recherche d'une élément par son attribut ID:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("fromage"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("fromage")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("fromage"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "fromage")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const fromage = await driver.findElement(By.id('fromage'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Comme démontré dans cet exemple, la localisation des éléments à l'aide de WebDriver
+se fait via une instance de l'objet `WebDriver`.
+La méthode `findElement(By)` retourne un autre type d'objet fondamental, un `WebElement`.
+
+* `WebDriver` represente la navigateur
+* `WebElement` represente un noeud particulier du DOM
+ (un lien, un champ texte, etc.)
+
+Un fois que l'on a obtenu la référence de l'élément web qui a été "trouvé",
+on peut encore réduire la portée de notre recherche
+en utilisant le même appel de méthode sur l'instance de cet objet:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement fromage = driver.findElement(By.id("fromage"));
+WebElement cheddar = fromage.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+fromage = driver.find_element_by_id("fromage")
+cheddar = fromage.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement fromage = driver.FindElement(By.Id("fromage"));
+IWebElement cheddar = fromage.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+fromage = driver.find_element(id: "fromage")
+cheddar = fromage.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const fromage = await driver.findElement(By.id('fromage'));
+const cheddar = await fromage.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Nous pouvons faire cela car les types _WebDriver_ et _WebElement_
+implémentent tous deux l'interface [_SearchContext_](//seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext).
+Dans WebDriver, ce principe est connu sous le nom de _role-based interface_.
+Les interfaces basées sur le rôle nous permettent de déterminer
+si une implémentation particulière de driver supporte une fonctionnalité donnée.
+Ces interfaces sont clairement définies et tente d'adhérer au principe de responsabilité unique.
+Vous pouvez en lire plus sur le design de WebDriver et sur quels drivers supportent quels rôles dans le chapitre [Un Autre Chapitre Qui Aura Un Nom](#).
+
+
+Par conséquent, l'interface _By_ utilisée précédement fournit également
+d'autres stratégies de localisation. Une recherche imbriquée peut ne pas
+être la startégie la plus adaptée pour trouver notre cheddar
+puisqu'elle nécessite que deux instructions séparées soient envoyées au navigateur ;
+tout d'abord rechercher un élément ayant pour ID "fromage",
+puis une recherche pour "cheddar" dans ce contexte plus restreint.
+
+Pour améliorer légèrement les performances, nous pourrions essayer
+un sélecteur (une stratégie de localisation) plus spécifique :
+WebDriver supporte la localisation d'élément via sélecteur CSS,
+nous permettant de combiner les deux sélecteurs précédents en un seul:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#fromage #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#fromage #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#fromage #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#fromage #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#fromage #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Localiser plusieurs éléments
+
+Il est possible que le document web sur lequel nous travaillons
+dispose d'une liste ordonnée de nos fromages préférés:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+Puisque plus de fromage est sans conteste meilleur, et qu'il serait lourd
+de devoir récupérer chaque item un par un, une technique supérieure est d'utiliser
+la forme plurielle `findElements(By)`. Cette méthode retourne une collection
+d'éléments web. Si un seul élement a été trouvé, la méthode renverra tout de même
+une collection (d'un seul élément). Si aucun élément ne correspond au sélécteur,
+la collection retournée sera alors vide.
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List pleinDeFromage = driver.findElements(By.cssSelector("#fromage li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+plein_de_fromage = driver.find_elements_by_css_selector("#fromage li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList pleinDeFromage = driver.FindElements(By.CssSelector(“#fromage li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+plein_de_fromage = driver.find_elements(css: "#fromage li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const pleinDeFromage = await driver.findElements(By.css('#fromage li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Stratégie de sélection des éléments
+
+WebDriver possède huit stratégies de localisation pré-définies différentes:
+
+| Sélecteur | Description |
+| ----------------- | ------------------------------------------------------------------------------------------------------ |
+| class name | Localise les éléments dont le nom de la classe contient la valeur recherchée (nom composés non permis) |
+| css selector | Localise les éléments correspondant à un sélecteur CSS |
+| id | Localise les éléments dont l'attribut ID correspond à la valeur recherchée |
+| name | Localise les éléments dont l'attribut NAME correspond à la valeur recherchée |
+| link text | Localise les éléments de type ancre (lien) dont le texte visible correspond à la valeur recherchée |
+| partial link text | Localise les éléments de type ancre (lien) dont le texte visible contient la valeur recherchée |
+| tag name | Localise les éléments dont le nom de tag correspond à la valeur recherchée |
+| xpath | Localise les éléments correspondant à un chemin XPath |
+
+### Astuces d'utilisation des sélecteurs
+
+En règle général, si des ID HTML sont disponibles, uniques et prédictibles avec constance,
+alors il est préférable d'utiliser cette stratégie pour la localisation d'élément sur une page.
+Elle a tendance à être très rapide et évite les longs traitements liés à des traversées complexes du DOM.
+
+Si des IDs uniques ne sont pas disponibles, un sélecteur CSS bien écrit
+est la méthode de localisation la plus adaptée. Un sélecteur XPath marchera
+aussi bien qu'un sélecteur CSS, cependant sa syntaxe est plus complexe, et souvent,
+plus compliquée à débugguer. Même si les sélecteur XPath sont très flexibles,
+ils sont rarement testés d'un point de vue performance par les fournisseurs de navigateur
+et ont donc tendance à être assez lents.
+
+Les stratégies basés sur link text et partial link text sont
+contraingnantes du fait qu'elles ne fonctionnent
+que sur des éléments de type lien hypertexte. De plus, elles
+sont implémentées au sein de WebDriver via des sélecteurs XPath.
+
+Le nom de tag est une façon dangereuse de localiser des éléments.
+Il y a fréquemment de multiples éléments ayant le même tag sur une page.
+Cette stratégie est principalement utile lorsque utilisée avec la méthode
+_findElements(By)_, renvoyant une collection des élements.
+
+Au final, la recommendation est de garder ses sélecteurs aussi compacts et lisibles que possible.
+Demander à WebDriver de traverser la structure du DOM est une opération très coûteuse,
+de fait plus le scope de recherche sera restreint, meilleures seront les performances.
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.ja.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.ja.md
new file mode 100644
index 00000000000..442af7ca3e9
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.ja.md
@@ -0,0 +1,191 @@
+---
+title: "Locating elements"
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+### Locating one element
+
+One of the most fundamental techniques to learn when using WebDriver is
+how to find elements on the page. WebDriver offers a number of built-in selector
+types, amongst them finding an element by its ID attribute:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As seen in the example, locating elements in WebDriver is done on the
+`WebDriver` instance object. The `findElement(By)` method returns
+another fundamental object type, the `WebElement`.
+
+* `WebDriver` represents the browser
+* `WebElement` represents a particular DOM node
+ (a control, e.g. a link or input field, etc.)
+
+Once you have a reference to a web element that's been “found”,
+you can narrow the scope of your search
+by using the same call on that object instance:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+WebElement cheddar = cheese.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheese = driver.find_element_by_id("cheese")
+cheddar = cheese.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement cheese = driver.FindElement(By.Id("cheese"));
+IWebElement cheddar = cheese.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+cheese = driver.find_element(id: "cheese")
+cheddar = cheese.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+const cheddar = await cheese.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can do this because both the _WebDriver_ and _WebElement_ types
+implement the [_SearchContext_](//seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext)
+interface. In WebDriver, this is known as a _role-based interface_.
+Role-based interfaces allow you to determine whether a particular
+driver implementation supports a given feature. These interfaces are
+clearly defined and try to adhere to having only a single role of
+responsibility. You can read more about WebDriver's design and what
+roles are supported in which drivers in the [Some Other Section Which
+Must Be Named](#).
+
+
+Consequently, the _By_ interface used above also supports a
+number of additional locator strategies. A nested lookup might not be
+the most effective cheese location strategy since it requires two
+separate commands to be issued to the browser; first searching the DOM
+for an element with ID “cheese”, then a search for “cheddar” in a
+narrowed context.
+
+To improve the performance slightly, we should try to use a more
+specific locator: WebDriver supports looking up elements
+by CSS locators, allowing us to combine the two previous locators into
+one search:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#cheese #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Locating multiple elements
+
+It's possible that the document we are working with may turn out to have an
+ordered list of the cheese we like the best:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+
+Since more cheese is undisputably better, and it would be cumbersome
+to have to retrieve each of the items individually, a superior
+technique for retrieving cheese is to make use of the pluralized
+version `findElements(By)`. This method returns a collection of web
+elements. If only one element is found, it will still return a
+collection (of one element). If no elements match the locator, an
+empty list will be returned.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList muchoCheese = driver.FindElements(By.CssSelector(“#cheese li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const muchoCheese = await driver.findElements(By.css('#cheese li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Element selection strategies
+
+There are eight different built-in element location strategies in WebDriver:
+
+| Locator | Description |
+| -------- | ---------- |
+| class name | Locates elements whose class name contains the search value (compound class names are not permitted) |
+| css selector | Locates elements matching a CSS selector |
+| id | Locates elements whose ID attribute matches the search value |
+| name | Locates elements whose NAME attribute matches the search value |
+| link text | Locates anchor elements whose visible text matches the search value |
+| partial link text | Locates anchor elements whose visible text matches the search value |
+| tag name | Locates elements whose tag name matches the search value |
+| xpath | Locates elements matching an XPath expression |
+
+### Tips on using selectors
+
+In general, if HTML IDs are available, unique, and consistently
+predictable, they are the preferred method for locating an element on
+a page. They tend to work very quickly, and forego much processing
+that comes with complicated DOM traversals.
+
+If unique IDs are unavailable, a well-written CSS selector is the
+preferred method of locating an element. XPath works as well as CSS
+selectors, but the syntax is complicated and frequently difficult to
+debug. Though XPath selectors are very flexible, they're typically
+not performance tested by browser vendors and tend to be quite slow.
+
+Selection strategies based on link text and partial link text have
+drawbacks in that they only work on link elements. Additionally, they
+call down to XPath selectors internally in WebDriver.
+
+Tag name can be a dangerous way to locate elements. There are
+frequently multiple elements of the same tag present on the page.
+This is mostly useful when calling the _findElements(By)_ method which
+returns a collection of elements.
+
+The recommendation is to keep your locators as compact and
+readable as possible. Asking WebDriver to traverse the DOM structure
+is an expensive operation, and the more you can narrow the scope of
+your search, the better.
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.nl.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.nl.md
new file mode 100644
index 00000000000..ccd09c077e5
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.nl.md
@@ -0,0 +1,195 @@
+---
+title: "Localisatie van elementen"
+weight: 3
+---
+
+{{% notice info %}}
+### Localisatie van elementen
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+### Localisatie van elementen
+
+Een van de meest fundamentele technieken die nodig zijn om WebDriver onder
+de knie te krijgen, is het lokaliseren van elementen op een pagina.
+WebDriver beschikt over een aantal ingebouwde selector types, een van hen
+is het lokaliseren van een element op basis van zijn ID:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+In het bovenstaande voorbeeld kan je zien dat het lokaliseren van de elementen
+gedaan word op een instantie van het `WebDriver` object. De methode
+`findElement(By)` geeft een ander fundamenteel object type terug: `WebElement`.
+
+* `WebDriver` stelt de browser voor
+* `WebElement` stelt een bepaalde DOM node voor (een link, input veld etc)
+
+Wanneer een web element gevonden is, kan je op basis van dat element een nieuwe
+opzoeking starten. Deze zal dan binnen de scope van het gevonden element gedaan
+worden:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+WebElement cheddar = cheese.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheese = driver.find_element_by_id("cheese")
+cheddar = cheese.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement cheese = driver.FindElement(By.Id("cheese"));
+IWebElement cheddar = cheese.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+cheese = driver.find_element(id: "cheese")
+cheddar = cheese.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+const cheddar = await cheese.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Dit is mogelijk omdat zowel _WebDriver_ als _WebElement_ de [_SearchContext_](//seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext)
+interface implementeren. Binnen WebDriver staat dit bekend als een _role-based interface_.
+
+
+. In WebDriver, this is known as a _role-based interface_.
+Role-based interfaces allow you to determine whether a particular
+driver implementation supports a given feature. These interfaces are
+clearly defined and try to adhere to having only a single role of
+responsibility. You can read more about WebDriver's design and what
+roles are supported in which drivers in the [Some Other Section Which
+Must Be Named](#).
+
+
+Consequently, the _By_ interface used above also supports a
+number of additional locator strategies. A nested lookup might not be
+the most effective cheese location strategy since it requires two
+separate commands to be issued to the browser; first searching the DOM
+for an element with ID “cheese”, then a search for “cheddar” in a
+narrowed context.
+
+To improve the performance slightly, we should try to use a more
+specific locator: WebDriver supports looking up elements
+by CSS locators, allowing us to combine the two previous locators into
+one search:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#cheese #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Locating multiple elements
+
+It's possible that the document we are working with may turn out to have an
+ordered list of the cheese we like the best:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+
+Since more cheese is undisputably better, and it would be cumbersome
+to have to retrieve each of the items individually, a superior
+technique for retrieving cheese is to make use of the pluralized
+version `findElements(By)`. This method returns a collection of web
+elements. If only one element is found, it will still return a
+collection (of one element). If no elements match the locator, an
+empty list will be returned.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList muchoCheese = driver.FindElements(By.CssSelector(“#cheese li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const muchoCheese = await driver.findElements(By.css('#cheese li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Element selection strategies
+
+There are eight different built-in element location strategies in WebDriver:
+
+| Locator | Description |
+| -------- | ---------- |
+| class name | Locates elements whose class name contains the search value (compound class names are not permitted) |
+| css selector | Locates elements matching a CSS selector |
+| id | Locates elements whose ID attribute matches the search value |
+| name | Locates elements whose NAME attribute matches the search value |
+| link text | Locates anchor elements whose visible text matches the search value |
+| partial link text | Locates anchor elements whose visible text matches the search value |
+| tag name | Locates elements whose tag name matches the search value |
+| xpath | Locates elements matching an XPath expression |
+
+### Tips on using selectors
+
+In general, if HTML IDs are available, unique, and consistently
+predictable, they are the preferred method for locating an element on
+a page. They tend to work very quickly, and forego much processing
+that comes with complicated DOM traversals.
+
+If unique IDs are unavailable, a well-written CSS selector is the
+preferred method of locating an element. XPath works as well as CSS
+selectors, but the syntax is complicated and frequently difficult to
+debug. Though XPath selectors are very flexible, they're typically
+not performance tested by browser vendors and tend to be quite slow.
+
+Selection strategies based on link text and partial link text have
+drawbacks in that they only work on link elements. Additionally, they
+call down to XPath selectors internally in WebDriver.
+
+Tag name can be a dangerous way to locate elements. There are
+frequently multiple elements of the same tag present on the page.
+This is mostly useful when calling the _findElements(By)_ method which
+returns a collection of elements.
+
+The recommendation is to keep your locators as compact and
+readable as possible. Asking WebDriver to traverse the DOM structure
+is an expensive operation, and the more you can narrow the scope of
+your search, the better.
diff --git a/docs_source_files/content/getting_started_with_webdriver/locating_elements.zh-cn.md b/docs_source_files/content/getting_started_with_webdriver/locating_elements.zh-cn.md
new file mode 100644
index 00000000000..89af9892e2a
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/locating_elements.zh-cn.md
@@ -0,0 +1,191 @@
+---
+title: "Locating elements"
+weight: 3
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+### Locating one element
+
+One of the most fundamental techniques to learn when using WebDriver is
+how to find elements on the page. WebDriver offers a number of built-in selector
+types, amongst them finding an element by its ID attribute:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_id("cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement element = driver.FindElement(By.Id("cheese"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(id: "cheese")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As seen in the example, locating elements in WebDriver is done on the
+`WebDriver` instance object. The `findElement(By)` method returns
+another fundamental object type, the `WebElement`.
+
+* `WebDriver` represents the browser
+* `WebElement` represents a particular DOM node
+ (a control, e.g. a link or input field, etc.)
+
+Once you have a reference to a web element that's been “found”,
+you can narrow the scope of your search
+by using the same call on that object instance:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement cheese = driver.findElement(By.id("cheese"));
+WebElement cheddar = cheese.findElement(By.id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheese = driver.find_element_by_id("cheese")
+cheddar = cheese.find_elements_by_id("cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement cheese = driver.FindElement(By.Id("cheese"));
+IWebElement cheddar = cheese.FindElement(By.Id("cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+cheese = driver.find_element(id: "cheese")
+cheddar = cheese.find_elements(id: "cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheese = await driver.findElement(By.id('cheese'));
+const cheddar = await cheese.findElement(By.id('cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can do this because both the _WebDriver_ and _WebElement_ types
+implement the [_SearchContext_](//seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/SearchContext.html>SearchContext)
+interface. In WebDriver, this is known as a _role-based interface_.
+Role-based interfaces allow you to determine whether a particular
+driver implementation supports a given feature. These interfaces are
+clearly defined and try to adhere to having only a single role of
+responsibility. You can read more about WebDriver's design and what
+roles are supported in which drivers in the [Some Other Section Which
+Must Be Named](#).
+
+
+Consequently, the _By_ interface used above also supports a
+number of additional locator strategies. A nested lookup might not be
+the most effective cheese location strategy since it requires two
+separate commands to be issued to the browser; first searching the DOM
+for an element with ID “cheese”, then a search for “cheddar” in a
+narrowed context.
+
+To improve the performance slightly, we should try to use a more
+specific locator: WebDriver supports looking up elements
+by CSS locators, allowing us to combine the two previous locators into
+one search:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+cheddar = driver.find_element_by_css_selector("#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("#cheese #cheddar"));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese #cheddar")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const cheddar = await driver.findElement(By.css('#cheese #cheddar'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Locating multiple elements
+
+It's possible that the document we are working with may turn out to have an
+ordered list of the cheese we like the best:
+
+```html
+
+
…
+
…
+
…
+
…
+
+```
+
+Since more cheese is undisputably better, and it would be cumbersome
+to have to retrieve each of the items individually, a superior
+technique for retrieving cheese is to make use of the pluralized
+version `findElements(By)`. This method returns a collection of web
+elements. If only one element is found, it will still return a
+collection (of one element). If no elements match the locator, an
+empty list will be returned.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+List muchoCheese = driver.findElements(By.cssSelector("#cheese li"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IReadOnlyList muchoCheese = driver.FindElements(By.CssSelector(“#cheese li”));
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+mucho_cheese = driver.find_elements(css: "#cheese li")
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const muchoCheese = await driver.findElements(By.css('#cheese li'));
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Element selection strategies
+
+There are eight different built-in element location strategies in WebDriver:
+
+| Locator | Description |
+| -------- | ---------- |
+| class name | Locates elements whose class name contains the search value (compound class names are not permitted) |
+| css selector | Locates elements matching a CSS selector |
+| id | Locates elements whose ID attribute matches the search value |
+| name | Locates elements whose NAME attribute matches the search value |
+| link text | Locates anchor elements whose visible text matches the search value |
+| partial link text | Locates anchor elements whose visible text matches the search value |
+| tag name | Locates elements whose tag name matches the search value |
+| xpath | Locates elements matching an XPath expression |
+
+### Tips on using selectors
+
+In general, if HTML IDs are available, unique, and consistently
+predictable, they are the preferred method for locating an element on
+a page. They tend to work very quickly, and forego much processing
+that comes with complicated DOM traversals.
+
+If unique IDs are unavailable, a well-written CSS selector is the
+preferred method of locating an element. XPath works as well as CSS
+selectors, but the syntax is complicated and frequently difficult to
+debug. Though XPath selectors are very flexible, they're typically
+not performance tested by browser vendors and tend to be quite slow.
+
+Selection strategies based on link text and partial link text have
+drawbacks in that they only work on link elements. Additionally, they
+call down to XPath selectors internally in WebDriver.
+
+Tag name can be a dangerous way to locate elements. There are
+frequently multiple elements of the same tag present on the page.
+This is mostly useful when calling the _findElements(By)_ method which
+returns a collection of elements.
+
+The recommendation is to keep your locators as compact and
+readable as possible. Asking WebDriver to traverse the DOM structure
+is an expensive operation, and the more you can narrow the scope of
+your search, the better.
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.en.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.en.md
new file mode 100644
index 00000000000..5f3e069b251
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.en.md
@@ -0,0 +1,86 @@
+---
+title: "Performing actions on the AUT*"
+weight: 4
+---
+
+You can set an element's text using the sendKeys method as follows:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Some web applications use JavaScript libraries to add drag-and-drop
+functionality. The following is a basic example of dragging one
+element onto another element:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Clicking on an element
+
+You can click on an element using the click method:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT**: Application under test
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.es.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.es.md
new file mode 100644
index 00000000000..81ae6807349
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.es.md
@@ -0,0 +1,85 @@
+---
+title: "Ejecutando acciones en la AUT*"
+weight: 4
+---
+
+
+Puede establecer el texto de un elemento utilizando el método sendKeys de la siguiente manera:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Algunas aplicaciones web usan bibliotecas JavaScript para agregar la funcionalidad de arrastrar y soltar. El siguiente es un ejemplo básico de arrastrar un elemento a otro elemento:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Al hacer clic en un elemento
+
+Puede hacer clic en un elemento utilizando el método de clic:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT**: Aplicación bajo pruebas (Application under test en inglés)
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.fr.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.fr.md
new file mode 100644
index 00000000000..a1ef6d59bd2
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.fr.md
@@ -0,0 +1,86 @@
+---
+title: "Réaliser des action sur l'AUT*"
+weight: 4
+---
+
+Il est possible de renseigner le texte d'un élément web grâce à la méthode _sendKeys_, comme suit:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Certaines applications web utilisent des librairies Javascript pour ajouter
+des fonctionnalités de drag-and-drop. Suit un exemple basique permettant de
+dragger un élément sur un autre :
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Cliquer sur un élément
+
+Il est possible de cliquer sur un élément en utilisant la méhode _click_:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT***: Application testée (Application under test en anglais)
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.ja.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.ja.md
new file mode 100644
index 00000000000..d11b6d31577
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.ja.md
@@ -0,0 +1,91 @@
+---
+title: "Performing actions on the AUT*"
+weight: 4
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+You can set an element's text using the sendKeys method as follows:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Some web applications use JavaScript libraries to add drag-and-drop
+functionality. The following is a basic example of dragging one
+element onto another element:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Clicking on an element
+
+You can click on an element using the click method:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT**: Application under test
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.nl.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.nl.md
new file mode 100644
index 00000000000..80be51ff439
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.nl.md
@@ -0,0 +1,86 @@
+---
+title: "Acties op de AUT*"
+weight: 4
+---
+
+Je kan de tekst van een element invullen aan de hand van de sendKeys methode:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sommige applicaties gebruiken Javascript libraries om drag-en-drop
+functionaliteit toe te voegen. Hieronder vind je een simpel voorbeeld
+waarbij een element versleept word naar een ander element:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Op een element klikken
+
+Je kan op een element klikken door middel van de click methode:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT**: Application under test
diff --git a/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.zh-cn.md b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.zh-cn.md
new file mode 100644
index 00000000000..c9ec14305a8
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/performing_actions_on_the_aut.zh-cn.md
@@ -0,0 +1,91 @@
+---
+title: "Performing actions on the AUT*"
+weight: 4
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+You can set an element's text using the sendKeys method as follows:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+String name = "Charles";
+driver.findElement(By.name("name")).sendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+name = "Charles"
+driver.find_element_by_name("name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+string name = "Charles";
+driver.FindElement(By.Name("name")).SendKeys(name);
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+name = "Charles"
+driver.find_element(name: "name").send_keys(name)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const name = "Charles";
+await driver.findElement(By.name('name')).sendKeys(name);
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Some web applications use JavaScript libraries to add drag-and-drop
+functionality. The following is a basic example of dragging one
+element onto another element:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement source = driver.findElement(By.id("source"));
+WebElement target = driver.findElement(By.id("target"));
+new Actions(driver).dragAndDrop(source, target).build().perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+source = driver.find_element_by_id("source")
+target = driver.find_element_by_id("target")
+ActionChains(driver).drag_and_drop(source, target).perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+IWebElement source = driver.FindElement(By.Id("source"));
+IWebElement target = driver.FindElement(By.Id("target"));
+new Actions(driver).DragAndDrop(source, target).Build().Perform();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+source = driver.find_element(id: "source")
+target = driver.find_element(id: "target")
+driver.action.drag_and_drop(source, target).perform
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+const actions = driver.actions({bridge: true});
+const source = await driver.findElement(By.id('source'));
+const target = await driver.findElement(By.id('target'));
+await actions.dragAndDrop(source, target).perform();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+### Clicking on an element
+
+You can click on an element using the click method:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.findElement(By.cssSelector("input[type='submit']")).click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+driver.find_element_by_css_selector("input[type='submit']").click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+driver.FindElement(By.CssSelector("input[type='submit']")).Click();
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+driver.find_element(css: "input[type='submit']").click
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+await driver.findElement(By.css("input[type='submit']")).click();
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+***AUT**: Application under test
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.en.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.en.md
new file mode 100644
index 00000000000..a081ef89ca6
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.en.md
@@ -0,0 +1,21 @@
+---
+title: "Third party drivers and plugins"
+weight: 2
+---
+
+Selenium can be extended through the use of plugins. Here are a number of
+plugins created and maintained by third parties. For more information on how
+to create your own plugin or have it listed, consult the docs.
+
+Please note that these plugins are not supported, maintained, hosted, or
+endorsed by the Selenium project. In addition, be advised that the plugins
+listed below are not necessarily licensed under the Apache License v.2.0.
+Some of the plugins are available under another free and open source software
+license; others are only available under a proprietary license. Any questions
+about plugins and their license of distribution need to be raised with their
+respective developer(s).
+
+| Browser | Latest version | Changelog | Issues | Wiki |
+| -------- | ---------- | ---------- | ---------- | ---------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver)
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.es.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.es.md
new file mode 100644
index 00000000000..fbb7b6a56ba
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.es.md
@@ -0,0 +1,14 @@
+---
+title: "Controladores de otros fabricantes y plugins"
+weight: 2
+---
+
+
+El Selenium se puede ampliar o extender mediante el uso de complementos (_plugins_). Aquí hay una serie de complementos creados y mantenidos por terceros. Para obtener más información sobre cómo crear su propio complemento o tenerlo en la lista, consulte los documentos.
+
+Tenga en cuenta que estos complementos no son compatibles, mantenidos, alojados o respaldados por el proyecto Selenium. Además, tenga en cuenta que los complementos que se enumeran a continuación no están necesariamente autorizados bajo la licencia Apache v.2.0. Algunos de los complementos están disponibles bajo otra licencia de software libre y de código abierto; otros solo están disponibles bajo una licencia patentada. Cualquier pregunta sobre los complementos y su licencia de distribución debe plantearse con sus respectivos desarrolladores.
+
+| Navegador | Versión reciente | Control de cambios | Hallazgos | Documentación |
+| -------- | ---------- | ---------- | ---------- | ---------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver)
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.fr.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.fr.md
new file mode 100644
index 00000000000..ee7185788e9
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.fr.md
@@ -0,0 +1,26 @@
+---
+title: "Driver tiers et plugins"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium peut être étendu à travers l'utilisation de plugins. Vous trouverez
+ici un certain nombre de plugins créés et maintenus par des tierces parties.
+Pour de plus amples information sur la création de plugin ou pour en ajouter à la liste,
+consultez la documentation.
+
+Veuillez noter que ces plugins ne sont pas supportés, maintenus ou hébergés par le projet Selenium.
+De plus, soyez avertis que les plugins listés ci-dessous ne sont pas nécessairement sous Apache License v.2.0.
+Certains de ces plugins sont disponibles sous une autre licence libre et gratuite; d'autres ne sont disponibles
+que sous licence propriétaire. Toute question à propos de ces plugins et de leur licence de distribution
+doit être évoquée avec leur(s) développeur(s) respectif.
+
+| Navigateur | Dernière version | Changelog | Issues | Wiki |
+| ---------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver) |
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.ja.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.ja.md
new file mode 100644
index 00000000000..5bbb8b6ffe1
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.ja.md
@@ -0,0 +1,25 @@
+---
+title: "Third party drivers and plugins"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Selenium can be extended through the use of plugins. Here are a number of
+plugins created and maintained by third parties. For more information on how
+to create your own plugin or have it listed, consult the docs.
+
+Please note that these plugins are not supported, maintained, hosted, or
+endorsed by the Selenium project. In addition, be advised that the plugins
+listed below are not necessarily licensed under the Apache License v.2.0.
+Some of the plugins are available under another free and open source software
+license; others are only available under a proprietary license. Any questions
+about plugins and their license of distribution need to be raised with their
+respective developer(s).
+
+| Browser | Latest version | Changelog | Issues | Wiki |
+| -------- | ---------- | ---------- | ---------- | ---------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver)
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.nl.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.nl.md
new file mode 100644
index 00000000000..ee7241d4a0f
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.nl.md
@@ -0,0 +1,20 @@
+---
+title: "Externe drivers en plugins"
+weight: 2
+---
+
+Selenium ondersteunt externe plugins. Hieronder vind je plugins die ontwikkeld
+zijn en onderhouden worden door externe partijen. Meer informatie omtrent
+het ontwikkelen van je eigen plugin of het publiceren ervan kan je de documentatie
+raadplegen.
+
+Deze plugins worden niet ondersteund, onderhouden, gehost of aanbevolen door
+het Selenium project. De plugins die hieronder opgelijst staan, dragen niet altijd
+de Apache License v2.0. Sommige plugins vallen onder een andere gratis of open source
+licentie; anderen zijn enkel beschikbaar onder patent. Vragen in verband met licenties
+van plugins dienen gericht te worden aan de respectievelijke ontwikkelaars.
+
+| Browser | Laatste versie | Changelog | Problemen | Wiki |
+| -------- | ---------- | ---------- | ---------- | ---------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver)
+
diff --git a/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.zh-cn.md b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.zh-cn.md
new file mode 100644
index 00000000000..86644906f4d
--- /dev/null
+++ b/docs_source_files/content/getting_started_with_webdriver/third_party_drivers_and_plugins.zh-cn.md
@@ -0,0 +1,26 @@
+---
+title: "Third party drivers and plugins"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Selenium can be extended through the use of plugins. Here are a number of
+plugins created and maintained by third parties. For more information on how
+to create your own plugin or have it listed, consult the docs.
+
+Please note that these plugins are not supported, maintained, hosted, or
+endorsed by the Selenium project. In addition, be advised that the plugins
+listed below are not necessarily licensed under the Apache License v.2.0.
+Some of the plugins are available under another free and open source software
+license; others are only available under a proprietary license. Any questions
+about plugins and their license of distribution need to be raised with their
+respective developer(s).
+
+| Browser | Latest version | Changelog | Issues | Wiki |
+| -------- | ---------- | ---------- | ---------- | ---------- |
+| [Google ChromeDriver](//sites.google.com/a/chromium.org/chromedriver/) | [2.29](//chromedriver.storage.googleapis.com/index.html) | [changelog](//chromedriver.storage.googleapis.com/2.29/notes.txt) | [issues](//bugs.chromium.org/p/chromedriver/issues/list) | [wiki](//github.com/SeleniumHQ/selenium/wiki/ChromeDriver)
+
diff --git a/docs_source_files/content/grid/_index.en.md b/docs_source_files/content/grid/_index.en.md
new file mode 100644
index 00000000000..dc2e63095e8
--- /dev/null
+++ b/docs_source_files/content/grid/_index.en.md
@@ -0,0 +1,27 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+# Grid
+
+_Selenium Grid_ is a smart proxy server
+that allows Selenium tests to route commands to remote web browser instances.
+Its aim is to provide an easy way to run tests in parallel on multiple machines.
+
+With Selenium Grid,
+one server acts as the hub that routes JSON formatted test commands
+to one or more registered Grid nodes.
+Tests contact the hub to obtain access to remote browser instances.
+The hub has a list of registered servers that it provides access to,
+and allows control of these instances.
+
+Selenium Grid allows us to run tests in parallel on multiple machines,
+and to manage different browser versions and browser configurations centrally
+(instead of in each individual test).
+
+Selenium Grid is not a silver bullet.
+It solves a subset of common delegation and distribution problems,
+but will for example not manage your infrastructure,
+and might not suit your specific needs.
diff --git a/docs_source_files/content/grid/_index.es.md b/docs_source_files/content/grid/_index.es.md
new file mode 100644
index 00000000000..c3350abc25d
--- /dev/null
+++ b/docs_source_files/content/grid/_index.es.md
@@ -0,0 +1,17 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+
+# Grid
+
+_Selenium Grid_ es un servidor proxy inteligente que permite que las pruebas de Selenium enruten comandos a instancias remotas del navegador web. Su objetivo es proporcionar una manera fácil de ejecutar pruebas en paralelo en múltiples máquinas.
+
+Con Selenium Grid, un servidor actúa como el centro que enruta los comandos de prueba con formato JSON a uno o más nodos de Grid registrados. Las pruebas se ponen en contacto con el concentrador (o _hub_) para obtener acceso a instancias de explorador remoto. El concentrador tiene una lista de servidores registrados a los que proporciona acceso y nos permite controlar estas instancias.
+
+Selenium Grid nos permite ejecutar pruebas en paralelo en múltiples máquinas, y administrar diferentes versiones y configuraciones de navegador de forma centralizada (en lugar de en cada prueba individual).
+
+Selenium Grid no es una solución mágica para todas las situaciones. Resuelve un subconjunto de problemas comunes de delegación y distribución, pero, por ejemplo, no administrará su infraestructura y podría no satisfacer algunas de sus necesidades específicas.
+
diff --git a/docs_source_files/content/grid/_index.fr.md b/docs_source_files/content/grid/_index.fr.md
new file mode 100644
index 00000000000..6bc9f188367
--- /dev/null
+++ b/docs_source_files/content/grid/_index.fr.md
@@ -0,0 +1,33 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Grid
+
+_Selenium Grid_ is a smart proxy server
+that allows Selenium tests to route commands to remote web browser instances.
+Its aim is to provide an easy way to run tests in parallel on multiple machines.
+
+With Selenium Grid,
+one server acts as the hub that routes JSON formatted test commands
+to one or more registered Grid nodes.
+Tests contact the hub to obtain access to remote browser instances.
+The hub has a list of registered servers that it provides access to,
+and allows us to control these instances.
+
+Selenium Grid allows us to run tests in parallel on multiple machines,
+and to manage different browser versions and browser configurations centrally
+(instead of in each individual test).
+
+Selenium Grid isn't a silver bullet.
+It solves a subset of common delegation and distribution problems,
+but will for example not manage your infrastructure
+and might not suit your specific needs.
diff --git a/docs_source_files/content/grid/_index.ja.md b/docs_source_files/content/grid/_index.ja.md
new file mode 100644
index 00000000000..031fecb9894
--- /dev/null
+++ b/docs_source_files/content/grid/_index.ja.md
@@ -0,0 +1,32 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Grid
+
+_Selenium Grid_ is a smart proxy server
+that allows Selenium tests to route commands to remote web browser instances.
+Its aim is to provide an easy way to run tests in parallel on multiple machines.
+
+With Selenium Grid,
+one server acts as the hub that routes JSON formatted test commands
+to one or more registered Grid nodes.
+Tests contact the hub to obtain access to remote browser instances.
+The hub has a list of registered servers that it provides access to,
+and allows us to control these instances.
+
+Selenium Grid allows us to run tests in parallel on multiple machines,
+and to manage different browser versions and browser configurations centrally
+(instead of in each individual test).
+
+Selenium Grid isn't a silver bullet.
+It solves a subset of common delegation and distribution problems,
+but will for example not manage your infrastructure
+and might not suit your specific needs.
diff --git a/docs_source_files/content/grid/_index.nl.md b/docs_source_files/content/grid/_index.nl.md
new file mode 100644
index 00000000000..7ac3f23b11b
--- /dev/null
+++ b/docs_source_files/content/grid/_index.nl.md
@@ -0,0 +1,33 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Grid
+
+_Selenium Grid_ is a smart proxy server
+that allows Selenium tests to route commands to remote web browser instances.
+Its aim is to provide an easy way to run tests in parallel on multiple machines.
+
+With Selenium Grid,
+one server acts as the hub that routes JSON formatted test commands
+to one or more registered Grid nodes.
+Tests contact the hub to obtain access to remote browser instances.
+The hub has a list of registered servers that it provides access to,
+and allows us to control these instances.
+
+Selenium Grid allows us to run tests in parallel on multiple machines,
+and to manage different browser versions and browser configurations centrally
+(instead of in each individual test).
+
+Selenium Grid isn't a silver bullet.
+It solves a subset of common delegation and distribution problems,
+but will for example not manage your infrastructure
+and might not suit your specific needs.
diff --git a/docs_source_files/content/grid/_index.zh-cn.md b/docs_source_files/content/grid/_index.zh-cn.md
new file mode 100644
index 00000000000..c7d882a9819
--- /dev/null
+++ b/docs_source_files/content/grid/_index.zh-cn.md
@@ -0,0 +1,32 @@
+---
+title: "Grid"
+chapter: true
+weight: 9
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+# Grid
+
+_Selenium Grid_ is a smart proxy server
+that allows Selenium tests to route commands to remote web browser instances.
+Its aim is to provide an easy way to run tests in parallel on multiple machines.
+
+With Selenium Grid,
+one server acts as the hub that routes JSON formatted test commands
+to one or more registered Grid nodes.
+Tests contact the hub to obtain access to remote browser instances.
+The hub has a list of registered servers that it provides access to,
+and allows us to control these instances.
+
+Selenium Grid allows us to run tests in parallel on multiple machines,
+and to manage different browser versions and browser configurations centrally
+(instead of in each individual test).
+
+Selenium Grid isn't a silver bullet.
+It solves a subset of common delegation and distribution problems,
+but will for example not manage your infrastructure
+and might not suit your specific needs.
diff --git a/docs_source_files/content/grid/components_of_a_grid.en.md b/docs_source_files/content/grid/components_of_a_grid.en.md
new file mode 100644
index 00000000000..14295e1ad18
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.en.md
@@ -0,0 +1,34 @@
+---
+title: "Components of a Grid"
+weight: 2
+---
+
+
+
+## Hub
+* Intermediary and manager
+* Accepts requests to run tests
+* Takes instructions from client and executes them remotely on the nodes
+* Manages threads
+
+A _Hub_ is a central point where all your tests are sent.
+Each Selenium Grid consists of exactly one hub. The hub needs to be reachable
+from the respective clients (i.e. CI server, Developer machine etc.)
+The hub will connect one or more nodes
+that tests will be delegated to.
+
+## Nodes
+
+* Where the browsers live
+* Registers itself to the hub and communicates its capabilities
+* Receives requests from the hub and executes them
+
+_Nodes_ are different Selenium instances
+that will execute tests on individual computer systems.
+There can be many nodes in a grid.
+The machines which are nodes do not need to be the same platform
+or have the same browser selection as that of the hub or the other nodes.
+A node on Windows might have the capability of
+offering Internet Explorer as a browser option,
+whereas this wouldn't be possible on Linux or Mac.
+
diff --git a/docs_source_files/content/grid/components_of_a_grid.es.md b/docs_source_files/content/grid/components_of_a_grid.es.md
new file mode 100644
index 00000000000..63917944299
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.es.md
@@ -0,0 +1,25 @@
+---
+title: "Componentes de un Grid"
+weight: 2
+---
+
+
+
+
+
+## Concentrador o _Hub_
+* Intermediario y administrador
+* Acepta solicitudes para ejecutar pruebas
+* Toma instrucciones del cliente y las ejecuta de forma remota en los nodos
+* Administra hilos
+
+Un hub es un punto central al que se envían todas sus pruebas. Cada Selenium Grid consta de un centro exactamente. El concentrador debe ser accesible desde los respectivos clientes (es decir, servidor CI (_Continuos Integration_), máquina del desarrollador, etc.) El concentrador conectará uno o más nodos a los que se delegarán las pruebas.
+
+## Nodos
+
+* Aquí es donde viven los navegadores
+* Se registra en el centro y comunica sus capacidades
+* Recibe solicitudes del hub y las ejecuta
+
+Los "nodos" son instancias diferentes de Selenium que ejecutarán pruebas en sistemas informáticos individuales. Puede haber muchos nodos en una grid. Las máquinas que son nodos no necesitan ser de la misma plataforma o tener la misma selección de navegador que la del concentrador u otros nodos. Un nodo en Windows podría tener la capacidad de ofrecer Internet Explorer como una opción de navegador, mientras que esto no sería posible en Linux o Mac.
+
diff --git a/docs_source_files/content/grid/components_of_a_grid.fr.md b/docs_source_files/content/grid/components_of_a_grid.fr.md
new file mode 100644
index 00000000000..f880a9ef23c
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.fr.md
@@ -0,0 +1,40 @@
+---
+title: "Composant d'une Grid"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+
+
+## Hub
+* Intermediary and manager
+* Accepts requests to run tests
+* Takes instructions from client and executes them remotely on the nodes
+* Manages threads
+
+A _Hub_ is a central point where all your tests are sent to.
+Each Selenium Grid consists of exactly one hub. The hub needs to be reachable
+from the respective clients (i.e. CI server, Developer machine etc.)
+The hub will connect one or more nodes
+that tests will be delegated to.
+
+## Nodes
+
+* This is where the browsers live
+* Registers itself to the hub and communicates its capabilities
+* Receives requests from the hub and executes them
+
+_Nodes_ are different Selenium instances
+that will execute tests on individual computer systems.
+There can be many nodes in a grid.
+The machines which are nodes need do not need to be the same platform
+or have the same browser selection as that of the hub or the other nodes.
+A node on Windows might have the capability of
+offering Internet Explorer as a browser option,
+whereas this wouldn't be possible on Linux or Mac.
+
diff --git a/docs_source_files/content/grid/components_of_a_grid.ja.md b/docs_source_files/content/grid/components_of_a_grid.ja.md
new file mode 100644
index 00000000000..940aa3a8f11
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.ja.md
@@ -0,0 +1,38 @@
+---
+title: "Components of a Grid"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+
+
+## Hub
+* Intermediary and manager
+* Accepts requests to run tests
+* Takes instructions from client and executes them remotely on the nodes
+* Manages threads
+
+A _Hub_ is a central point where all your tests are sent to.
+Each Selenium Grid consists of exactly one hub. The hub needs to be reachable
+from the respective clients (i.e. CI server, Developer machine etc.)
+The hub will connect one or more nodes
+that tests will be delegated to.
+
+## Nodes
+
+* This is where the browsers live
+* Registers itself to the hub and communicates its capabilities
+* Receives requests from the hub and executes them
+
+_Nodes_ are different Selenium instances
+that will execute tests on individual computer systems.
+There can be many nodes in a grid.
+The machines which are nodes need do not need to be the same platform
+or have the same browser selection as that of the hub or the other nodes.
+A node on Windows might have the capability of
+offering Internet Explorer as a browser option,
+whereas this wouldn't be possible on Linux or Mac.
diff --git a/docs_source_files/content/grid/components_of_a_grid.nl.md b/docs_source_files/content/grid/components_of_a_grid.nl.md
new file mode 100644
index 00000000000..c33e7ecdb9e
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.nl.md
@@ -0,0 +1,40 @@
+---
+title: "Components of a Grid"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+
+
+## Hub
+* Intermediary and manager
+* Accepts requests to run tests
+* Takes instructions from client and executes them remotely on the nodes
+* Manages threads
+
+A _Hub_ is a central point where all your tests are sent to.
+Each Selenium Grid consists of exactly one hub. The hub needs to be reachable
+from the respective clients (i.e. CI server, Developer machine etc.)
+The hub will connect one or more nodes
+that tests will be delegated to.
+
+## Nodes
+
+* This is where the browsers live
+* Registers itself to the hub and communicates its capabilities
+* Receives requests from the hub and executes them
+
+_Nodes_ are different Selenium instances
+that will execute tests on individual computer systems.
+There can be many nodes in a grid.
+The machines which are nodes need do not need to be the same platform
+or have the same browser selection as that of the hub or the other nodes.
+A node on Windows might have the capability of
+offering Internet Explorer as a browser option,
+whereas this wouldn't be possible on Linux or Mac.
+
diff --git a/docs_source_files/content/grid/components_of_a_grid.zh-cn.md b/docs_source_files/content/grid/components_of_a_grid.zh-cn.md
new file mode 100644
index 00000000000..1da30605130
--- /dev/null
+++ b/docs_source_files/content/grid/components_of_a_grid.zh-cn.md
@@ -0,0 +1,39 @@
+---
+title: "Components of a Grid"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+
+
+## Hub
+* Intermediary and manager
+* Accepts requests to run tests
+* Takes instructions from client and executes them remotely on the nodes
+* Manages threads
+
+A _Hub_ is a central point where all your tests are sent to.
+Each Selenium Grid consists of exactly one hub. The hub needs to be reachable
+from the respective clients (i.e. CI server, Developer machine etc.)
+The hub will connect one or more nodes
+that tests will be delegated to.
+
+## Nodes
+
+* This is where the browsers live
+* Registers itself to the hub and communicates its capabilities
+* Receives requests from the hub and executes them
+
+_Nodes_ are different Selenium instances
+that will execute tests on individual computer systems.
+There can be many nodes in a grid.
+The machines which are nodes need do not need to be the same platform
+or have the same browser selection as that of the hub or the other nodes.
+A node on Windows might have the capability of
+offering Internet Explorer as a browser option,
+whereas this wouldn't be possible on Linux or Mac.
+
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.en.md b/docs_source_files/content/grid/purposes_and_main_functionalities.en.md
new file mode 100644
index 00000000000..248ad2029f7
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.en.md
@@ -0,0 +1,12 @@
+---
+title: "Purposes and main functionalities"
+menuTitle: "Purposes and functionalities"
+weight: 1
+---
+
+* Central entry point for all tests
+* Management and control of the nodes / environment where the browsers run
+* Scaling
+* Running tests in parallel
+* Cross platform testing
+* Load balancing
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.es.md b/docs_source_files/content/grid/purposes_and_main_functionalities.es.md
new file mode 100644
index 00000000000..8656b14729c
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.es.md
@@ -0,0 +1,14 @@
+---
+title: "Propósitos y funcionalidades principales"
+menuTitle: "Propósitos y funcionalidades"
+weight: 1
+---
+
+
+* Punto de entrada central para todas las pruebas
+* Gestión y control de los nodos / entorno donde se ejecutan los navegadores
+* Ejecución de pruebas a gran escala
+* Ejecución de pruebas en paralelo
+* Pruebas de diferentes plataformas (_Cross-platform and cross-browser_)
+* Balanceo de carga
+
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.fr.md b/docs_source_files/content/grid/purposes_and_main_functionalities.fr.md
new file mode 100644
index 00000000000..846db8e1af3
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.fr.md
@@ -0,0 +1,18 @@
+---
+title: "Objectifs et fonctionnalitées"
+menuTitle: "Objectifs et fonctionnalitées"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+* Central entry point for all tests
+* Management and control of the nodes / environment where the browsers run on
+* Scaling
+* Running tests in parallel
+* Cross platform testing
+* Load balancing
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.ja.md b/docs_source_files/content/grid/purposes_and_main_functionalities.ja.md
new file mode 100644
index 00000000000..13a8b01b841
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.ja.md
@@ -0,0 +1,17 @@
+---
+title: "Purposes and main functionalities"
+menuTitle: "Purposes and functionalities"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+* Central entry point for all tests
+* Management and control of the nodes / environment where the browsers run on
+* Scaling
+* Running tests in parallel
+* Cross platform testing
+* Load balancing
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.nl.md b/docs_source_files/content/grid/purposes_and_main_functionalities.nl.md
new file mode 100644
index 00000000000..0b67b750d6f
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.nl.md
@@ -0,0 +1,18 @@
+---
+title: "Purposes and main functionalities"
+menuTitle: "Purposes and functionalities"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+* Central entry point for all tests
+* Management and control of the nodes / environment where the browsers run on
+* Scaling
+* Running tests in parallel
+* Cross platform testing
+* Load balancing
diff --git a/docs_source_files/content/grid/purposes_and_main_functionalities.zh-cn.md b/docs_source_files/content/grid/purposes_and_main_functionalities.zh-cn.md
new file mode 100644
index 00000000000..e63934d6fff
--- /dev/null
+++ b/docs_source_files/content/grid/purposes_and_main_functionalities.zh-cn.md
@@ -0,0 +1,17 @@
+---
+title: "Purposes and main functionalities"
+menuTitle: "Purposes and functionalities"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+* Central entry point for all tests
+* Management and control of the nodes / environment where the browsers run on
+* Scaling
+* Running tests in parallel
+* Cross platform testing
+* Load balancing
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.en.md b/docs_source_files/content/grid/setting_up_your_own_grid.en.md
new file mode 100644
index 00000000000..a7395f09498
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.en.md
@@ -0,0 +1,251 @@
+---
+title: "Setting up your own Grid"
+weight: 3
+---
+
+To use Selenium Grid,
+you need to maintain your own infrastructure for the nodes.
+As this can be a cumbersome and time intense effort,
+many organizations use IaaS providers
+such as Amazon EC2 and Google Compute
+to provide this infrastructure.
+
+Other options include using providers such as Sauce Labs or Testing Bot
+who provide a Selenium Grid as a service in the cloud.
+It is certainly possible to also run nodes on your own hardware.
+This chapter will go into detail about the option of running your own grid,
+complete with its own node infrastructure.
+
+
+## Quick start
+
+This example will show you how to start the Selenium 2 Grid Hub,
+and register both a WebDriver node and a Selenium 1 RC legacy node.
+We will also show you how to call the grid from Java.
+The hub and nodes are shown here running on the same machine,
+but of course you can copy the selenium-server-standalone to multiple machines.
+
+The `selenium-server-standalone` package includes the hub,
+WebDriver, and legacy RC needed to run the Grid,
+_ant_ is not required anymore.
+You can download the `selenium-server-standalone-.jar` from
+[http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Step 1: Start the Hub
+
+The Hub is the central point that will receive test requests
+and distribute them to the right nodes.
+The distribution is done on a capabilities basis,
+meaning a test requiring a set of capabilities
+will only be distributed to nodes offering that set or subset of capabilities.
+
+Because a test's desired capabilities are just what the name implies, _desired_,
+the hub cannot guarantee that it will locate a node
+fully matching the requested desired capabilities set.
+
+Open a command prompt
+and navigate to the directory where you copied
+the `selenium-server-standalone.jar` file.
+You start the hub by passing the `-role hub` flag
+to the standalone server:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+The Hub will listen to port 4444 by default.
+You can view the status of the hub by opening a browser window and navigating to
+[http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+To change the default port,
+you can add the optional `-port` flag
+with an integer representing the port to listen to when you run the command.
+Also, all of the other options you see in the JSON config file (seen below)
+are possible command-line flags.
+
+You certainly can get by with only the simple command shown above,
+but if you need more advanced configuration,
+you can also specify a JSON format config file, for convenience,
+to configure the hub when you start it.
+You can do it like so:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+Below you will see an example of a `hubConfig.json` file.
+We will go into more detail on how to provide node configuration files in step 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Regardless of whether you want to run a grid with new WebDriver functionality,
+or a grid with Selenium 1 RC functionality,
+or both at the same time,
+you use the same `selenium-server-standalone.jar` file to start the nodes:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+If a port is not specified through the `-port` flag,
+a free port will be chosen. You can run multiple nodes on one machine
+but if you do so, you need to be aware of your systems memory resources
+and problems with screenshots if your tests take them.
+
+
+#### Configuration of Node with options
+
+As mentioned, for backwards compatibility
+“wd” and “rc” roles are still a valid subset of the “node” role.
+But those roles limit the types of remote connections to their corresponding API,
+while “node” allows both RC and WebDriver remote connections.
+
+Passing JVM properties (using the `-D` flag
+_before the -jar argument_)
+on the command line as well,
+and these will be picked up and propagated to the nodes:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuration of Node with JSON
+
+You can also start grid nodes that are configured
+with a JSON configuration file
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+And here is an example of a `nodeConfig.json` file:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+A note about the `-host` flag
+
+For both hub and node, if the `-host` flag is not specified,
+`0.0.0.0` will be used by default. This will bind to all the
+public (non-loopback) IPv4 interfaces of the machine. If you have a special
+network configuration or any component that creates extra network interfaces,
+it is advised to set the `-host` flag with a value that allows the
+hub/node to be reachable from a different machine.
+
+#### Specifying the port
+
+The default TCP/IP port used by the hub is 4444. If you need to change the port
+please use above mentioned configurations.
+
+## Troubleshooting
+
+### Using Log file
+For advanced troubleshooting you can specify a log file to log system messages.
+Start Selenium GRID hub or node with -log argument. Please see the below example:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use your favorite text editor to open log file (log.txt in the example above) to find
+"ERROR" logs if you get issues.
+
+### Using `-debug` argument
+
+Also you can use `-debug` argument to print debug logs to console.
+Start Selenium Grid Hub or Node with `-debug` argument. Please see
+the below example:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+## Warning
+
+The Selenium Grid must be protected from external access using appropriate
+firewall permissions.
+
+Failure to protect your Grid could result in one or more of the following occurring:
+
+* You provide open access to your Grid infrastructure
+* You allow third parties to access internal web applications and files
+* You allow third parties to run custom binaries
+
+See this blog post on [Detectify](//labs.detectify.com), which gives a good
+overview of how a publicly exposed Grid could be misused:
+[Don't Leave your Grid Wide Open](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+[Docker](//www.docker.com/) provides a convenient way to
+provision and scale Selenium Grid infrastructure in a unit known as a container.
+Containers are standardised units of software that contain everything required
+to run the desired application, including all dependencies, in a reliable and repeatable
+way on different machines.
+
+The Selenium project maintains a set of Docker images which you can download
+and run to get a working grid up and running quickly. Nodes are available for
+both Firefox and Chrome. Full details of how to provision a grid can be found
+within the [Docker Selenium](//github.com/SeleniumHQ/docker-selenium)
+repository.
+
+### Prerequisite
+The only requirement to run a Grid is to have Docker installed and working.
+[Install Docker](//www.docker.com/products/docker-desktop).
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.es.md b/docs_source_files/content/grid/setting_up_your_own_grid.es.md
new file mode 100644
index 00000000000..965047eba4b
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.es.md
@@ -0,0 +1,178 @@
+---
+title: "Configurando tu propio Grid"
+weight: 3
+---
+
+
+Para usar Selenium Grid, debe mantener su propia infraestructura para los nodos. Como esto puede ser un esfuerzo demandante e intenso, muchas organizaciones utilizan proveedores de IaaS como Amazon EC2 y Google Compute para proporcionar esta infraestructura.
+
+Otras opciones incluyen el uso de proveedores como Sauce Labs o Testing Bot que proporcionan un Selenium Grid como servicio en la nube. Ciertamente, también es posible ejecutar nodos en su infraestructura propia. Este capítulo entrará en detalles sobre la opción de ejecutar su propia grid, de manera completa con su propia infraestructura de nodos.
+
+
+## Inicio rápido
+
+Este ejemplo le mostrará cómo iniciar Selenium 2 Grid Hub y registrar un nodo WebDriver y un nodo heredado Selenium 1 RC. También le mostraremos cómo llamar a la grid desde Java. El concentrador (_hub_) y los nodos se muestran aquí ejecutándose en la misma máquina, pero, por supuesto, puede copiar el servidor independiente de Selenium (_selenium-server-standalone_) en varias máquinas.
+
+El paquete `selenium-server-standalone` incluye el hub, WebDriver y el RC heredado necesario para ejecutar la Grid, _ant_ ya no es necesario. Puede descargar el `selenium-server-standalone-.jar` desde [http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Paso 1: Inicie el Hub
+
+El Hub es el punto central que recibirá las solicitudes de prueba y las distribuirá a los nodos correctos. La distribución se realiza en función de las capacidades, lo que significa que una prueba que requiere un conjunto de capacidades (_capabilities_) solo se distribuirá a los nodos que ofrecen ese conjunto o subconjunto de capacidades.
+
+Debido a que las capacidades deseadas de una prueba son exactamente lo que el nombre implica "deseadas", el concentrador no puede garantizar que localizará un nodo que coincida completamente con el conjunto de capacidades deseadas solicitado.
+
+Abra una consola del sistema y navegue hasta el directorio donde copió el archivo `selenium-server-standalone.jar`. Inicie el concentrador pasando el indicador `-role hub` al servidor independiente:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+El Hub escuchará el puerto 4444 por defecto. Puede ver el estado del concentrador abriendo una ventana del navegador y navegando a [http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+Para cambiar el puerto predeterminado, puede agregar el indicador opcional `-port` con un número entero que representa el puerto para escuchar cuando ejecuta el comando. Además, todas las otras opciones que ve en el archivo de configuración JSON (que se ve a continuación) son posibles indicadores de línea de comandos.
+
+Ciertamente puede hacerlo solo con el comando simple que se muestra arriba, pero si necesita una configuración más avanzada, también puede especificar un archivo de configuración de formato JSON para configurar el concentrador cuando lo inicie. Puede hacerlo así:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+A continuación verá un ejemplo de un archivo `hubConfig.json`. Entraremos en más detalles sobre cómo proporcionar archivos de configuración de nodos en el paso 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Independientemente de si desea ejecutar una grid con la nueva funcionalidad WebDriver, o una grid con la funcionalidad Selenium 1 RC, o ambas al mismo tiempo, utilice el mismo archivo `selenium-server-standalone.jar` para iniciar los nodos:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+Si no se especifica un puerto a través de la argumento `-port`, se elegirá un puerto libre. Puede ejecutar múltiples nodos en una máquina, pero si lo hace, debe conocer los recursos de memoria de su sistema y los problemas con las capturas de pantalla si sus pruebas los toman.
+
+
+#### Configuración de Nodo con opciones
+
+Como se mencionó, para la compatibilidad con versiones anteriores, los roles "wd" y "rc" siguen siendo un subconjunto válido del rol "node". Pero esos roles limitan los tipos de conexiones remotas a su API correspondiente, mientras que "node" permite conexiones remotas RC y WebDriver.
+
+Al pasar las propiedades de JVM (usando el indicador `-D` _antes del argumento -jar_) también en la línea de comando, estas serán recogidas y propagadas a los nodos:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuración de nodo con JSON
+
+También puede iniciar nodos de grid configurados con un archivo de configuración JSON
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+Y este es un ejemplo del archivo `nodeConfig.json`:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+Una nota sobre la argumento `-host`
+
+Tanto para el concentrador como para el nodo, si no se especifica el indicador `-host`, se usará` 0.0.0.0` por defecto. Esto se unirá a todas las interfaces IPv4 públicas (sin loopback) de la máquina. Si tiene una configuración de red especial o algún componente que cree interfaces de red adicionales, se recomienda establecer el indicador `-host` con un valor que permita que se pueda acceder al concentrador / nodo desde una máquina diferente.
+
+#### Especificando el puerto
+
+El puerto TCP / IP predeterminado utilizado por el concentrador es 4444. Si necesita cambiar el puerto, utilice las configuraciones mencionadas anteriormente.
+
+## Solución de problemas
+
+### Uso del archivo de registro
+Para la resolución de problemas avanzada, puede especificar el archivo de registro para almacenar los mensajes del sistema. Para eso, inicie Selenium GRID hub o nodo con el argumento -log. Por favor vea el siguiente ejemplo:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use su editor de texto favorito para abrir el archivo de registro (log.txt en el ejemplo anterior) para encontrar registros de "ERROR" si tiene problemas.
+
+### Usando el argumento `-debug`
+También puede usar el argumento `-debug` para imprimir registros de depuración en la consola. Para eso, inicie Selenium Grid Hub o Node con el argumento `-debug`. Por favor vea el siguiente ejemplo
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+
+## Advertencia
+
+Selenium Grid debe protegerse del acceso externo mediante los permisos de firewall adecuados. Si no protege su Grid, podría ocurrir uno o más de los siguientes casos:
+* Usted proporciona acceso abierto a su infraestructura Grid
+* Permitir que terceros accedan a aplicaciones y archivos web internos
+* Permites que terceros ejecuten binarios personalizados
+
+Consulte esta publicación de blog en [Detectify](//labs.detectify.com) que ofrece una buena visión general de cómo se puede utilizar incorrectamente una grid expuesta públicamente: [Inglés: No deje la grid abierta](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+
+[Docker](//www.docker.com/) proporciona una forma conveniente de aprovisionar y escalar la infraestructura de Selenium Grid en una unidad conocida como contenedor. Los contenedores son unidades de software estandarizadas que contienen todo lo necesario para ejecutar la aplicación deseada, incluidas todas las dependencias de manera confiable y repetible en diferentes máquinas.
+
+El proyecto Selenium mantiene un conjunto de imágenes de Docker que puede descargar y ejecutar para que una grid de trabajo funcione rápidamente. Los nodos están disponibles para Firefox y Chrome. Los detalles completos sobre cómo aprovisionar una grid se pueden encontrar en el repositorio [Docker Selenium](//github.com/SeleniumHQ/docker-selenium).
+
+### Requisito previo
+El único requisito para ejecutar un Grid es tener Docker instalado y funcionando. [Instalar Docker](//www.docker.com/products/docker-desktop).
+
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.fr.md b/docs_source_files/content/grid/setting_up_your_own_grid.fr.md
new file mode 100644
index 00000000000..af62e7e7ee9
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.fr.md
@@ -0,0 +1,256 @@
+---
+title: "Mettre en place votre propre Grid"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+To use Selenium Grid,
+you need to maintain your own infrastructure for the nodes.
+As this can be a cumbersome and time intense effort,
+many organizations use IaaS providers
+such as Amazon EC2 and Google Compute
+to provide this infrastructure.
+
+Other options include using providers such as Sauce Labs or Testing Bot
+who provide a Selenium Grid as a service in the cloud.
+It is certainly possible to also run nodes on your own hardware.
+This chapter will go into detail about the option of running your own grid,
+complete with its own node infrastructure.
+
+
+## Quick start
+
+This example will show you how to start the Selenium 2 Grid Hub,
+and register both a WebDriver node and a Selenium 1 RC legacy node.
+We’ll also show you how to call the grid from Java.
+The hub and nodes are shown here running on the same machine,
+but of course you can copy the selenium-server-standalone to multiple machines.
+
+The `selenium-server-standalone` package includes the hub,
+WebDriver, and legacy RC needed to run the Grid,
+_ant_ is not required anymore.
+You can download the `selenium-server-standalone-.jar` from
+[http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Step 1: Start the Hub
+
+The Hub is the central point that will receive test requests
+and distribute them to the right nodes.
+The distribution is done on a capabilities basis,
+meaning a test requiring a set of capabilities
+will only be distributed to nodes offering that set or subset of capabilities.
+
+Because a test's desired capabilities are just what the name implies, _desired_,
+the hub cannot guarantee that it will locate a node
+fully matching the requested desired capabilities set.
+
+Open a command prompt
+and navigate to the directory where you copied
+the `selenium-server-standalone.jar` file.
+You start the hub by passing the `-role hub` flag
+to the standalone server:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+The Hub will listen to port 4444 by default.
+You can view the status of the hub by opening a browser window and navigating to
+[http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+To change the default port,
+you can add the optional `-port` flag
+with an integer representing the port to listen to when you run the command.
+Also, all of the other options you see in the JSON config file (seen below)
+are possible command-line flags.
+
+You certainly can get by with only the simple command shown above,
+but if you need more advanced configuration,
+then you may also for convenience specify a JSON format config file
+to configure the hub when you start it.
+You can do it like so:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+Below you will see an example of a `hubConfig.json` file.
+We will go into more detail on how to provide node configuration files in step 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Regardless of whether you want to run a grid with new WebDriver functionality,
+or a grid with Selenium 1 RC functionality,
+or both at the same time,
+you use the same `selenium-server-standalone.jar` file to start the nodes:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+If a port is not specified through the `-port` flag,
+a free port will be chosen. You can run multiple nodes on one machine
+but if you do so, you need to be aware of your systems memory resources
+and problems with screenshots if your tests take them.
+
+
+#### Configuration of Node with options
+
+As mentioned, for backwards compatibility
+“wd” and “rc” roles are still a valid subset of the “node” role.
+But those roles limit the types of remote connections to their corresponding API,
+while “node” allows both RC and WebDriver remote connections.
+
+Passing JVM properties (using the `-D` flag
+_before the -jar argument_)
+on the command line as well,
+and these will be picked up and propagated to the nodes:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuration of Node with JSON
+
+You can also start grid nodes that are configured
+with a JSON configuration file
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+And here is an example of a `nodeConfig.json` file:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+A note about the `-host` flag
+
+For both hub and node, if the `-host` flag is not specified,
+`0.0.0.0` will be used by default. This will bind to all the
+public (non-loopback) IPv4 interfaces of the machine. If you have a special
+network configuration or any component that creates extra network interfaces,
+it is advised to set the `-host` flag with a value that allows the
+hub/node to be reachable from a different machine.
+
+#### Specifying the port
+
+The default TCP/IP port used by the hub is 4444. If you need to change the port
+please use above mentioned configurations
+
+## Troubleshooting
+
+### Using Log file
+For advance troubleshooting you can specify log file to log system messages.
+For that start Selenium GRID hub or node with -log argument. Please see the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use your favorite text editor to open log file (log.txt in above example) to find
+"ERROR" logs if you get issues.
+
+### Using `-debug` argument
+
+Also you can use `-debug` argument to print debug logs on console.
+For that start Selenium Grid Hub or Node with `-debug` argument. Please see
+the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+## Warning
+
+The Selenium Grid must be protected from external access using appropriate
+firewall permissions.
+
+Failure to protect your Grid could result in one or more of the following occurring:
+* You provide open access to your Grid infrastructure
+* You allow 3rd parties to access internal web applications and files
+* You allow 3rd parties to run custom binaries
+
+See this blog post on [Detectify](//labs.detectify.com) which gives a good
+overview of how a publicly exposed Grid could be misused:
+[Don't Leave your Grid Wide Open](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+[Docker](//www.docker.com/) provides a convenient way to
+provision and scale Selenium Grid infrastructure in a unit known as a container.
+Containers are standardised units of software that contain everything required
+to run the desired application including all dependencies in a reliable and repeatable
+way on different machines.
+
+The Selenium project maintains a set of Docker images which you can download
+and run to get a working grid up and running quickly. Nodes are available for
+both Firefox and Chrome. Full details of how to provision a grid can be found
+within the [Docker Selenium](//github.com/SeleniumHQ/docker-selenium)
+repository.
+
+### Prerequisite
+The only requirement to run a Grid is to have Docker installed and working.
+[Install Docker](//www.docker.com/products/docker-desktop).
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.ja.md b/docs_source_files/content/grid/setting_up_your_own_grid.ja.md
new file mode 100644
index 00000000000..c9b2fbc2d7a
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.ja.md
@@ -0,0 +1,255 @@
+---
+title: "Setting up your own Grid"
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+To use Selenium Grid,
+you need to maintain your own infrastructure for the nodes.
+As this can be a cumbersome and time intense effort,
+many organizations use IaaS providers
+such as Amazon EC2 and Google Compute
+to provide this infrastructure.
+
+Other options include using providers such as Sauce Labs or Testing Bot
+who provide a Selenium Grid as a service in the cloud.
+It is certainly possible to also run nodes on your own hardware.
+This chapter will go into detail about the option of running your own grid,
+complete with its own node infrastructure.
+
+
+## Quick start
+
+This example will show you how to start the Selenium 2 Grid Hub,
+and register both a WebDriver node and a Selenium 1 RC legacy node.
+We’ll also show you how to call the grid from Java.
+The hub and nodes are shown here running on the same machine,
+but of course you can copy the selenium-server-standalone to multiple machines.
+
+The `selenium-server-standalone` package includes the hub,
+WebDriver, and legacy RC needed to run the Grid,
+_ant_ is not required anymore.
+You can download the `selenium-server-standalone-.jar` from
+[http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Step 1: Start the Hub
+
+The Hub is the central point that will receive test requests
+and distribute them to the right nodes.
+The distribution is done on a capabilities basis,
+meaning a test requiring a set of capabilities
+will only be distributed to nodes offering that set or subset of capabilities.
+
+Because a test's desired capabilities are just what the name implies, _desired_,
+the hub cannot guarantee that it will locate a node
+fully matching the requested desired capabilities set.
+
+Open a command prompt
+and navigate to the directory where you copied
+the `selenium-server-standalone.jar` file.
+You start the hub by passing the `-role hub` flag
+to the standalone server:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+The Hub will listen to port 4444 by default.
+You can view the status of the hub by opening a browser window and navigating to
+[http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+To change the default port,
+you can add the optional `-port` flag
+with an integer representing the port to listen to when you run the command.
+Also, all of the other options you see in the JSON config file (seen below)
+are possible command-line flags.
+
+You certainly can get by with only the simple command shown above,
+but if you need more advanced configuration,
+then you may also for convenience specify a JSON format config file
+to configure the hub when you start it.
+You can do it like so:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+Below you will see an example of a `hubConfig.json` file.
+We will go into more detail on how to provide node configuration files in step 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Regardless of whether you want to run a grid with new WebDriver functionality,
+or a grid with Selenium 1 RC functionality,
+or both at the same time,
+you use the same `selenium-server-standalone.jar` file to start the nodes:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+If a port is not specified through the `-port` flag,
+a free port will be chosen. You can run multiple nodes on one machine
+but if you do so, you need to be aware of your systems memory resources
+and problems with screenshots if your tests take them.
+
+
+#### Configuration of Node with options
+
+As mentioned, for backwards compatibility
+“wd” and “rc” roles are still a valid subset of the “node” role.
+But those roles limit the types of remote connections to their corresponding API,
+while “node” allows both RC and WebDriver remote connections.
+
+Passing JVM properties (using the `-D` flag
+_before the -jar argument_)
+on the command line as well,
+and these will be picked up and propagated to the nodes:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuration of Node with JSON
+
+You can also start grid nodes that are configured
+with a JSON configuration file
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+And here is an example of a `nodeConfig.json` file:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+A note about the `-host` flag
+
+For both hub and node, if the `-host` flag is not specified,
+`0.0.0.0` will be used by default. This will bind to all the
+public (non-loopback) IPv4 interfaces of the machine. If you have a special
+network configuration or any component that creates extra network interfaces,
+it is advised to set the `-host` flag with a value that allows the
+hub/node to be reachable from a different machine.
+
+#### Specifying the port
+
+The default TCP/IP port used by the hub is 4444. If you need to change the port
+please use above mentioned configurations
+
+## Troubleshooting
+
+### Using Log file
+For advance troubleshooting you can specify log file to log system messages.
+For that start Selenium GRID hub or node with -log argument. Please see the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use your favorite text editor to open log file (log.txt in above example) to find
+"ERROR" logs if you get issues.
+
+### Using `-debug` argument
+
+Also you can use `-debug` argument to print debug logs on console.
+For that start Selenium Grid Hub or Node with `-debug` argument. Please see
+the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+## Warning
+
+The Selenium Grid must be protected from external access using appropriate
+firewall permissions.
+
+Failure to protect your Grid could result in one or more of the following occurring:
+* You provide open access to your Grid infrastructure
+* You allow 3rd parties to access internal web applications and files
+* You allow 3rd parties to run custom binaries
+
+See this blog post on [Detectify](//labs.detectify.com) which gives a good
+overview of how a publicly exposed Grid could be misused:
+[Don't Leave your Grid Wide Open](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+[Docker](//www.docker.com/) provides a convenient way to
+provision and scale Selenium Grid infrastructure in a unit known as a container.
+Containers are standardised units of software that contain everything required
+to run the desired application including all dependencies in a reliable and repeatable
+way on different machines.
+
+The Selenium project maintains a set of Docker images which you can download
+and run to get a working grid up and running quickly. Nodes are available for
+both Firefox and Chrome. Full details of how to provision a grid can be found
+within the [Docker Selenium](//github.com/SeleniumHQ/docker-selenium)
+repository.
+
+### Prerequisite
+The only requirement to run a Grid is to have Docker installed and working.
+[Install Docker](//www.docker.com/products/docker-desktop).
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.nl.md b/docs_source_files/content/grid/setting_up_your_own_grid.nl.md
new file mode 100644
index 00000000000..3358e6ba44b
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.nl.md
@@ -0,0 +1,256 @@
+---
+title: "Setting up your own Grid"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+To use Selenium Grid,
+you need to maintain your own infrastructure for the nodes.
+As this can be a cumbersome and time intense effort,
+many organizations use IaaS providers
+such as Amazon EC2 and Google Compute
+to provide this infrastructure.
+
+Other options include using providers such as Sauce Labs or Testing Bot
+who provide a Selenium Grid as a service in the cloud.
+It is certainly possible to also run nodes on your own hardware.
+This chapter will go into detail about the option of running your own grid,
+complete with its own node infrastructure.
+
+
+## Quick start
+
+This example will show you how to start the Selenium 2 Grid Hub,
+and register both a WebDriver node and a Selenium 1 RC legacy node.
+We’ll also show you how to call the grid from Java.
+The hub and nodes are shown here running on the same machine,
+but of course you can copy the selenium-server-standalone to multiple machines.
+
+The `selenium-server-standalone` package includes the hub,
+WebDriver, and legacy RC needed to run the Grid,
+_ant_ is not required anymore.
+You can download the `selenium-server-standalone-.jar` from
+[http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Step 1: Start the Hub
+
+The Hub is the central point that will receive test requests
+and distribute them to the right nodes.
+The distribution is done on a capabilities basis,
+meaning a test requiring a set of capabilities
+will only be distributed to nodes offering that set or subset of capabilities.
+
+Because a test's desired capabilities are just what the name implies, _desired_,
+the hub cannot guarantee that it will locate a node
+fully matching the requested desired capabilities set.
+
+Open a command prompt
+and navigate to the directory where you copied
+the `selenium-server-standalone.jar` file.
+You start the hub by passing the `-role hub` flag
+to the standalone server:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+The Hub will listen to port 4444 by default.
+You can view the status of the hub by opening a browser window and navigating to
+[http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+To change the default port,
+you can add the optional `-port` flag
+with an integer representing the port to listen to when you run the command.
+Also, all of the other options you see in the JSON config file (seen below)
+are possible command-line flags.
+
+You certainly can get by with only the simple command shown above,
+but if you need more advanced configuration,
+then you may also for convenience specify a JSON format config file
+to configure the hub when you start it.
+You can do it like so:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+Below you will see an example of a `hubConfig.json` file.
+We will go into more detail on how to provide node configuration files in step 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Regardless of whether you want to run a grid with new WebDriver functionality,
+or a grid with Selenium 1 RC functionality,
+or both at the same time,
+you use the same `selenium-server-standalone.jar` file to start the nodes:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+If a port is not specified through the `-port` flag,
+a free port will be chosen. You can run multiple nodes on one machine
+but if you do so, you need to be aware of your systems memory resources
+and problems with screenshots if your tests take them.
+
+
+#### Configuration of Node with options
+
+As mentioned, for backwards compatibility
+“wd” and “rc” roles are still a valid subset of the “node” role.
+But those roles limit the types of remote connections to their corresponding API,
+while “node” allows both RC and WebDriver remote connections.
+
+Passing JVM properties (using the `-D` flag
+_before the -jar argument_)
+on the command line as well,
+and these will be picked up and propagated to the nodes:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuration of Node with JSON
+
+You can also start grid nodes that are configured
+with a JSON configuration file
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+And here is an example of a `nodeConfig.json` file:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+A note about the `-host` flag
+
+For both hub and node, if the `-host` flag is not specified,
+`0.0.0.0` will be used by default. This will bind to all the
+public (non-loopback) IPv4 interfaces of the machine. If you have a special
+network configuration or any component that creates extra network interfaces,
+it is advised to set the `-host` flag with a value that allows the
+hub/node to be reachable from a different machine.
+
+#### Specifying the port
+
+The default TCP/IP port used by the hub is 4444. If you need to change the port
+please use above mentioned configurations
+
+## Troubleshooting
+
+### Using Log file
+For advance troubleshooting you can specify log file to log system messages.
+For that start Selenium GRID hub or node with -log argument. Please see the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use your favorite text editor to open log file (log.txt in above example) to find
+"ERROR" logs if you get issues.
+
+### Using `-debug` argument
+
+Also you can use `-debug` argument to print debug logs on console.
+For that start Selenium Grid Hub or Node with `-debug` argument. Please see
+the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+## Warning
+
+The Selenium Grid must be protected from external access using appropriate
+firewall permissions.
+
+Failure to protect your Grid could result in one or more of the following occurring:
+* You provide open access to your Grid infrastructure
+* You allow 3rd parties to access internal web applications and files
+* You allow 3rd parties to run custom binaries
+
+See this blog post on [Detectify](//labs.detectify.com) which gives a good
+overview of how a publicly exposed Grid could be misused:
+[Don't Leave your Grid Wide Open](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+[Docker](//www.docker.com/) provides a convenient way to
+provision and scale Selenium Grid infrastructure in a unit known as a container.
+Containers are standardised units of software that contain everything required
+to run the desired application including all dependencies in a reliable and repeatable
+way on different machines.
+
+The Selenium project maintains a set of Docker images which you can download
+and run to get a working grid up and running quickly. Nodes are available for
+both Firefox and Chrome. Full details of how to provision a grid can be found
+within the [Docker Selenium](//github.com/SeleniumHQ/docker-selenium)
+repository.
+
+### Prerequisite
+The only requirement to run a Grid is to have Docker installed and working.
+[Install Docker](//www.docker.com/products/docker-desktop).
diff --git a/docs_source_files/content/grid/setting_up_your_own_grid.zh-cn.md b/docs_source_files/content/grid/setting_up_your_own_grid.zh-cn.md
new file mode 100644
index 00000000000..0fec79111f1
--- /dev/null
+++ b/docs_source_files/content/grid/setting_up_your_own_grid.zh-cn.md
@@ -0,0 +1,255 @@
+---
+title: "Setting up your own Grid"
+weight: 3
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+To use Selenium Grid,
+you need to maintain your own infrastructure for the nodes.
+As this can be a cumbersome and time intense effort,
+many organizations use IaaS providers
+such as Amazon EC2 and Google Compute
+to provide this infrastructure.
+
+Other options include using providers such as Sauce Labs or Testing Bot
+who provide a Selenium Grid as a service in the cloud.
+It is certainly possible to also run nodes on your own hardware.
+This chapter will go into detail about the option of running your own grid,
+complete with its own node infrastructure.
+
+
+## Quick start
+
+This example will show you how to start the Selenium 2 Grid Hub,
+and register both a WebDriver node and a Selenium 1 RC legacy node.
+We’ll also show you how to call the grid from Java.
+The hub and nodes are shown here running on the same machine,
+but of course you can copy the selenium-server-standalone to multiple machines.
+
+The `selenium-server-standalone` package includes the hub,
+WebDriver, and legacy RC needed to run the Grid,
+_ant_ is not required anymore.
+You can download the `selenium-server-standalone-.jar` from
+[http://www.seleniumhq.org/download/](http://www.seleniumhq.org/download/).
+
+
+### Step 1: Start the Hub
+
+The Hub is the central point that will receive test requests
+and distribute them to the right nodes.
+The distribution is done on a capabilities basis,
+meaning a test requiring a set of capabilities
+will only be distributed to nodes offering that set or subset of capabilities.
+
+Because a test's desired capabilities are just what the name implies, _desired_,
+the hub cannot guarantee that it will locate a node
+fully matching the requested desired capabilities set.
+
+Open a command prompt
+and navigate to the directory where you copied
+the `selenium-server-standalone.jar` file.
+You start the hub by passing the `-role hub` flag
+to the standalone server:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub
+```
+
+The Hub will listen to port 4444 by default.
+You can view the status of the hub by opening a browser window and navigating to
+[http://localhost:4444/grid/console](http://localhost:4444/grid/console).
+
+To change the default port,
+you can add the optional `-port` flag
+with an integer representing the port to listen to when you run the command.
+Also, all of the other options you see in the JSON config file (seen below)
+are possible command-line flags.
+
+You certainly can get by with only the simple command shown above,
+but if you need more advanced configuration,
+then you may also for convenience specify a JSON format config file
+to configure the hub when you start it.
+You can do it like so:
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
+```
+
+Below you will see an example of a `hubConfig.json` file.
+We will go into more detail on how to provide node configuration files in step 2.
+
+```json
+{
+ "_comment" : "Configuration for Hub - hubConfig.json",
+ "host": ip,
+ "maxSession": 5,
+ "port": 4444,
+ "cleanupCycle": 5000,
+ "timeout": 300000,
+ "newSessionWaitTimeout": -1,
+ "servlets": [],
+ "prioritizer": null,
+ "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
+ "throwOnCapabilityNotPresent": true,
+ "nodePolling": 180000,
+ "platform": "WINDOWS"}
+```
+
+
+### Step 2: Start the Nodes
+
+Regardless of whether you want to run a grid with new WebDriver functionality,
+or a grid with Selenium 1 RC functionality,
+or both at the same time,
+you use the same `selenium-server-standalone.jar` file to start the nodes:
+
+```shell
+java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
+```
+
+If a port is not specified through the `-port` flag,
+a free port will be chosen. You can run multiple nodes on one machine
+but if you do so, you need to be aware of your systems memory resources
+and problems with screenshots if your tests take them.
+
+
+#### Configuration of Node with options
+
+As mentioned, for backwards compatibility
+“wd” and “rc” roles are still a valid subset of the “node” role.
+But those roles limit the types of remote connections to their corresponding API,
+while “node” allows both RC and WebDriver remote connections.
+
+Passing JVM properties (using the `-D` flag
+_before the -jar argument_)
+on the command line as well,
+and these will be picked up and propagated to the nodes:
+
+`-Dwebdriver.chrome.driver=chromedriver.exe`
+
+
+#### Configuration of Node with JSON
+
+You can also start grid nodes that are configured
+with a JSON configuration file
+
+```shell
+java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
+```
+
+And here is an example of a `nodeConfig.json` file:
+
+```json
+{
+ "capabilities": [
+ {
+ "browserName": "firefox",
+ "acceptSslCerts": true,
+ "javascriptEnabled": true,
+ "takesScreenshot": false,
+ "firefox_profile": "",
+ "browser-version": "27",
+ "platform": "WINDOWS",
+ "maxInstances": 5,
+ "firefox_binary": "",
+ "cleanSession": true
+ },
+ {
+ "browserName": "chrome",
+ "maxInstances": 5,
+ "platform": "WINDOWS",
+ "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
+ },
+ {
+ "browserName": "internet explorer",
+ "maxInstances": 1,
+ "platform": "WINDOWS",
+ "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
+ }
+ ],
+ "configuration": {
+ "_comment" : "Configuration for Node",
+ "cleanUpCycle": 2000,
+ "timeout": 30000,
+ "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
+ "port": 5555,
+ "host": ip,
+ "register": true,
+ "hubPort": 4444,
+ "maxSession": 5
+ }
+}
+```
+
+A note about the `-host` flag
+
+For both hub and node, if the `-host` flag is not specified,
+`0.0.0.0` will be used by default. This will bind to all the
+public (non-loopback) IPv4 interfaces of the machine. If you have a special
+network configuration or any component that creates extra network interfaces,
+it is advised to set the `-host` flag with a value that allows the
+hub/node to be reachable from a different machine.
+
+#### Specifying the port
+
+The default TCP/IP port used by the hub is 4444. If you need to change the port
+please use above mentioned configurations
+
+## Troubleshooting
+
+### Using Log file
+For advance troubleshooting you can specify log file to log system messages.
+For that start Selenium GRID hub or node with -log argument. Please see the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -log log.txt
+```
+
+Use your favorite text editor to open log file (log.txt in above example) to find
+"ERROR" logs if you get issues.
+
+### Using `-debug` argument
+
+Also you can use `-debug` argument to print debug logs on console.
+For that start Selenium Grid Hub or Node with `-debug` argument. Please see
+the below example
+
+```shell
+java -jar selenium-server-standalone.jar -role hub -debug
+```
+
+## Warning
+
+The Selenium Grid must be protected from external access using appropriate
+firewall permissions.
+
+Failure to protect your Grid could result in one or more of the following occurring:
+* You provide open access to your Grid infrastructure
+* You allow 3rd parties to access internal web applications and files
+* You allow 3rd parties to run custom binaries
+
+See this blog post on [Detectify](//labs.detectify.com) which gives a good
+overview of how a publicly exposed Grid could be misused:
+[Don't Leave your Grid Wide Open](//labs.detectify.com/2017/10/06/guest-blog-dont-leave-your-grid-wide-open/).
+
+
+## Docker Selenium
+[Docker](//www.docker.com/) provides a convenient way to
+provision and scale Selenium Grid infrastructure in a unit known as a container.
+Containers are standardised units of software that contain everything required
+to run the desired application including all dependencies in a reliable and repeatable
+way on different machines.
+
+The Selenium project maintains a set of Docker images which you can download
+and run to get a working grid up and running quickly. Nodes are available for
+both Firefox and Chrome. Full details of how to provision a grid can be found
+within the [Docker Selenium](//github.com/SeleniumHQ/docker-selenium)
+repository.
+
+### Prerequisite
+The only requirement to run a Grid is to have Docker installed and working.
+[Install Docker](//www.docker.com/products/docker-desktop).
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.en.md b/docs_source_files/content/guidelines_and_recommendations/_index.en.md
new file mode 100644
index 00000000000..b53f75b3550
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.en.md
@@ -0,0 +1,28 @@
+---
+title: "Guidelines and recommendations"
+menuTitle: "Guidelines"
+chapter: true
+weight: 7
+---
+
+# Guidelines and recommendations
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations". We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies do not make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but does not help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.es.md b/docs_source_files/content/guidelines_and_recommendations/_index.es.md
new file mode 100644
index 00000000000..56fe88b1fb3
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.es.md
@@ -0,0 +1,34 @@
+---
+title: "Guías y recomendaciones"
+menuTitle: "Guías y recomendaciones"
+chapter: true
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Guías y recomendaciones
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations." We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies don't make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but doesn't help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.fr.md b/docs_source_files/content/guidelines_and_recommendations/_index.fr.md
new file mode 100644
index 00000000000..51e1c9f2f6a
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.fr.md
@@ -0,0 +1,34 @@
+---
+title: "Lignes directrices et recommendations"
+menuTitle: "Lignes directrices"
+chapter: true
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Guidelines and recommendations
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations." We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies don't make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but doesn't help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.ja.md b/docs_source_files/content/guidelines_and_recommendations/_index.ja.md
new file mode 100644
index 00000000000..f200af6d5a2
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.ja.md
@@ -0,0 +1,33 @@
+---
+title: "Guidelines and recommendations"
+menuTitle: "Guidelines"
+chapter: true
+weight: 7
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Guidelines and recommendations
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations." We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies don't make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but doesn't help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.nl.md b/docs_source_files/content/guidelines_and_recommendations/_index.nl.md
new file mode 100644
index 00000000000..60d22a29e85
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.nl.md
@@ -0,0 +1,34 @@
+---
+title: "Guidelines and recommendations"
+menuTitle: "Guidelines"
+chapter: true
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Guidelines and recommendations
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations." We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies don't make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but doesn't help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/_index.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/_index.zh-cn.md
new file mode 100644
index 00000000000..56850b3fe37
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/_index.zh-cn.md
@@ -0,0 +1,33 @@
+---
+title: "Guidelines and recommendations"
+menuTitle: "Guidelines"
+chapter: true
+weight: 7
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+# Guidelines and recommendations
+
+A note on "Best Practices": We've intentionally avoided the phrase "Best
+Practices" in this documentation. No one approach works for all situations.
+We prefer the idea of "Guidelines and Recommendations." We encourage
+you to read through these and thoughtfully decide what approaches
+will work for you in your particular environment.
+
+Functional testing is difficult to get right for many reasons.
+As if application state, complexity, and dependencies don't make testing difficult enough,
+dealing with browsers (especially with cross-browser incompatibilities)
+makes writing good tests a challenge.
+
+Selenium provides tools to make functional user interaction easier,
+but doesn't help you write well-architected test suites.
+In this chapter we offer advice, guidelines, and recommendations.
+on how to approach functional web page automation.
+
+This chapter records software design patterns popular
+amongst many of the users of Selenium
+that have proven successful over the years.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.en.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.en.md
new file mode 100644
index 00000000000..c6fd7f3806d
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.en.md
@@ -0,0 +1,17 @@
+---
+title: "Avoid sharing state"
+weight: 6
+---
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+* Do not share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+* Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+* Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.es.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.es.md
new file mode 100644
index 00000000000..9360921fd80
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.es.md
@@ -0,0 +1,23 @@
+---
+title: "Evitar compartir estados"
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+Don't share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.fr.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.fr.md
new file mode 100644
index 00000000000..b4e263e9a48
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.fr.md
@@ -0,0 +1,23 @@
+---
+title: "Eviter de partager l'état"
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+Don't share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.ja.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.ja.md
new file mode 100644
index 00000000000..e5486f1e94a
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.ja.md
@@ -0,0 +1,22 @@
+---
+title: "Avoid sharing state"
+weight: 6
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+Don't share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.nl.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.nl.md
new file mode 100644
index 00000000000..8cf5ecd0998
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.nl.md
@@ -0,0 +1,23 @@
+---
+title: "Avoid sharing state"
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+Don't share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.zh-cn.md
new file mode 100644
index 00000000000..9e0fc2ef6a6
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/avoid_sharing_state.zh-cn.md
@@ -0,0 +1,22 @@
+---
+title: "Avoid sharing state"
+weight: 6
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Although mentioned in several places it is worth mentioning again. Ensure
+tests are isolated from one another.
+
+Don't share test data. Imagine several tests that each query the database
+for valid orders before picking one to perform an action on. Should two tests
+pick up the same order you are likely to get unexpected behaviour.
+
+Clean up stale data in the application that might be picked up by another
+test e.g. invalid order records.
+
+Create a new WebDriver instance per test. This helps ensure test isolation
+and makes parallelisation simpler.
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.en.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.en.md
new file mode 100644
index 00000000000..b76360a995b
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.en.md
@@ -0,0 +1,77 @@
+---
+title: "Consider using a fluent API"
+weight: 8
+---
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html). Selenium already
+implements something like this in their `FluentWait` class, which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.es.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.es.md
new file mode 100644
index 00000000000..9ebcb0115c1
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.es.md
@@ -0,0 +1,83 @@
+---
+title: "Considerar el uso de un API fluída"
+weight: 8
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html).
+Selenium already implements something like this in their `FluentWait` class which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.fr.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.fr.md
new file mode 100644
index 00000000000..9fe6d24e31a
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.fr.md
@@ -0,0 +1,83 @@
+---
+title: "Considerer l'utilisation d'une API fluent"
+weight: 8
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html).
+Selenium already implements something like this in their `FluentWait` class which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.ja.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.ja.md
new file mode 100644
index 00000000000..cccacf6ec38
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.ja.md
@@ -0,0 +1,82 @@
+---
+title: "Consider using a fluent API"
+weight: 8
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html).
+Selenium already implements something like this in their `FluentWait` class which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.nl.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.nl.md
new file mode 100644
index 00000000000..41179f641dd
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.nl.md
@@ -0,0 +1,83 @@
+---
+title: "Consider using a fluent API"
+weight: 8
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html).
+Selenium already implements something like this in their `FluentWait` class which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.zh-cn.md
new file mode 100644
index 00000000000..63b77e8c99a
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/consider_using_a_fluent_api.zh-cn.md
@@ -0,0 +1,82 @@
+---
+title: "Consider using a fluent API"
+weight: 8
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Martin Fowler coined the term ["Fluent API"](//www.martinfowler.com/bliki/FluentInterface.html).
+Selenium already implements something like this in their `FluentWait` class which is
+meant as an alternative to the standard Wait class.
+You could enable the Fluent API design pattern in your page object
+and then query the Google search page with a code snippet like this one:
+
+```java
+driver.get( "http://www.google.com/webhp?hl=en&tab=ww" );
+GoogleSearchPage gsp = new GoogleSearchPage();
+gsp.withFluent().setSearchString().clickSearchButton();
+```
+
+The Google page object class with this fluent behavior
+might look like this:
+
+```java
+public class GoogleSearchPage extends LoadableComponent {
+ private final WebDriver driver;
+ private GSPFluentInterface gspfi;
+
+ public class GSPFluentInterface {
+ private GoogleSearchPage gsp;
+
+ public GSPFluentInterface(GoogleSearchPage googleSearchPage) {
+ gsp = googleSearchPage;
+ }
+
+ public GSPFluentInterface clickSearchButton() {
+ gsp.searchButton.click();
+ return this;
+ }
+
+ public GSPFluentInterface setSearchString( String sstr ) {
+ clearAndType( gsp.searchField, sstr );
+ return this;
+ }
+ }
+
+ @FindBy(id = "gbqfq") private WebElement searchField;
+ @FindBy(id = "gbqfb") private WebElement searchButton;
+ public GoogleSearchPage(WebDriver driver) {
+ gspfi = new GSPFluentInterface( this );
+ this.get(); // If load() fails, calls isLoaded() until page is finished loading
+ PageFactory.initElements(driver, this); // Initialize WebElements on page
+ }
+
+ public GSPFluentInterface withFluent() {
+ return gspfi;
+ }
+
+ public void clickSearchButton() {
+ searchButton.click();
+ }
+
+ public void setSearchString( String sstr ) {
+ clearAndType( searchField, sstr );
+ }
+
+ @Override
+ protected void isLoaded() throws Error {
+ Assert.assertTrue("Google search page is not yet loaded.", isSearchFieldVisible() );
+ }
+
+ @Override
+ protected void load() {
+ if ( isSFieldPresent ) {
+ Wait wait = new WebDriverWait( driver, 3 );
+ wait.until( visibilityOfElementLocated( By.id("gbqfq") ) ).click();
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.en.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.en.md
new file mode 100644
index 00000000000..d119ff37879
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.en.md
@@ -0,0 +1,97 @@
+---
+title: "Domain specific language"
+weight: 2
+---
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, do not care how your site looks. They do not
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty; they want to book travel to Alaska;
+they want to configure and buy unicorns at a discount. Your job as
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you are
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for, and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT*.
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all a tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they do not care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
+
+***AUT**: Application under test
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.es.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.es.md
new file mode 100644
index 00000000000..535230ce407
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.es.md
@@ -0,0 +1,101 @@
+---
+title: "Lenguage de dominio específico"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, don't care how your site looks. They don't
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty. They want to book travel to Alaska.
+They want to configure and buy unicorns at a discount. Your job as the
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you're
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT (application under test).
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all your tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they don't care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.fr.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.fr.md
new file mode 100644
index 00000000000..7bcba356650
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.fr.md
@@ -0,0 +1,101 @@
+---
+title: "Domain specific language"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, don't care how your site looks. They don't
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty. They want to book travel to Alaska.
+They want to configure and buy unicorns at a discount. Your job as the
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you're
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT (application under test).
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all your tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they don't care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.ja.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.ja.md
new file mode 100644
index 00000000000..f55a983c403
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.ja.md
@@ -0,0 +1,99 @@
+---
+title: "Domain specific language"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, don't care how your site looks. They don't
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty. They want to book travel to Alaska.
+They want to configure and buy unicorns at a discount. Your job as the
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you're
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT (application under test).
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all your tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they don't care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.nl.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.nl.md
new file mode 100644
index 00000000000..f301cade005
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.nl.md
@@ -0,0 +1,101 @@
+---
+title: "Domain specific language"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, don't care how your site looks. They don't
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty. They want to book travel to Alaska.
+They want to configure and buy unicorns at a discount. Your job as the
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you're
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT (application under test).
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all your tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they don't care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.zh-cn.md
new file mode 100644
index 00000000000..a76cc93eb08
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/domain_specific_language.zh-cn.md
@@ -0,0 +1,100 @@
+---
+title: "Domain specific language"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+A domain specific language (DSL) is a system which provides the user with
+an expressive means of solving a problem. It allows a user to
+interact with the system on their terms – not just programmer-speak.
+
+Your users, in general, don't care how your site looks. They don't
+care about the decoration, animations, or graphics. They
+want to use your system to push their new employees through the
+process with minimal difficulty. They want to book travel to Alaska.
+They want to configure and buy unicorns at a discount. Your job as the
+tester is to come as close as you can to “capturing” this mind-set.
+With that in mind, we set about “modeling” the application you're
+working on, such that the test scripts (the user's only pre-release
+proxy) “speak” for and represent the user.
+
+With Selenium, DSL is usually represented by methods, written to make
+the API simple and readable – they enable a report between the
+developers and the stakeholders (users, product owners, business
+intelligence specialists, etc.).
+
+## Benefits
+
+* **Readable:** Business stakeholders can understand it.
+* **Writable:** Easy to write, avoids unnecessary duplication.
+* **Extensible:** Functionality can (reasonably) be added
+ without breaking contracts and existing functionality.
+* **Maintainable:** By leaving the implementation details out of test
+ cases, you are well-insulated against changes to the AUT (application under test).
+
+
+## Java
+
+Here is an example of a reasonable DSL method in Java.
+For brevity's sake, it assumes the `driver` object is pre-defined
+and available to the method.
+
+```java
+/**
+ * Takes a username and password, fills out the fields, and clicks "login".
+ * @return An instance of the AccountPage
+ */
+public AccountPage loginAsUser(String username, String password) {
+ WebElement loginField = driver.findElement(By.id("loginField"));
+ loginField.clear();
+ loginField.sendKeys(username);
+
+ // Fill out the password field. The locator we're using is "By.id", and we should
+ // have it defined elsewhere in the class.
+ WebElement passwordField = driver.findElement(By.id("password"));
+ passwordField.clear();
+ passwordField.sendKeys(password);
+
+ // Click the login button, which happens to have the id "submit".
+ driver.findElement(By.id("submit")).click();
+
+ // Create and return a new instance of the AccountPage (via the built-in Selenium
+ // PageFactory).
+ return PageFactory.newInstance(AccountPage.class);
+}
+```
+
+This method completely abstracts the concepts of input fields,
+buttons, clicking, and even pages from your test code. Using this
+approach, all your tester has to do is call this method. This gives
+you a maintenance advantage: if the login fields ever changed, you
+would only ever have to change this method - not your tests.
+
+```java
+public void loginTest() {
+ loginAsUser("cbrown", "cl0wn3");
+
+ // Now that we're logged in, do some other stuff--since we used a DSL to support
+ // our testers, it's as easy as choosing from available methods.
+ do.something();
+ do.somethingElse();
+ Assert.assertTrue("Something should have been done!", something.wasDone());
+
+ // Note that we still haven't referred to a button or web control anywhere in this
+ // script...
+}
+```
+
+It bears repeating: one of your primary goals should be writing an
+API that allows your tests to address **the problem at hand, and NOT
+the problem of the UI**. The UI is a secondary concern for your
+users – they don't care about the UI, they just want to get their job
+done. Your test scripts should read like a laundry list of things
+the user wants to DO, and the things they want to KNOW. The tests
+should not concern themselves with HOW the UI requires you to go
+about it.
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.en.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.en.md
new file mode 100644
index 00000000000..8ddbb3ecf9b
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.en.md
@@ -0,0 +1,15 @@
+---
+title: "Fresh browser per test"
+weight: 9
+---
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.es.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.es.md
new file mode 100644
index 00000000000..bfbdf814be9
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.es.md
@@ -0,0 +1,21 @@
+---
+title: "Nueva instancia del navegador por prueba"
+weight: 9
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.fr.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.fr.md
new file mode 100644
index 00000000000..74470df6594
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.fr.md
@@ -0,0 +1,21 @@
+---
+title: "Nouveau navigateur par test"
+weight: 9
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.ja.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.ja.md
new file mode 100644
index 00000000000..33aa7e0770c
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.ja.md
@@ -0,0 +1,20 @@
+---
+title: "Fresh browser per test"
+weight: 9
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.nl.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.nl.md
new file mode 100644
index 00000000000..f8b8e6cc793
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.nl.md
@@ -0,0 +1,21 @@
+---
+title: "Fresh browser per test"
+weight: 9
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.zh-cn.md
new file mode 100644
index 00000000000..e00fed1dd51
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/fresh_browser_per_test.zh-cn.md
@@ -0,0 +1,20 @@
+---
+title: "Fresh browser per test"
+weight: 9
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Start each test from a clean known state.
+Ideally, spin up a new virtual machine for each test.
+If spinning up a new virtual machine is not practical,
+at least start a new WebDriver for each test.
+For Firefox, start a WebDriver with your known profile.
+
+```java
+FirefoxProfile profile = new FirefoxProfile(new File("pathToFirefoxProfile"));
+WebDriver driver = new FirefoxDriver(profile);
+```
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.en.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.en.md
new file mode 100644
index 00000000000..e04909a4063
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.en.md
@@ -0,0 +1,16 @@
+---
+title: "Generating application state"
+weight: 3
+---
+
+Selenium should not be used to prepare a test case. All repetitive
+actions and preparations for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT* (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT*.
+
+***AUT**: Application under test
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.es.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.es.md
new file mode 100644
index 00000000000..ee57efdb02d
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.es.md
@@ -0,0 +1,20 @@
+---
+title: "Generar el estado de la aplicación"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium should not be used to prepare a test case. All repetitive
+actions, and preparation for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.fr.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.fr.md
new file mode 100644
index 00000000000..39c91f6cfdd
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.fr.md
@@ -0,0 +1,20 @@
+---
+title: "Generer l'état de l'application"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium should not be used to prepare a test case. All repetitive
+actions, and preparation for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.ja.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.ja.md
new file mode 100644
index 00000000000..5abb258f2a0
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.ja.md
@@ -0,0 +1,19 @@
+---
+title: "Generating application state"
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Selenium should not be used to prepare a test case. All repetitive
+actions, and preparation for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT.
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.nl.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.nl.md
new file mode 100644
index 00000000000..5003b261d47
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.nl.md
@@ -0,0 +1,20 @@
+---
+title: "Generating application state"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium should not be used to prepare a test case. All repetitive
+actions, and preparation for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/generating_application_state.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.zh-cn.md
new file mode 100644
index 00000000000..ce3cdd499cf
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/generating_application_state.zh-cn.md
@@ -0,0 +1,19 @@
+---
+title: "Generating application state"
+weight: 3
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Selenium should not be used to prepare a test case. All repetitive
+actions, and preparation for a test case, should be done through other
+methods. For example, most web UIs have authentication (e.g. a login
+form). Eliminating logging in via web browser before every test will
+improve both the speed and stability of the test. A method should be
+created to gain access to the AUT (e.g. using an API to login and set a
+cookie). Also, creating methods to pre-load data for
+testing should not be done using Selenium. As mentioned previously,
+existing APIs should be leveraged to create data for the AUT.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.en.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.en.md
new file mode 100644
index 00000000000..7571b66b8f7
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.en.md
@@ -0,0 +1,18 @@
+---
+title: "Improved reporting"
+weight: 5
+---
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
+[NUnit 3 Console Command Line](//github.com/nunit/docs/wiki/Console-Command-Line)
+[xUnit getting test results in TeamCity](//xunit.net/docs/getting-test-results-in-teamcity)
+[xUnit getting test results in CruiseControl.NET](//xunit.net/docs/getting-test-results-in-ccnet)
+[xUnit getting test results in Azure DevOps](//xunit.net/docs/getting-test-results-in-azure-devops)
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.es.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.es.md
new file mode 100644
index 00000000000..541b323bebb
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.es.md
@@ -0,0 +1,20 @@
+---
+title: "Mejores reportes"
+weight: 5
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.fr.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.fr.md
new file mode 100644
index 00000000000..e52260fabde
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.fr.md
@@ -0,0 +1,20 @@
+---
+title: "Reporting amélioré"
+weight: 5
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.ja.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.ja.md
new file mode 100644
index 00000000000..cefb8fa91bb
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.ja.md
@@ -0,0 +1,19 @@
+---
+title: "Improved reporting"
+weight: 5
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.nl.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.nl.md
new file mode 100644
index 00000000000..b347de6600f
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.nl.md
@@ -0,0 +1,20 @@
+---
+title: "Improved reporting"
+weight: 5
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/improved_reporting.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.zh-cn.md
new file mode 100644
index 00000000000..298891fccc6
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/improved_reporting.zh-cn.md
@@ -0,0 +1,19 @@
+---
+title: "Improved reporting"
+weight: 5
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Selenium is not designed to report on the status of test cases
+run. Taking advantage of the built-in reporting capabilities of unit
+test frameworks is a good start. Most unit test frameworks have
+reports that can generate xUnit or HTML formatted reports. xUnit
+reports are popular for importing results to a Continuous Integration
+(CI) server like Jenkins, Travis, Bamboo, etc. Here are some links
+for more information regarding report outputs for several languages.
+
+[NUnit 3 Console Runner](//github.com/nunit/docs/wiki/Console-Runner)
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.en.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.en.md
new file mode 100644
index 00000000000..0e993beeb3e
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.en.md
@@ -0,0 +1,7 @@
+---
+title: "Mock external services"
+weight: 4
+---
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.es.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.es.md
new file mode 100644
index 00000000000..a7e22440a50
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.es.md
@@ -0,0 +1,13 @@
+---
+title: "Mock de servicios externos"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.fr.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.fr.md
new file mode 100644
index 00000000000..3f503941208
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.fr.md
@@ -0,0 +1,13 @@
+---
+title: "Bouchonner les appels externes"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.ja.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.ja.md
new file mode 100644
index 00000000000..587dcf9cbff
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.ja.md
@@ -0,0 +1,12 @@
+---
+title: "Mock external services"
+weight: 4
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.nl.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.nl.md
new file mode 100644
index 00000000000..f2eb723c5f4
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.nl.md
@@ -0,0 +1,13 @@
+---
+title: "Mock external services"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/mock_external_services.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.zh-cn.md
new file mode 100644
index 00000000000..64398244029
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/mock_external_services.zh-cn.md
@@ -0,0 +1,12 @@
+---
+title: "Mock external services"
+weight: 4
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Eliminating the dependencies on external services will greatly improve
+the speed and stability of your tests.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.en.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.en.md
new file mode 100644
index 00000000000..b29446a5072
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.en.md
@@ -0,0 +1,31 @@
+---
+title: "Page object models"
+weight: 1
+---
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT*. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves do not need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you are using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
+
+
+ ***AUT**: Application under test
+
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.es.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.es.md
new file mode 100644
index 00000000000..5e18cce356c
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.es.md
@@ -0,0 +1,33 @@
+---
+title: "Modelos de objetos de página"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves don’t need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you’re using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.fr.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.fr.md
new file mode 100644
index 00000000000..38627d25cc9
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.fr.md
@@ -0,0 +1,33 @@
+---
+title: "Page object models"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves don’t need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you’re using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.ja.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.ja.md
new file mode 100644
index 00000000000..ea5512c3832
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.ja.md
@@ -0,0 +1,32 @@
+---
+title: "Page object models"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves don’t need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you’re using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.nl.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.nl.md
new file mode 100644
index 00000000000..a5badd666cf
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.nl.md
@@ -0,0 +1,33 @@
+---
+title: "Page object models"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves don’t need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you’re using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/page_object_models.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/page_object_models.zh-cn.md
new file mode 100644
index 00000000000..094698c4816
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/page_object_models.zh-cn.md
@@ -0,0 +1,32 @@
+---
+title: "Page object models"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Page Object is a Design Pattern which has become popular in test
+automation for enhancing test maintenance and reducing code
+duplication. A page object is an object-oriented class that serves as
+an interface to a page of your AUT. The tests then use the methods of
+this page object class whenever they need to interact with that page
+of the UI. The benefit is that if the UI changes for the page, the
+tests themselves don’t need to change; only the code within the page
+object needs to change. Subsequently, all changes to support that new
+UI are located in one place.
+
+The Page Object Design Pattern provides the following advantage:
+there is clean separation between test code and page specific code
+such as locators (or their use if you’re using a UI map) and layout.
+
+
+## Page object methods should return a value
+
+* If you submit a page and are redirected,
+ it should return the new page object.
+* If you click submit on login
+ and you want to check to see if a user is logged in,
+ it should return True or False in a method.
\ No newline at end of file
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.en.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.en.md
new file mode 100644
index 00000000000..4b696edafe8
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.en.md
@@ -0,0 +1,21 @@
+---
+title: "Test independency"
+weight: 7
+---
+
+Write each test as its own unit. Write the tests in a way that will not be
+reliant on other tests to complete:
+
+Let us say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.es.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.es.md
new file mode 100644
index 00000000000..23edd7a6d27
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.es.md
@@ -0,0 +1,27 @@
+---
+title: "Independencia en las pruebas"
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Write each test as its own unit. Write the tests in a way that won't be
+reliant on other tests to complete:
+
+Let's say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.fr.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.fr.md
new file mode 100644
index 00000000000..cdb9e04926b
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.fr.md
@@ -0,0 +1,27 @@
+---
+title: "Indépendence des tests"
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Write each test as its own unit. Write the tests in a way that won't be
+reliant on other tests to complete:
+
+Let's say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.ja.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.ja.md
new file mode 100644
index 00000000000..515ee1abe84
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.ja.md
@@ -0,0 +1,26 @@
+---
+title: "Test independency"
+weight: 7
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Write each test as its own unit. Write the tests in a way that won't be
+reliant on other tests to complete:
+
+Let's say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.nl.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.nl.md
new file mode 100644
index 00000000000..0276a38fc94
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.nl.md
@@ -0,0 +1,27 @@
+---
+title: "Test independency"
+weight: 7
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Write each test as its own unit. Write the tests in a way that won't be
+reliant on other tests to complete:
+
+Let's say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/guidelines_and_recommendations/test_independency.zh-cn.md b/docs_source_files/content/guidelines_and_recommendations/test_independency.zh-cn.md
new file mode 100644
index 00000000000..39eb132ab97
--- /dev/null
+++ b/docs_source_files/content/guidelines_and_recommendations/test_independency.zh-cn.md
@@ -0,0 +1,26 @@
+---
+title: "Test independency"
+weight: 7
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Write each test as its own unit. Write the tests in a way that won't be
+reliant on other tests to complete:
+
+Let's say there is a content management system with which you can create
+some custom content which then appears on your website as a module after
+publishing, and it may take some time to sync between the CMS and the
+application.
+
+A wrong way of testing your module is that the content is created and
+published in one test, and then checking the module in another test. This
+is not feasible as the content may not be available immediately for the
+other test after publishing.
+
+Instead, you can create a stub content which can be turned on and off
+within the affected test, and use that for validating the module. However,
+for content creation, you can still have a separate test.
diff --git a/docs_source_files/content/introduction/_index.en.md b/docs_source_files/content/introduction/_index.en.md
new file mode 100644
index 00000000000..359e7f09c90
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.en.md
@@ -0,0 +1,9 @@
+---
+title: "Introduction"
+chapter: true
+weight: 2
+---
+
+# Introduction
+
+Selenium is an umbrella project for a range of tools and libraries that enable and support the automation of web browsers.
\ No newline at end of file
diff --git a/docs_source_files/content/introduction/_index.es.md b/docs_source_files/content/introduction/_index.es.md
new file mode 100644
index 00000000000..0ca09beb980
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.es.md
@@ -0,0 +1,9 @@
+---
+title: "Introducción"
+chapter: true
+weight: 2
+---
+
+# Introducción
+
+Selenium es un proyecto que cobija una gama de herramientas y bibliotecas que permiten y soportan la automatización de los navegadores web.
diff --git a/docs_source_files/content/introduction/_index.fr.md b/docs_source_files/content/introduction/_index.fr.md
new file mode 100644
index 00000000000..bf83fd93a18
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.fr.md
@@ -0,0 +1,9 @@
+---
+title: "Introduction"
+chapter: true
+weight: 2
+---
+
+# Introduction
+
+Selenium est un projet englobant un ensemble d'outil et de librairies rendant possible l'automatisation de navigateur web.
diff --git a/docs_source_files/content/introduction/_index.ja.md b/docs_source_files/content/introduction/_index.ja.md
new file mode 100644
index 00000000000..643a309d4e0
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.ja.md
@@ -0,0 +1,9 @@
+---
+title: "紹介"
+chapter: true
+weight: 2
+---
+
+# 紹介
+
+Seleniumはブラウザー自動化を可能にし、それを支えるツール群とライブラリー群のプロジェクトです。
\ No newline at end of file
diff --git a/docs_source_files/content/introduction/_index.nl.md b/docs_source_files/content/introduction/_index.nl.md
new file mode 100644
index 00000000000..eb145216bd0
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.nl.md
@@ -0,0 +1,15 @@
+---
+title: "Introduction"
+chapter: true
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Introduction
+
+Selenium is an umbrella project for a range of tools and libraries that enable and support the automation of web browsers.
\ No newline at end of file
diff --git a/docs_source_files/content/introduction/_index.zh-cn.md b/docs_source_files/content/introduction/_index.zh-cn.md
new file mode 100644
index 00000000000..b23bfcb0b28
--- /dev/null
+++ b/docs_source_files/content/introduction/_index.zh-cn.md
@@ -0,0 +1,9 @@
+---
+title: "介绍"
+chapter: true
+weight: 2
+---
+
+# 介绍
+
+Selenium 是一系列工具和库的综合项目,这些工具和库支持 web 浏览器的自动化。
diff --git a/docs_source_files/content/introduction/about_this_documentation.en.md b/docs_source_files/content/introduction/about_this_documentation.en.md
new file mode 100644
index 00000000000..035c63e8da6
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.en.md
@@ -0,0 +1,29 @@
+---
+title: "About this documentation"
+weight: 4
+---
+
+These docs, like the code itself, are maintained 100% by volunteers
+within the Selenium community.
+Many have been using it since its inception,
+but many more have only been using it for a short while,
+and have given their time to help improve the on-boarding experience
+for new users.
+
+If there is an issue with the documentation, we want to know!
+The best way to communicate an issue is to visit
+[https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues)
+and search to see whether or not the issue has been filed already.
+If not, feel free to open one!
+
+Many members of the community frequent
+the _#selenium_ IRC channel at [irc.freenode.net](//freenode.net/).
+Feel free to drop in and ask questions
+and if you get help which you think could be of use within these documents,
+be sure to add your contribution!
+We can update these documents,
+but it is much easier for everyone when we get contributions
+from outside the normal committers.
+
+
+
diff --git a/docs_source_files/content/introduction/about_this_documentation.es.md b/docs_source_files/content/introduction/about_this_documentation.es.md
new file mode 100644
index 00000000000..05f325b6830
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.es.md
@@ -0,0 +1,12 @@
+---
+title: "Acerca de esta documentación"
+weight: 4
+---
+
+
+Estos documentos, como el código en sí, son mantenidos al 100% por voluntarios dentro de la comunidad de Selenium. Muchos lo han estado usando desde su inicio, pero muchos más lo han estado usando desde hace poco y han dado su tiempo para ayudar a mejorar la experiencia de iniciación para los nuevos usuarios.
+
+Si hay un problema con la documentación, ¡queremos saberlo! La mejor manera de comunicar un problema es visitar [https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues) y buscar para ver si el problema ya se ha archivado o no. Si no, ¡no dudes en abrir uno!
+
+Muchos miembros de la comunidad frecuentan el canal IRC _#selenium_ en [irc.freenode.net](//freenode.net/). ¡No dude en venir y hacer preguntas y si obtiene ayuda que cree que podría ser útil en estos documentos, asegúrese de agregar su contribución! Podemos actualizar estos documentos, pero es mucho más fácil para todos cuando recibimos contribuciones de fuera de los encargados normales.
+
diff --git a/docs_source_files/content/introduction/about_this_documentation.fr.md b/docs_source_files/content/introduction/about_this_documentation.fr.md
new file mode 100644
index 00000000000..5012d2bd7c3
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.fr.md
@@ -0,0 +1,24 @@
+---
+title: "A propos de cette documentation"
+weight: 4
+---
+
+Cette documentation, tout comme le code lui-même, est maintenue à 100%
+par des volontaires de la communauté Selenium.
+Beaucoup font partie des utilisateurs de la première heure,
+mais encore plus sont des utilisateurs récents,
+et ont donné de leur temps pour améliorer l'accueil des nouveaux utilisateurs.
+
+Si vous rencontrez un problème avec la documentation, nous souhaitons le savoir !
+La meilleure façon de communiquer un problème est de visiter
+[https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues)
+et de vérifier si ce problème a déjà été remonté.
+Si ce n'est pas le cas, n'hésitez pas à ouvrir une nouvel issue !
+
+De nombreux membre de la communauté fréquentent le canal IRC [irc.freenode.net](//freenode.net/).
+N'hésitez pas à passer et poser vos questions.
+Si vous recevez de l'aide et pensez que cela devrait faire partie de la documentation,
+votre contribution sera plus que bienvenue !
+Nous pouvons mettre à jour cette documentation,
+mais c'est beaucoup plus facile pour tout le monde
+lorsque nous recevons des contributions venant de nouvelles personnes.
diff --git a/docs_source_files/content/introduction/about_this_documentation.ja.md b/docs_source_files/content/introduction/about_this_documentation.ja.md
new file mode 100644
index 00000000000..eb445eb3ecf
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.ja.md
@@ -0,0 +1,31 @@
+---
+title: "About this documentation"
+weight: 4
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+These docs, like the code itself, are maintained 100% by volunteers
+within the Selenium community.
+Many have been using it since its inception,
+but many more have only been using it for a short while,
+and have given their time to help improve the on-boarding experience
+for new users.
+
+If there is an issue with the documentation, we want to know!
+The best way to communicate an issue is to visit
+[https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues)
+and search to see whether or not the issue has been filed already.
+If not, feel free to open one!
+
+Many members of the community frequent
+the _#selenium_ IRC channel at [irc.freenode.net](//freenode.net/).
+Feel free to drop in and ask questions
+and if you get help which you think could be of use within these documents,
+be sure to add your contribution!
+We can update these documents,
+but it's much easier for everyone when we get contributions
+from outside the normal committers.
diff --git a/docs_source_files/content/introduction/about_this_documentation.nl.md b/docs_source_files/content/introduction/about_this_documentation.nl.md
new file mode 100644
index 00000000000..5fe39659e86
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.nl.md
@@ -0,0 +1,35 @@
+---
+title: "About this documentation"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+These docs, like the code itself, are maintained 100% by volunteers
+within the Selenium community.
+Many have been using it since its inception,
+but many more have only been using it for a short while,
+and have given their time to help improve the on-boarding experience
+for new users.
+
+If there is an issue with the documentation, we want to know!
+The best way to communicate an issue is to visit
+[https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues)
+and search to see whether or not the issue has been filed already.
+If not, feel free to open one!
+
+Many members of the community frequent
+the _#selenium_ IRC channel at [irc.freenode.net](//freenode.net/).
+Feel free to drop in and ask questions
+and if you get help which you think could be of use within these documents,
+be sure to add your contribution!
+We can update these documents,
+but it's much easier for everyone when we get contributions
+from outside the normal committers.
+
+
+
diff --git a/docs_source_files/content/introduction/about_this_documentation.zh-cn.md b/docs_source_files/content/introduction/about_this_documentation.zh-cn.md
new file mode 100644
index 00000000000..40fee3b3be1
--- /dev/null
+++ b/docs_source_files/content/introduction/about_this_documentation.zh-cn.md
@@ -0,0 +1,17 @@
+---
+title: "关于这个文档"
+weight: 4
+---
+
+这些文档,就像代码本身一样,100% 由 Selenium 社区中的志愿者维护。
+许多人自成立以来一直在使用它,但更多人只是在短时间内使用它,并且已经花时间帮助改善新用户的入门体验。
+
+如果文档有问题,我们想知道!
+沟通问题的最佳方式是访问
+[https://github.com/seleniumhq/docs/issues](//github.com/seleniumhq/docs/issues)
+并搜索问题是否已经提交。
+如果没有,请随意打开一个!
+
+社区的许多成员经常光顾 [irc.freenode.net](//freenode.net/) 的 _#selenium_ IRC 频道。
+请随时来访并提出问题,如果您得到了您认为在这些文档中可能有用的帮助,请务必添加您的贡献!
+我们可以更新这些文档,但当我们从普通提交者之外获得贡献时,对每个人来说都容易得多。
diff --git a/docs_source_files/content/introduction/on_test_automation.en.md b/docs_source_files/content/introduction/on_test_automation.en.md
new file mode 100644
index 00000000000..a383f0cd15c
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.en.md
@@ -0,0 +1,293 @@
+---
+title: "On test automation"
+weight: 2
+---
+
+First, start by asking yourself whether or not you really need to use a browser.
+Odds are that, at some point, if you are working on a complex web application,
+you will need to open a browser and actually test it.
+
+Functional end-user tests such as Selenium tests are expensive to run, however.
+Furthermore, they typically require substantial infrastructure
+to be in place to be run effectively.
+It is a good rule to always ask yourself if what you want to test
+can be done using more lightweight test approaches such as unit tests
+or with a lower-level approach.
+
+Once you have made the determination that you are in the web browser testing business,
+and you have your Selenium environment ready to begin writing tests,
+you will generally perform some combination of three steps:
+
+* Set up the data
+* Perform a discrete set of actions
+* Evaluate the results
+
+You will want to keep these steps as short as possible;
+one or two operations should be enough most of the time.
+Browser automation has the reputation of being “flaky”,
+but in reality that is because users frequently demand too much of it.
+In later chapters, we will return to techniques you can use
+to mitigate apparent intermittent problems in tests,
+in particular on how to [overcome race conditions]({{< ref "/webdriver/waits.en.md" >}})
+between the browser and WebDriver.
+
+By keeping your tests short
+and using the web browser only when you have absolutely no alternative,
+you can have many tests with minimal flake.
+
+A distinct advantage of Selenium tests
+are their inherent ability to test all components of the application,
+from backend to frontend, from a user's perspective.
+So in other words, whilst functional tests may be expensive to run,
+they also encompass large business-critical portions at one time.
+
+
+### Testing requirements
+
+As mentioned before, Selenium tests can be expensive to run.
+To what extent depends on the browser you are running the tests against,
+but historically browsers' behaviour has varied so much that it has often
+been a stated goal to cross-test against multiple browsers.
+
+Selenium allows you to run the same instructions against multiple browsers
+on multiple operating systems,
+but the enumeration of all the possible browsers,
+their different versions, and the many operating systems they run on
+will quickly become a non-trivial undertaking.
+
+
+### Let’s start with an example
+
+Larry has written a web site which allow users to order their own
+custom unicorns.
+
+The general workflow (what we will call the “happy path”) is something
+like this:
+
+* Create an account
+* Configure the unicorn
+* Add it to the shopping cart
+* Check out and pay
+* Give feedback about the unicorn
+
+
+It would be tempting to write one grand Selenium script
+to perform all these operations–many will try.
+**Resist the temptation!**
+Doing so will result in a test that
+a) takes a long time,
+b) will be subject to some common issues around page rendering timing issues, and
+c) is such that if it fails,
+it will not give you a concise, “glanceable” method for diagnosing what went wrong.
+
+The preferred strategy for testing this scenario would be
+to break it down to a series of independent, speedy tests,
+each of which has one “reason” to exist.
+
+Let us pretend you want to test the second step:
+Configuring your unicorn.
+It will perform the following actions:
+
+* Create an account
+* Configure a unicorn
+
+Note that we are skipping the rest of these steps,
+we will test the rest of the workflow in other small, discrete test cases,
+after we are done with this one.
+
+To start off, you need to create an account.
+Here you have some choices to make:
+
+* Do you want to use an existing account?
+* Do you want to create a new account?
+* Are there any special properties of such a user that need to be
+ taken into account before configuration begins?
+
+Regardless of how you answer this question,
+the solution is to make it part of the "set up the data" portion of the test.
+If Larry has exposed an API which enables you (or anyone)
+to create and update user accounts,
+be sure to use that to answer this question.
+If possible, you want to launch the browser only after you have a user "in hand",
+whose credentials you can just log in with.
+
+If each test for each workflow begins with the creation of a user account,
+many seconds will be added to the execution of each test.
+Calling an API and talking to a database are quick,
+“headless” operations that don't require the expensive process of
+opening a browser, navigating to the right pages,
+clicking and waiting for the forms to be submitted, etc.
+
+Ideally, you can address this set-up phase in one line of code,
+which will execute before any browser is launched:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Create a user who has read-only permissions--they can configure a unicorn,
+// but they do not have payment information set up, nor do they have
+// administrative privileges. At the time the user is created, its email
+// address and password are randomly generated--you don't even need to
+// know them.
+User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
+
+// Log in as this user.
+// Logging in on this site takes you to your personal "My Account" page, so the
+// AccountPage object is returned by the loginAs method, allowing you to then
+// perform actions from the AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Create a user who has read-only permissions--they can configure a unicorn,
+# but they do not have payment information set up, nor do they have
+# administrative privileges. At the time the user is created, its email
+# address and password are randomly generated--you don't even need to
+# know them.
+user = user_factory.create_common_user() #This method is defined elsewhere.
+
+# Log in as this user.
+# Logging in on this site takes you to your personal "My Account" page, so the
+# AccountPage object is returned by the loginAs method, allowing you to then
+# perform actions from the AccountPage.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As you can imagine, the `UserFactory` can be extended
+to provide methods such as `createAdminUser()`, and `createUserWithPayment()`.
+The point is, these two lines of code do not distract you from the ultimate purpose of this test:
+configuring a unicorn.
+
+The intricacies of the [Page Object model]({{< ref "/guidelines_and_recommendations/page_object_models.en.md" >}})
+will be discussed in later chapters, but we will introduce the concept here:
+
+Your tests should be composed of actions,
+performed from the user's point of view,
+within the context of pages in the site.
+These pages are stored as objects,
+which will contain specific information about how the web page is composed
+and how actions are performed–
+very little of which should concern you as a tester.
+
+What kind of unicorn do you want?
+You might want pink, but not necessarily.
+Purple has been quite popular lately.
+Does she need sunglasses? Star tattoos?
+These choices, while difficult, are your primary concern as a tester–
+you need to ensure that your order fulfillment center
+sends out the right unicorn to the right person,
+and that starts with these choices.
+
+Notice that nowhere in that paragraph do we talk about buttons,
+fields, drop-downs, radio buttons, or web forms.
+**Neither should your tests!**
+You want to write your code like the user trying to solve their problem.
+Here is one way of doing this (continuing from the previous example):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The Unicorn is a top-level Object--it has attributes, which are set here.
+// This only stores the values; it does not fill out any web forms or interact
+// with the browser in any way.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Since we are already "on" the account page, we have to use it to get to the
+// actual place where you configure unicorns. Calling the "Add Unicorn" method
+// takes us there.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+// its createUnicorn() method. This method will take Sparkles' attributes,
+// fill out the form, and click submit.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The Unicorn is a top-level Object--it has attributes, which are set here.
+# This only stores the values; it does not fill out any web forms or interact
+# with the browser in any way.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Since we're already "on" the account page, we have to use it to get to the
+# actual place where you configure unicorns. Calling the "Add Unicorn" method
+# takes us there.
+add_unicorn_page = account_page.add_unicorn()
+
+# Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+# its createUnicorn() method. This method will take Sparkles' attributes,
+# fill out the form, and click submit.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Now that you have configured your unicorn,
+you need to move on to step 3: making sure it actually worked.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The exists() method from UnicornConfirmationPage will take the Sparkles
+// object--a specification of the attributes you want to see, and compare
+// them with the fields on the page.
+Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The exists() method from UnicornConfirmationPage will take the Sparkles
+# object--a specification of the attributes you want to see, and compare
+# them with the fields on the page.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Note that the tester still has not done anything but talk about unicorns in this code–
+no buttons, no locators, no browser controls.
+This method of _modelling_ the application
+allows you to keep these test-level commands in place and unchanging,
+even if Larry decides next week that he no longer likes Ruby-on-Rails
+and decides to re-implement the entire site
+in the latest Haskell bindings with a Fortran front-end.
+
+Your page objects will require some small maintenance
+in order to conform to the site redesign,
+but these tests will remain the same.
+Taking this basic design,
+you will want to keep going through your workflows with the fewest browser-facing steps possible.
+Your next workflow will involve adding a unicorn to the shopping cart.
+You will probably want many iterations of this test in order to make sure the cart is keeping its state properly:
+Is there more than one unicorn in the cart before you start?
+How many can fit in the shopping cart?
+If you create more than one with the same name and/or features, will it break?
+Will it only keep the existing one or will it add another?
+
+Each time you move through the workflow,
+you want to try to avoid having to create an account,
+login as the user, and configure the unicorn.
+Ideally, you will be able to create an account
+and pre-configure a unicorn via the API or database.
+Then all you have to do is log in as the user, locate Sparkles,
+and add her to the cart.
+
diff --git a/docs_source_files/content/introduction/on_test_automation.es.md b/docs_source_files/content/introduction/on_test_automation.es.md
new file mode 100644
index 00000000000..bd539836823
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.es.md
@@ -0,0 +1,207 @@
+---
+title: "Sobre automatización de pruebas"
+weight: 2
+---
+
+
+Antes que nada, pregúntese si realmente necesita o no usar un navegador. Las probabilidades son buenas de que, en algún momento, si está trabajando en una aplicación web compleja, necesitará abrir un navegador y probarla.
+
+Sin embargo, las pruebas funcionales de usuario final, como las pruebas de Selenium, son caras de ejecutar. Además, por lo general requieren una infraestructura sustancial para poder funcionar de manera efectiva. Es una buena regla preguntarse siempre si lo que desea probar se puede hacer utilizando enfoques de prueba más livianos, como pruebas unitarias o con un enfoque de nivel inferior.
+
+Una vez que haya tomado la determinación de que está en el negocio de las pruebas con un navegador web, y tenga su entorno Selenium listo para comenzar a escribir las pruebas, generalmente realizará una combinación de tres pasos:
+
+* Configurar los datos
+* Realizar un conjunto discreto de acciones
+* Evaluar los resultados
+
+Deberá mantener estos pasos lo más cortos posible; una o dos operaciones deberían ser suficientes la mayor parte del tiempo. La automatización del navegador tiene la reputación de ser "inestable", pero en realidad eso se debe a que los usuarios suelen exigir demasiado. En capítulos posteriores, volveremos a las técnicas que puede usar para mitigar aparentes problemas intermitentes en las pruebas, en particular sobre cómo [superar las condiciones de carrera]({{}}) entre el navegador y WebDriver.
+
+Al mantener sus pruebas cortas y usar el navegador web solo cuando no tiene absolutamente ninguna alternativa, puede realizar muchas pruebas con un minimo desgaste.
+
+Una ventaja distintiva de las pruebas de Selenium es su capacidad inherente para probar todos los componentes de la aplicación, desde el backend hasta el frontend, desde la perspectiva del usuario. En otras palabras, si bien las pruebas funcionales pueden ser costosas de ejecutar, también abarcan grandes porciones críticas para el negocio al mismo tiempo.
+
+
+### Requisitos de prueba
+
+Como se mencionó anteriormente, las pruebas de Selenium pueden ser costosas de ejecutar. Incluso depende del navegador con el que esté ejecutando las pruebas, pero históricamente el comportamiento de los navegadores ha variado tanto que a menudo ha sido un objetivo declarado realizar pruebas con múltiples navegadores (_cross browser_).
+
+Selenium le permite ejecutar las mismas instrucciones en múltiples navegadores y en múltiples sistemas operativos, pero la enumeración de todos los navegadores posibles, sus diferentes versiones y los muchos sistemas operativos en los que se ejecutan se le convertirá rápidamente en una tarea compleja.
+
+
+### Comencemos con un ejemplo
+
+Larry ha escrito un sitio web que permite a los usuarios ordenar sus propios unicornios personalizados.
+
+El flujo de trabajo general (lo que llamaremos el "camino feliz") es algo como esto:
+
+* Crea una cuenta
+* Configurar tu unicornio
+* Agrégalo al carrito de compras
+* Echa un vistazo y paga
+* Dar comentarios sobre tu unicornio
+
+
+Sería tentador escribir un gran script Selenium para realizar todas estas operaciones, muchos lo intentarán.
+**¡Resista la tentación!**
+Hacerlo dará como resultado una prueba que
+a) lleva mucho tiempo,
+b) estará sujeto a algunos problemas comunes relacionados con los problemas de tiempo de renderizado de la página, y
+c) es tal que si falla, no le dará un método conciso y "fácil de ver" para diagnosticar lo que salió mal.
+
+La estrategia preferida para probar este escenario sería dividirlo en una serie de pruebas rápidas e independientes, cada una de las cuales tiene una "razón" para existir.
+
+Supongamos que quieres probar el segundo paso:
+Configurando tu unicornio.
+Deberá realizar las siguientes acciones:
+
+* Crea una cuenta
+* Configurar un unicornio
+
+Tenga en cuenta que estamos omitiendo el resto de estos pasos, probaremos el resto del flujo de trabajo en otros casos de prueba pequeños y discretos, una vez que hayamos terminado con este.
+
+Para comenzar, debe crear una cuenta. Aquí tienes algunas opciones a resolver:
+
+* ¿Quieres usar una cuenta existente?
+* ¿Quieres crear una nueva cuenta?
+* ¿Hay alguna propiedad especial de dicho usuario que deba tenerse en cuenta antes de que comience la configuración?
+
+Independientemente de cómo responda estas preguntas, la solución es hacer que forme parte del flujo de "configurar los datos" de la prueba –si Larry ha expuesto una API que le permite a usted (o cualquier persona) crear y actualizar cuentas de usuario, asegúrese de usarla para responder esta situación– si es posible, lo deseable es iniciar el navegador solo después de tener un usuario disponible, cuyas credenciales le permitan iniciar sesión.
+
+Si cada prueba para cada flujo de trabajo comienza con la creación de una cuenta de usuario, se agregarán muchos segundos a la ejecución de cada prueba. Llamar a una API y hablar con una base de datos son operaciones rápidas y sin interfaz gráfica (_headless_) que no requieren el costoso proceso de abrir un navegador, navegar a las páginas correctas, hacer clic y esperar a que se envíen los formularios, etc.
+
+Idealmente, puede abordar esta fase de configuración en una línea de código, que se ejecutará antes de que se inicie cualquier navegador:
+
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Cree un usuario que tenga permisos de solo lectura: puede configurar un unicornio,
+// pero no tienen configurada la información de pago, ni tienen
+// privilegios administrativos. En el momento en que se cree el usuario, su correo electrónico
+// la dirección y la contraseña se generan aleatoriamente; ni siquiera necesita
+// conocerlos.
+User user = UserFactory.createCommonUser(); // Este método se define en otra parte.
+
+// Inicie sesión como este usuario.
+// Iniciar sesión en este sitio lo lleva a su página personal "Mi cuenta", por lo que
+// El método loginAs devuelve el objeto AccountPage, lo que le permite
+// realiza acciones desde AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Cree un usuario que tenga permisos de solo lectura: puede configurar un unicornio,
+# pero no tienen configurada la información de pago, ni tienen
+# Privilegios administrativos. En el momento en que se crea el usuario, su correo electrónico
+# la dirección y la contraseña se generan aleatoriamente; ni siquiera necesita
+# conocerlos.
+user = user_factory.create_common_user() #Este método se define en otra parte.
+
+# Inicie sesión como este usuario.
+# Iniciar sesión en este sitio lo lleva a su página personal "Mi cuenta", por lo que
+# El objeto loginAs devuelve el objeto AccountPage, lo que le permite
+# realizar acciones desde la página de cuenta.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// Todavía no tenemos una muestra de código C# - ayúdenos y genere un PR (pull request)
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Todavía no tenemos una muestra de código en Ruby - ayúdenos y genere un PR (pull request)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// Todavía no tenemos una muestra de código JavaScript - ayúdenos y genere un PR (pull request)
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Como se puede imaginar, la `UserFactory` se puede ampliar para proporcionar métodos como `createAdminUser()` y `createUserWithPayment()`. El punto es que estas dos líneas de código no le distraigan del objetivo final de esta prueba: configurar un unicornio.
+
+Las complejidades del [Modelo de objeto de página (_Page Object Model_)]({{}}) se analizarán en capítulos posteriores, pero presentaremos el concepto aquí:
+
+Sus pruebas deben estar compuestas de acciones, realizadas desde el punto de vista del usuario, dentro del contexto de las páginas del sitio. Estas páginas se almacenan como objetos, que contendrán información específica sobre cómo se compone la página web y cómo se realizan las acciones, muy poco de lo que debería preocuparte como _tester_.
+
+¿Qué tipo de unicornio quieres? Es posible que desee rosa, pero no necesariamente. El morado ha sido muy popular últimamente. ¿El necesita gafas de sol? ¿Tatuajes de estrellas? Estas elecciones, si bien son difíciles, son su principal preocupación como probador: debe asegurarse de que su centro de cumplimiento de pedidos envíe el unicornio correcto a la persona adecuada, y eso comienza con estas elecciones.
+
+Observe que en ninguna parte de ese párrafo hablamos de botones, campos, menús desplegables, botones de opción o formularios web.
+**¡Tampoco debería hacerlo sus pruebas!**
+Lo deseable es escribir el código como el usuario que intenta resolver su problema. Aquí hay una forma de hacerlo (continuando con el ejemplo anterior):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// El Unicornio es un Objeto de nivel superior: tiene atributos, que se establecen aquí.
+// Esto solo almacena los valores; no llena ningún formulario web ni interactúa
+// con el navegador de cualquier manera.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Como ya estamos "en" la página de la cuenta, tenemos que usarla para acceder al
+// lugar real donde configuras unicornios. Llamando al método "addUnicorn"
+// nos lleva allí.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Ahora que estamos en AddUnicornPage, pasaremos el objeto "sparkles"
+// al método createUnicorn(). Este método tomará los atributos de Sparkles,
+// llena el formulario y hace clic en el botón enviar.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# El Unicornio es un Objeto de nivel superior: tiene atributos, que se establecen aquí.
+# Esto solo almacena los valores; no llena ningún formulario web ni interactúa
+# con el navegador de cualquier manera.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Como ya estamos "en" la página de la cuenta, tenemos que usarla para acceder a
+# lugar real donde se configuran los unicornios. Llamando al método "addUnicorn"
+# nos lleva allí.
+add_unicorn_page = account_page.add_unicorn()
+
+# Ahora que estamos en AddUnicornPage, pasaremos el objeto "sparkles" a
+# su método createUnicorn(). Este método tomará los atributos de Sparkles,
+# completará el formulario y haga clic en enviar.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// Todavía no tenemos una muestra de código en C# - ayúdanos y genera un PR (pull request)
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Todavía no tenemos una muestra de código en Ruby - ayúdanos y genera un PR (pull request)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// Todavía no tenemos una muestra de código en JavaScript - ayúdanos y genera un PR (pull request)
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Ahora que ha configurado su unicornio, debe continuar al paso 3: asegurarse de que realmente funcionó.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// El método exist() de UnicornConfirmationPage tomará Sparkles
+// objeto: una especificación de los atributos que desea ver y compararlos
+// con los campos en la página.
+Assert.assertTrue("Deben haberse creado Sparkles, con todos los atributos intactos.", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# El método exist() de UnicornConfirmationPage tomará Sparkles
+# objeto: una especificación de los atributos que desea ver y compararlos
+# con los campos en la página.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Todavía no tenemos una muestra de código en Ruby - ayúdanos y genera un PR (pull request)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// Todavía no tenemos una muestra de código en JavaScript - ayúdanos y genera un PR (pull request)
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Tenga en cuenta que el _tester_ aún no ha hecho nada más que hablar de unicornios en este código, sin botones, sin localizadores, sin controles del navegador.
+Este método de "modelado" de la aplicación le permite mantener estos comandos de nivel de prueba en su lugar y sin cambios, incluso si Larry decide la próxima semana que ya no le gusta Ruby-on-Rails y decide volver a implementar todo el sitio con las librerías más recientes de Haskell y con un front-end en Fortran.
+
+Los objetos de su página requerirán un pequeño mantenimiento para cumplir con el rediseño del sitio, pero estas pruebas seguirán siendo las mismas. Tomando este diseño básico, querrá continuar con sus flujos de trabajo con la menor cantidad posible de pasos orientados hacia el navegador. Su próximo flujo de trabajo implicará agregar un unicornio al carrito de compras. Probablemente requeriá muchas iteraciones de esta prueba para asegurarse de que el carrito mantenga su estado correctamente:
+¿Hay más de un unicornio en el carrito antes de comenzar?
+¿Cuántos pueden caber en el carrito de compras?
+Si crea más de uno con el mismo nombre o características, ¿se romperá? ¿Conservará solo el existente o agregará otro?
+
+Cada vez que se mueva por el flujo de trabajo, debe intentar evitar tener que crear una cuenta, iniciar sesión como usuario y configurar el unicornio. Idealmente, podrá crear una cuenta y preconfigurar un unicornio a través de la API o la base de datos. Luego, todo lo que tiene que hacer es iniciar sesión como usuario, localizar Sparkles y agregarla al carrito.
+
diff --git a/docs_source_files/content/introduction/on_test_automation.fr.md b/docs_source_files/content/introduction/on_test_automation.fr.md
new file mode 100644
index 00000000000..6816f207ec1
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.fr.md
@@ -0,0 +1,299 @@
+---
+title: "A propos du test automatisé"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First, start by asking yourself whether or not you really need to use a browser.
+Odds are good that, at some point, if you're working on a complex web application,
+you will need to open a browser and actually test it.
+
+Functional end-user tests such as Selenium tests are expensive to run, however.
+Furthermore, they typically require substantial infrastructure
+to be in place to be run effectively.
+It's a good rule to always ask yourself if what you want to test
+can be done using more lightweight test approaches such as unit tests
+or with a lower-level approach.
+
+Once you have made the determination that you're in the web browser testing business,
+and you have your Selenium environment ready to begin writing tests,
+you will generally perform some combination of three steps:
+
+* Set up the data
+* Perform a discrete set of actions
+* Evaluate the results
+
+You will want to keep these steps as short as possible;
+one to two operations should be enough much of the time.
+Browser automation has the reputation of being “flaky”,
+but in reality that is because users frequently demand too much of it.
+In later chapters, we will return to techniques you can use
+to mitigate apparent intermittent problems in tests,
+in particular on how to [overcome race conditions]({{< ref "/webdriver/waits.fr.md" >}})
+between the browser and WebDriver.
+
+By keeping your tests short
+and using the web browser only when you have absolutely no alternative,
+you can have many tests with minimal flake.
+
+A distinct advantage of Selenium tests
+are their inherent ability to test all components of the application,
+from backend to frontend, from a user's perspective.
+So in other words, whilst functional tests may be expensive to run,
+they also encompass large business-critical portions at one time.
+
+
+### Testing requirements
+
+As mentioned before, Selenium tests can be expensive to run.
+To what extent depends on the browser you're running the tests against,
+but historically browsers' behaviour has varied so much that it has often
+been a stated goal to cross-test against multiple browsers.
+
+Selenium allows you to run the same instructions against multiple browsers
+on multiple operating systems,
+but the enumeration of all the possible browsers,
+their different versions, and the many operating systems they run on
+will quickly become a non-trivial undertaking.
+
+
+### Let’s start with an example
+
+Larry has written a web site which allows users to order their own
+custom unicorns.
+
+The general workflow (what we'll call the “happy path”) is something
+like this:
+
+* Create an account
+* Configure their unicorn
+* Add her to the shopping cart
+* Check out and pay
+* Give feedback about their unicorn
+
+
+It would be tempting to write one grand Selenium script
+to perform all these operations–many will try.
+**Resist the temptation!**
+Doing so will result in a test that
+a) takes a long time,
+b) will be subject to some common issues around page rendering timing issues, and
+c) is such that if it fails,
+it won't give you a concise, “glanceable” method for diagnosing what went wrong.
+
+The preferred strategy for testing this scenario would be
+to break it down to a series of independent, speedy tests,
+each of which has one “reason” to exist.
+
+Let's pretend you want to test the second step:
+Configuring your unicorn.
+It will perform the following actions:
+
+* Create an account
+* Configure a unicorn
+
+Note that we're skipping the rest of these steps,
+we will test the rest of the workflow in other small, discrete test cases,
+after we're done with this one.
+
+To start off, you need to create an account.
+Here you have some choices to make:
+
+* Do you want to use an existing account?
+* Do you want to create a new account?
+* Are there any special properties of such a user that need to be
+ taken into account before configuration begins?
+
+Regardless of how you answer this question,
+the solution is to make it part of the "set up the data" portion of the test–
+if Larry has exposed an API which enables you (or anyone)
+to create and update user accounts,
+be sure to use that to answer this question–
+if possible, you want to launch the browser only after you have a user "in hand",
+whose credentials you can just log in with.
+
+If each test for each workflow begins with the creation of a user account,
+many seconds will be added to the execution of each test.
+Calling an API and talking to a database are quick,
+“headless” operations that don't require the expensive process of
+opening a browser, navigating to the right pages,
+clicking and waiting for the forms to be submitted, etc.
+
+Ideally, you can address this set-up phase in one line of code,
+which will execute before any browser is launched:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Create a user who has read-only permissions--they can configure a unicorn,
+// but they do not have payment information set up, nor do they have
+// administrative privileges. At the time the user is created, its email
+// address and password are randomly generated--you don't even need to
+// know them.
+User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
+
+// Log in as this user.
+// Logging in on this site takes you to your personal "My Account" page, so the
+// AccountPage object is returned by the loginAs method, allowing you to then
+// perform actions from the AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Create a user who has read-only permissions--they can configure a unicorn,
+# but they do not have payment information set up, nor do they have
+# administrative privileges. At the time the user is created, its email
+# address and password are randomly generated--you don't even need to
+# know them.
+user = user_factory.create_common_user() #This method is defined elsewhere.
+
+# Log in as this user.
+# Logging in on this site takes you to your personal "My Account" page, so the
+# AccountPage object is returned by the loginAs method, allowing you to then
+# perform actions from the AccountPage.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As you can imagine, the `UserFactory` can be extended
+to provide methods such as `createAdminUser()`, and `createUserWithPayment()`.
+The point is, these two lines of code do not distract you from the ultimate purpose of this test:
+configuring a unicorn.
+
+The intricacies of the [Page Object model]({{< ref "/guidelines_and_recommendations/page_object_models.fr.md" >}})
+will be discussed in later chapters, but we will introduce the concept here:
+
+Your tests should be composed of actions,
+performed from the user's point of view,
+within the context of pages in the site.
+These pages are stored as objects,
+which will contain specific information about how the web page is composed
+and how actions are performed–
+very little of which should concern you as a tester.
+
+What kind of unicorn do you want?
+You might want pink, but not necessarily.
+Purple has been quite popular lately.
+Does she need sunglasses? Star tattoos?
+These choices, while difficult, are your primary concern as a tester–
+you need to ensure that your order fulfillment center
+sends out the right unicorn to the right person,
+and that starts with these choices.
+
+Notice that nowhere in that paragraph do we talk about buttons,
+fields, drop-downs, radio buttons, or web forms.
+**Neither should your tests!**
+You want to write your code like the user trying to solve their problem.
+Here is one way of doing this (continuing from the previous example):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The Unicorn is a top-level Object--it has attributes, which are set here.
+// This only stores the values; it does not fill out any web forms or interact
+// with the browser in any way.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Since we're already "on" the account page, we have to use it to get to the
+// actual place where you configure unicorns. Calling the "Add Unicorn" method
+// takes us there.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+// its createUnicorn() method. This method will take Sparkles' attributes,
+// fill out the form, and click submit.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The Unicorn is a top-level Object--it has attributes, which are set here.
+# This only stores the values; it does not fill out any web forms or interact
+# with the browser in any way.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Since we're already "on" the account page, we have to use it to get to the
+# actual place where you configure unicorns. Calling the "Add Unicorn" method
+# takes us there.
+add_unicorn_page = account_page.add_unicorn()
+
+# Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+# its createUnicorn() method. This method will take Sparkles' attributes,
+# fill out the form, and click submit.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Now that you've configured your unicorn,
+you need to move on to step 3: making sure it actually worked.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The exists() method from UnicornConfirmationPage will take the Sparkles
+// object--a specification of the attributes you want to see, and compare
+// them with the fields on the page.
+Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The exists() method from UnicornConfirmationPage will take the Sparkles
+# object--a specification of the attributes you want to see, and compare
+# them with the fields on the page.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Note that the tester still hasn't done anything but talk about unicorns in this code–
+no buttons, no locators, no browser controls.
+This method of _modelling_ the application
+allows you to keep these test-level commands in place and unchanging,
+even if Larry decides next week that he no longer likes Ruby-on-Rails
+and decides to re-implement the entire site
+in the latest Haskell bindings with a Fortran front-end.
+
+Your page objects will require some small maintenance
+in order to conform to the site redesign,
+but these tests will remain the same.
+Taking this basic design,
+you will want to keep going through your workflows with the fewest browser-facing steps possible.
+Your next workflow will involve adding a unicorn to the shopping cart.
+You will probably want many iterations of this test in order to make sure the cart is keeping its state properly:
+Is there more than one unicorn in the cart before you start?
+How many can fit in the shopping cart?
+If you create more than one with the same name and/or features, will it break?
+Will it only keep the existing one or will it add another?
+
+Each time you move through the workflow,
+you want to try to avoid having to create an account,
+login as the user, and configure the unicorn.
+Ideally, you'll be able to create an account
+and pre-configure a unicorn via the API or database.
+Then all you have to do is log in as the user, locate Sparkles,
+and add her to the cart.
+
diff --git a/docs_source_files/content/introduction/on_test_automation.ja.md b/docs_source_files/content/introduction/on_test_automation.ja.md
new file mode 100644
index 00000000000..8a58ca0b824
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.ja.md
@@ -0,0 +1,297 @@
+---
+title: "On test automation"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+First, start by asking yourself whether or not you really need to use a browser.
+Odds are good that, at some point, if you're working on a complex web application,
+you will need to open a browser and actually test it.
+
+Functional end-user tests such as Selenium tests are expensive to run, however.
+Furthermore, they typically require substantial infrastructure
+to be in place to be run effectively.
+It's a good rule to always ask yourself if what you want to test
+can be done using more lightweight test approaches such as unit tests
+or with a lower-level approach.
+
+Once you have made the determination that you're in the web browser testing business,
+and you have your Selenium environment ready to begin writing tests,
+you will generally perform some combination of three steps:
+
+* Set up the data
+* Perform a discrete set of actions
+* Evaluate the results
+
+You will want to keep these steps as short as possible;
+one to two operations should be enough much of the time.
+Browser automation has the reputation of being “flaky”,
+but in reality that is because users frequently demand too much of it.
+In later chapters, we will return to techniques you can use
+to mitigate apparent intermittent problems in tests,
+in particular on how to [overcome race conditions]({{< ref "/webdriver/waits.ja.md" >}})
+between the browser and WebDriver.
+
+By keeping your tests short
+and using the web browser only when you have absolutely no alternative,
+you can have many tests with minimal flake.
+
+A distinct advantage of Selenium tests
+are their inherent ability to test all components of the application,
+from backend to frontend, from a user's perspective.
+So in other words, whilst functional tests may be expensive to run,
+they also encompass large business-critical portions at one time.
+
+
+### Testing requirements
+
+As mentioned before, Selenium tests can be expensive to run.
+To what extent depends on the browser you're running the tests against,
+but historically browsers' behaviour has varied so much that it has often
+been a stated goal to cross-test against multiple browsers.
+
+Selenium allows you to run the same instructions against multiple browsers
+on multiple operating systems,
+but the enumeration of all the possible browsers,
+their different versions, and the many operating systems they run on
+will quickly become a non-trivial undertaking.
+
+
+### Let’s start with an example
+
+Larry has written a web site which allows users to order their own
+custom unicorns.
+
+The general workflow (what we'll call the “happy path”) is something
+like this:
+
+* Create an account
+* Configure their unicorn
+* Add her to the shopping cart
+* Check out and pay
+* Give feedback about their unicorn
+
+
+It would be tempting to write one grand Selenium script
+to perform all these operations–many will try.
+**Resist the temptation!**
+Doing so will result in a test that
+a) takes a long time,
+b) will be subject to some common issues around page rendering timing issues, and
+c) is such that if it fails,
+it won't give you a concise, “glanceable” method for diagnosing what went wrong.
+
+The preferred strategy for testing this scenario would be
+to break it down to a series of independent, speedy tests,
+each of which has one “reason” to exist.
+
+Let's pretend you want to test the second step:
+Configuring your unicorn.
+It will perform the following actions:
+
+* Create an account
+* Configure a unicorn
+
+Note that we're skipping the rest of these steps,
+we will test the rest of the workflow in other small, discrete test cases,
+after we're done with this one.
+
+To start off, you need to create an account.
+Here you have some choices to make:
+
+* Do you want to use an existing account?
+* Do you want to create a new account?
+* Are there any special properties of such a user that need to be
+ taken into account before configuration begins?
+
+Regardless of how you answer this question,
+the solution is to make it part of the "set up the data" portion of the test–
+if Larry has exposed an API which enables you (or anyone)
+to create and update user accounts,
+be sure to use that to answer this question–
+if possible, you want to launch the browser only after you have a user "in hand",
+whose credentials you can just log in with.
+
+If each test for each workflow begins with the creation of a user account,
+many seconds will be added to the execution of each test.
+Calling an API and talking to a database are quick,
+“headless” operations that don't require the expensive process of
+opening a browser, navigating to the right pages,
+clicking and waiting for the forms to be submitted, etc.
+
+Ideally, you can address this set-up phase in one line of code,
+which will execute before any browser is launched:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Create a user who has read-only permissions--they can configure a unicorn,
+// but they do not have payment information set up, nor do they have
+// administrative privileges. At the time the user is created, its email
+// address and password are randomly generated--you don't even need to
+// know them.
+User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
+
+// Log in as this user.
+// Logging in on this site takes you to your personal "My Account" page, so the
+// AccountPage object is returned by the loginAs method, allowing you to then
+// perform actions from the AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Create a user who has read-only permissions--they can configure a unicorn,
+# but they do not have payment information set up, nor do they have
+# administrative privileges. At the time the user is created, its email
+# address and password are randomly generated--you don't even need to
+# know them.
+user = user_factory.create_common_user() #This method is defined elsewhere.
+
+# Log in as this user.
+# Logging in on this site takes you to your personal "My Account" page, so the
+# AccountPage object is returned by the loginAs method, allowing you to then
+# perform actions from the AccountPage.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As you can imagine, the `UserFactory` can be extended
+to provide methods such as `createAdminUser()`, and `createUserWithPayment()`.
+The point is, these two lines of code do not distract you from the ultimate purpose of this test:
+configuring a unicorn.
+
+The intricacies of the [Page Object model]({{< ref "/guidelines_and_recommendations/page_object_models.ja.md" >}})
+will be discussed in later chapters, but we will introduce the concept here:
+
+Your tests should be composed of actions,
+performed from the user's point of view,
+within the context of pages in the site.
+These pages are stored as objects,
+which will contain specific information about how the web page is composed
+and how actions are performed–
+very little of which should concern you as a tester.
+
+What kind of unicorn do you want?
+You might want pink, but not necessarily.
+Purple has been quite popular lately.
+Does she need sunglasses? Star tattoos?
+These choices, while difficult, are your primary concern as a tester–
+you need to ensure that your order fulfillment center
+sends out the right unicorn to the right person,
+and that starts with these choices.
+
+Notice that nowhere in that paragraph do we talk about buttons,
+fields, drop-downs, radio buttons, or web forms.
+**Neither should your tests!**
+You want to write your code like the user trying to solve their problem.
+Here is one way of doing this (continuing from the previous example):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The Unicorn is a top-level Object--it has attributes, which are set here.
+// This only stores the values; it does not fill out any web forms or interact
+// with the browser in any way.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Since we're already "on" the account page, we have to use it to get to the
+// actual place where you configure unicorns. Calling the "Add Unicorn" method
+// takes us there.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+// its createUnicorn() method. This method will take Sparkles' attributes,
+// fill out the form, and click submit.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The Unicorn is a top-level Object--it has attributes, which are set here.
+# This only stores the values; it does not fill out any web forms or interact
+# with the browser in any way.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Since we're already "on" the account page, we have to use it to get to the
+# actual place where you configure unicorns. Calling the "Add Unicorn" method
+# takes us there.
+add_unicorn_page = account_page.add_unicorn()
+
+# Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+# its createUnicorn() method. This method will take Sparkles' attributes,
+# fill out the form, and click submit.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Now that you've configured your unicorn,
+you need to move on to step 3: making sure it actually worked.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The exists() method from UnicornConfirmationPage will take the Sparkles
+// object--a specification of the attributes you want to see, and compare
+// them with the fields on the page.
+Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The exists() method from UnicornConfirmationPage will take the Sparkles
+# object--a specification of the attributes you want to see, and compare
+# them with the fields on the page.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Note that the tester still hasn't done anything but talk about unicorns in this code–
+no buttons, no locators, no browser controls.
+This method of _modelling_ the application
+allows you to keep these test-level commands in place and unchanging,
+even if Larry decides next week that he no longer likes Ruby-on-Rails
+and decides to re-implement the entire site
+in the latest Haskell bindings with a Fortran front-end.
+
+Your page objects will require some small maintenance
+in order to conform to the site redesign,
+but these tests will remain the same.
+Taking this basic design,
+you will want to keep going through your workflows with the fewest browser-facing steps possible.
+Your next workflow will involve adding a unicorn to the shopping cart.
+You will probably want many iterations of this test in order to make sure the cart is keeping its state properly:
+Is there more than one unicorn in the cart before you start?
+How many can fit in the shopping cart?
+If you create more than one with the same name and/or features, will it break?
+Will it only keep the existing one or will it add another?
+
+Each time you move through the workflow,
+you want to try to avoid having to create an account,
+login as the user, and configure the unicorn.
+Ideally, you'll be able to create an account
+and pre-configure a unicorn via the API or database.
+Then all you have to do is log in as the user, locate Sparkles,
+and add her to the cart.
diff --git a/docs_source_files/content/introduction/on_test_automation.nl.md b/docs_source_files/content/introduction/on_test_automation.nl.md
new file mode 100644
index 00000000000..a8de90826a4
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.nl.md
@@ -0,0 +1,299 @@
+---
+title: "On test automation"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First, start by asking yourself whether or not you really need to use a browser.
+Odds are good that, at some point, if you're working on a complex web application,
+you will need to open a browser and actually test it.
+
+Functional end-user tests such as Selenium tests are expensive to run, however.
+Furthermore, they typically require substantial infrastructure
+to be in place to be run effectively.
+It's a good rule to always ask yourself if what you want to test
+can be done using more lightweight test approaches such as unit tests
+or with a lower-level approach.
+
+Once you have made the determination that you're in the web browser testing business,
+and you have your Selenium environment ready to begin writing tests,
+you will generally perform some combination of three steps:
+
+* Set up the data
+* Perform a discrete set of actions
+* Evaluate the results
+
+You will want to keep these steps as short as possible;
+one to two operations should be enough much of the time.
+Browser automation has the reputation of being “flaky”,
+but in reality that is because users frequently demand too much of it.
+In later chapters, we will return to techniques you can use
+to mitigate apparent intermittent problems in tests,
+in particular on how to [overcome race conditions]({{< ref "/webdriver/waits.nl.md" >}})
+between the browser and WebDriver.
+
+By keeping your tests short
+and using the web browser only when you have absolutely no alternative,
+you can have many tests with minimal flake.
+
+A distinct advantage of Selenium tests
+are their inherent ability to test all components of the application,
+from backend to frontend, from a user's perspective.
+So in other words, whilst functional tests may be expensive to run,
+they also encompass large business-critical portions at one time.
+
+
+### Testing requirements
+
+As mentioned before, Selenium tests can be expensive to run.
+To what extent depends on the browser you're running the tests against,
+but historically browsers' behaviour has varied so much that it has often
+been a stated goal to cross-test against multiple browsers.
+
+Selenium allows you to run the same instructions against multiple browsers
+on multiple operating systems,
+but the enumeration of all the possible browsers,
+their different versions, and the many operating systems they run on
+will quickly become a non-trivial undertaking.
+
+
+### Let’s start with an example
+
+Larry has written a web site which allows users to order their own
+custom unicorns.
+
+The general workflow (what we'll call the “happy path”) is something
+like this:
+
+* Create an account
+* Configure their unicorn
+* Add her to the shopping cart
+* Check out and pay
+* Give feedback about their unicorn
+
+
+It would be tempting to write one grand Selenium script
+to perform all these operations–many will try.
+**Resist the temptation!**
+Doing so will result in a test that
+a) takes a long time,
+b) will be subject to some common issues around page rendering timing issues, and
+c) is such that if it fails,
+it won't give you a concise, “glanceable” method for diagnosing what went wrong.
+
+The preferred strategy for testing this scenario would be
+to break it down to a series of independent, speedy tests,
+each of which has one “reason” to exist.
+
+Let's pretend you want to test the second step:
+Configuring your unicorn.
+It will perform the following actions:
+
+* Create an account
+* Configure a unicorn
+
+Note that we're skipping the rest of these steps,
+we will test the rest of the workflow in other small, discrete test cases,
+after we're done with this one.
+
+To start off, you need to create an account.
+Here you have some choices to make:
+
+* Do you want to use an existing account?
+* Do you want to create a new account?
+* Are there any special properties of such a user that need to be
+ taken into account before configuration begins?
+
+Regardless of how you answer this question,
+the solution is to make it part of the "set up the data" portion of the test–
+if Larry has exposed an API which enables you (or anyone)
+to create and update user accounts,
+be sure to use that to answer this question–
+if possible, you want to launch the browser only after you have a user "in hand",
+whose credentials you can just log in with.
+
+If each test for each workflow begins with the creation of a user account,
+many seconds will be added to the execution of each test.
+Calling an API and talking to a database are quick,
+“headless” operations that don't require the expensive process of
+opening a browser, navigating to the right pages,
+clicking and waiting for the forms to be submitted, etc.
+
+Ideally, you can address this set-up phase in one line of code,
+which will execute before any browser is launched:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Create a user who has read-only permissions--they can configure a unicorn,
+// but they do not have payment information set up, nor do they have
+// administrative privileges. At the time the user is created, its email
+// address and password are randomly generated--you don't even need to
+// know them.
+User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
+
+// Log in as this user.
+// Logging in on this site takes you to your personal "My Account" page, so the
+// AccountPage object is returned by the loginAs method, allowing you to then
+// perform actions from the AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Create a user who has read-only permissions--they can configure a unicorn,
+# but they do not have payment information set up, nor do they have
+# administrative privileges. At the time the user is created, its email
+# address and password are randomly generated--you don't even need to
+# know them.
+user = user_factory.create_common_user() #This method is defined elsewhere.
+
+# Log in as this user.
+# Logging in on this site takes you to your personal "My Account" page, so the
+# AccountPage object is returned by the loginAs method, allowing you to then
+# perform actions from the AccountPage.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+As you can imagine, the `UserFactory` can be extended
+to provide methods such as `createAdminUser()`, and `createUserWithPayment()`.
+The point is, these two lines of code do not distract you from the ultimate purpose of this test:
+configuring a unicorn.
+
+The intricacies of the [Page Object model]({{< ref "/guidelines_and_recommendations/page_object_models.nl.md" >}})
+will be discussed in later chapters, but we will introduce the concept here:
+
+Your tests should be composed of actions,
+performed from the user's point of view,
+within the context of pages in the site.
+These pages are stored as objects,
+which will contain specific information about how the web page is composed
+and how actions are performed–
+very little of which should concern you as a tester.
+
+What kind of unicorn do you want?
+You might want pink, but not necessarily.
+Purple has been quite popular lately.
+Does she need sunglasses? Star tattoos?
+These choices, while difficult, are your primary concern as a tester–
+you need to ensure that your order fulfillment center
+sends out the right unicorn to the right person,
+and that starts with these choices.
+
+Notice that nowhere in that paragraph do we talk about buttons,
+fields, drop-downs, radio buttons, or web forms.
+**Neither should your tests!**
+You want to write your code like the user trying to solve their problem.
+Here is one way of doing this (continuing from the previous example):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The Unicorn is a top-level Object--it has attributes, which are set here.
+// This only stores the values; it does not fill out any web forms or interact
+// with the browser in any way.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Since we're already "on" the account page, we have to use it to get to the
+// actual place where you configure unicorns. Calling the "Add Unicorn" method
+// takes us there.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+// its createUnicorn() method. This method will take Sparkles' attributes,
+// fill out the form, and click submit.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The Unicorn is a top-level Object--it has attributes, which are set here.
+# This only stores the values; it does not fill out any web forms or interact
+# with the browser in any way.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Since we're already "on" the account page, we have to use it to get to the
+# actual place where you configure unicorns. Calling the "Add Unicorn" method
+# takes us there.
+add_unicorn_page = account_page.add_unicorn()
+
+# Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+# its createUnicorn() method. This method will take Sparkles' attributes,
+# fill out the form, and click submit.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Now that you've configured your unicorn,
+you need to move on to step 3: making sure it actually worked.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The exists() method from UnicornConfirmationPage will take the Sparkles
+// object--a specification of the attributes you want to see, and compare
+// them with the fields on the page.
+Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The exists() method from UnicornConfirmationPage will take the Sparkles
+# object--a specification of the attributes you want to see, and compare
+# them with the fields on the page.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Note that the tester still hasn't done anything but talk about unicorns in this code–
+no buttons, no locators, no browser controls.
+This method of _modelling_ the application
+allows you to keep these test-level commands in place and unchanging,
+even if Larry decides next week that he no longer likes Ruby-on-Rails
+and decides to re-implement the entire site
+in the latest Haskell bindings with a Fortran front-end.
+
+Your page objects will require some small maintenance
+in order to conform to the site redesign,
+but these tests will remain the same.
+Taking this basic design,
+you will want to keep going through your workflows with the fewest browser-facing steps possible.
+Your next workflow will involve adding a unicorn to the shopping cart.
+You will probably want many iterations of this test in order to make sure the cart is keeping its state properly:
+Is there more than one unicorn in the cart before you start?
+How many can fit in the shopping cart?
+If you create more than one with the same name and/or features, will it break?
+Will it only keep the existing one or will it add another?
+
+Each time you move through the workflow,
+you want to try to avoid having to create an account,
+login as the user, and configure the unicorn.
+Ideally, you'll be able to create an account
+and pre-configure a unicorn via the API or database.
+Then all you have to do is log in as the user, locate Sparkles,
+and add her to the cart.
+
diff --git a/docs_source_files/content/introduction/on_test_automation.zh-cn.md b/docs_source_files/content/introduction/on_test_automation.zh-cn.md
new file mode 100644
index 00000000000..8615a7468b8
--- /dev/null
+++ b/docs_source_files/content/introduction/on_test_automation.zh-cn.md
@@ -0,0 +1,246 @@
+---
+title: "关于测试自动化"
+weight: 2
+---
+
+首先,问问自己是否真的需要使用浏览器。
+在某些情况下,如果您正在开发一个复杂的 web 应用程序,
+您需要打开一个浏览器并进行实际测试,这种可能性是很大的。
+
+然而,诸如 Selenium 之类的功能性最终用户测试运行起来很昂贵。
+此外,它们通常需要大量的基础设施才能有效运行。
+经常问问自己,您想要测试的东西是否可以使用更轻量级的测试方法(如单元测试)完成,
+还是使用较低级的方法完成,这是一个很好的规则。
+
+一旦确定您正在进行Web浏览器测试业务,
+并且您的 Selenium 环境已经准备好开始编写测试,
+您通常会执行以下三个步骤的组合:
+
+* 设置数据
+* 执行一组离散的操作
+* 评估结果
+
+您需要尽可能缩短这些步骤;
+一到两个操作在大多数时间内应该足够了。
+浏览器自动化具有“脆弱”的美誉,
+但实际上那是因为用户经常对它要求过高。
+在后面的章节中,我们将回到您可以使用的技术,
+为了缓解测试中明显的间歇性问题,
+特别是如何克服 浏览器 和 WebDriver 之间的[竞争条件]({{< ref "/webdriver/waits.zh-cn.md" >}})。
+
+通过保持测试简短并仅在您完全没有替代方案时使用Web浏览器,您可以用最小的代码片段来完成很多测试。
+
+Selenium测试的一个显著优势是,它能够从用户的角度测试应用程序的所有组件(从后端到前端)。
+因此,换句话说,虽然功能测试运行起来可能很昂贵,但它们同时也包含了大量关键业务部分。
+
+### 测试要求
+
+如前所述,Selenium 测试运行起来可能很昂贵。
+在多大程度上取决于您正在运行测试的浏览器,
+但历史上浏览器的行为变化太大,以至于通常是针对多个浏览器进行交叉测试的既定目标。
+
+Selenium 允许您在多个操作系统上的多个浏览器上运行相同的指令,
+但是对所有可能的浏览器、它们的不同版本以及它们所运行的许多操作系统的枚举将很快成为一项繁重的工作。
+
+### 让我们从一个例子开始
+
+Larry 写了一个网站,允许用户订购他们自己定制的独角兽。
+
+一般的工作流程(我们称之为“幸福之路”)是这样的:
+
+* 创建一个账户
+* 配置他们的独角兽
+* 添加到购物车
+* 检验并付款
+* 给出关于他们独角兽的反馈
+
+编写一个宏大的 Selenium 脚本来执行所有这些操作是很诱人的 — 很多人都会尝试这样做。
+**抵制诱惑!**
+这样做会导致测试:
+a) 需要很长时间;
+b) 会受到一些与页面呈现时间问题有关的常见问题的影响;
+c) 如果失败,它不会给出一个简洁的、“可检查”的方法来诊断出了什么问题。
+
+测试此场景的首选策略是将其分解为一系列独立的、快速的测试,每个测试都有一个存在的“理由”。
+
+假设您想测试第二步:
+配置您的独角兽。
+它将执行以下操作:
+
+* 创建一个帐户
+* 配置一个独角兽
+
+请注意,我们跳过了这些步骤的其余部分,
+在完成这一步之后,我们将在其他小的、离散的测试用例中测试工作流的其余部分。
+
+首先,您需要创建一个帐户。在这里您可以做出一些选择:
+
+* 您想使用现有帐户吗?
+* 您想创建一个新帐户吗?
+* 在配置开始之前,是否需要考虑有任何特殊属性的用户需要吗?
+
+不管您如何回答这个问题,
+解决方案是让它成为测试中“设置数据”部分的一部分 - 如果 Larry 公开了一个 API,
+使您(或任何人)能够创建和更新用户帐户,
+一定要用它来回答这个问题
+请确保使用这个 API 来回答这个问题 — 如果可能的话,
+您希望只有在您拥有一个用户之后才启动浏览器,您可以使用该用户的凭证进行登录。
+
+如果每个工作流的每个测试都是从创建用户帐户开始的,那么每个测试的执行都会增加许多秒。
+调用 API 并与数据库进行通信是快速、“无头”的操作,
+不需要打开浏览器、导航到正确页面、点击并等待表单提交等昂贵的过程。
+
+理想情况下,您可以在一行代码中处理这个设置阶段,这些代码将在任何浏览器启动之前执行:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Create a user who has read-only permissions--they can configure a unicorn,
+// but they do not have payment information set up, nor do they have
+// administrative privileges. At the time the user is created, its email
+// address and password are randomly generated--you don't even need to
+// know them.
+User user = UserFactory.createCommonUser(); //This method is defined elsewhere.
+
+// Log in as this user.
+// Logging in on this site takes you to your personal "My Account" page, so the
+// AccountPage object is returned by the loginAs method, allowing you to then
+// perform actions from the AccountPage.
+AccountPage accountPage = loginAs(user.getEmail(), user.getPassword());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Create a user who has read-only permissions--they can configure a unicorn,
+# but they do not have payment information set up, nor do they have
+# administrative privileges. At the time the user is created, its email
+# address and password are randomly generated--you don't even need to
+# know them.
+user = user_factory.create_common_user() #This method is defined elsewhere.
+
+# Log in as this user.
+# Logging in on this site takes you to your personal "My Account" page, so the
+# AccountPage object is returned by the loginAs method, allowing you to then
+# perform actions from the AccountPage.
+account_page = login_as(user.get_email(), user.get_password())
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+您可以想象,`UserFactory`可以扩展为提供诸如`createAdminUser()`、`createUserWithPayment()`的方法。
+关键是,这两行代码不会分散您对此测试的最终目的的注意力:
+配置独角兽。
+
+[页面对象模型]({{< ref "/guidelines_and_recommendations/page_object_models.zh-cn.md" >}})
+的复杂性将在后面的章节中讨论,但我们将在这里介绍这个概念:
+
+您的测试应该由操作组成,从用户的角度出发,在站点的页面上下文中执行。
+这些页面被存储为对象,
+其中包含关于 web 页面如何组成以及如何执行操作的特定信息 — 作为测试人员,您应该很少关注这些信息。
+
+您想要什么样的独角兽?
+您可能想要粉红色,但不一定。
+紫色最近很流行。
+她需要太阳镜吗?
+明星纹身?
+这些选择虽然困难,但是作为测试人员,
+您的主要关注点是 — 您需要确保您的订单履行中心将正确的独角兽发送给正确的人,而这就要从这些选择开始。
+
+请注意,我们在该段落中没有讨论按钮,字段,下拉菜单,单选按钮或 Web 表单。
+**您的测试也不应该!**
+您希望像尝试解决问题的用户一样编写代码。
+这是一种方法(从前面的例子继续):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The Unicorn is a top-level Object--it has attributes, which are set here.
+// This only stores the values; it does not fill out any web forms or interact
+// with the browser in any way.
+Unicorn sparkles = new Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS);
+
+// Since we're already "on" the account page, we have to use it to get to the
+// actual place where you configure unicorns. Calling the "Add Unicorn" method
+// takes us there.
+AddUnicornPage addUnicornPage = accountPage.addUnicorn();
+
+// Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+// its createUnicorn() method. This method will take Sparkles' attributes,
+// fill out the form, and click submit.
+UnicornConfirmationPage unicornConfirmationPage = addUnicornPage.createUnicorn(sparkles);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The Unicorn is a top-level Object--it has attributes, which are set here.
+# This only stores the values; it does not fill out any web forms or interact
+# with the browser in any way.
+sparkles = Unicorn("Sparkles", UnicornColors.PURPLE, UnicornAccessories.SUNGLASSES, UnicornAdornments.STAR_TATTOOS)
+
+# Since we're already "on" the account page, we have to use it to get to the
+# actual place where you configure unicorns. Calling the "Add Unicorn" method
+# takes us there.
+add_unicorn_page = account_page.add_unicorn()
+
+# Now that we're on the AddUnicornPage, we will pass the "sparkles" object to
+# its createUnicorn() method. This method will take Sparkles' attributes,
+# fill out the form, and click submit.
+unicorn_confirmation_page = add_unicorn_page.create_unicorn(sparkles)
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+既然您已经配置好了独角兽,
+您需要进入第三步:确保它确实有效。
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// The exists() method from UnicornConfirmationPage will take the Sparkles
+// object--a specification of the attributes you want to see, and compare
+// them with the fields on the page.
+Assert.assertTrue("Sparkles should have been created, with all attributes intact", unicornConfirmationPage.exists(sparkles));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# The exists() method from UnicornConfirmationPage will take the Sparkles
+# object--a specification of the attributes you want to see, and compare
+# them with the fields on the page.
+assert unicorn_confirmation_page.exists(sparkles), "Sparkles should have been created, with all attributes intact"
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+请注意,测试人员在这段代码中除了谈论独角兽之外还没有做任何事情 — 没有按钮、定位器和浏览器控件。
+这种对应用程序建模的方法允许您保持这些测试级别的命令不变,
+即使 Larry 下周决定不再喜欢 Ruby-on-Rails,
+并决定用最新的带有 Fortran 前端的 Haskell 绑定重新实现整个站点。
+
+为了符合站点的重新设计,您的页面对象需要进行一些小的维护,但是这些测试将保持不变。
+采用这一基本设计,您将希望继续使用尽可能少的面向浏览器的步骤来完成您的工作流。
+您的下一个工作流程将包括在购物车中添加独角兽。
+您可能需要多次迭代此测试,以确保购物车正确地保持其状态:
+在开始之前,购物车中是否有多个独角兽?
+购物车能装多少?
+如果您创建多个具有相同名称或特性,它会崩溃吗?
+它将只保留现有的一个还是添加另一个?
+
+每次通过工作流时,您都希望尽量避免创建帐户、以用户身份登录和配置独角兽。
+理想情况下,您将能够创建一个帐户,并通过 API 或数据库预先配置独角兽。
+然后,您只需作为用户登录,找到 Sparkles,并将它添加到购物车中。
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.en.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.en.md
new file mode 100644
index 00000000000..e12e35a6ef4
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.en.md
@@ -0,0 +1,117 @@
+---
+title: "The Selenium project and tools"
+weight: 1
+---
+
+### Selenium controls web browsers
+
+_Selenium_ is many things,
+but at its core it is a toolset for web browser automation
+that uses the best techniques available
+to remotely control browser instances
+and emulate a user's interaction with the browser.
+
+It allows users to simulate common activities performed by end-users;
+entering text into fields,
+selecting drop-down values and checking boxes,
+and clicking links in documents.
+It also provides many other controls such as mouse movement,
+arbitrary JavaScript execution, and much more.
+
+Although used primarily for front-end testing of websites,
+Selenium is at its core a browser user agent _library_.
+The interfaces are ubiquitous to their application,
+which encourages composition with other libraries to suit your purpose.
+
+
+### One interface to rule them all
+
+One of the project's guiding principles
+is to support a common interface for all (major) browser technologies.
+Web browsers are incredibly complex, highly engineered applications,
+performing their operations in completely different ways
+but which frequently look the same while doing so.
+Even though the text is rendered in the same fonts,
+the images are displayed in the same place
+and the links take you to the same destination.
+What is happening underneath is as different as night and day.
+Selenium “abstracts” these differences,
+hiding their details and intricacies from the person writing the code.
+This allows you to write several lines of code to perform a complicated workflow,
+but these same lines will execute on Firefox,
+Internet Explorer, Chrome, and all other supported browsers.
+
+
+### Tools and support
+
+Selenium's minimalist design approach gives it
+versatility to be included as a component in bigger applications.
+The surrounding infrastructure provided under the Selenium umbrella
+gives you the tools to put together
+your own [grid of browsers]({{< ref "/grid/_index.md" >}})
+so tests can be run on different browsers and multiple operating systems
+across a range of machines.
+
+Imagine a bank of computers in your server room or data centre
+all firing up browsers at the same time
+hitting your site's links, forms,
+and tables—testing your application 24 hours a day.
+Through the simple programming interface
+provided for the most common languages,
+these tests will run tirelessly in parallel,
+reporting back to you when errors occur.
+
+It is an aim to help make this a reality for you,
+by providing users with tools and documentation to not only control browsers,
+but to make it easy to scale and deploy such grids.
+
+
+### Who uses Selenium
+
+Many of the most important companies in the world
+have adopted Selenium for their browser-based testing,
+often replacing years-long efforts involving other proprietary tools.
+As it has grown in popularity, so have its requirements and challenges multiplied.
+
+As the web becomes more complicated
+and new technologies are added to websites,
+it's the mission of this project to keep up with them where possible.
+Being an open source project,
+this support is provided through the generous donation of time from many volunteers,
+every one of which has a “day job”.
+
+Another mission of the project is to encourage
+more volunteers to partake in this effort,
+and build a strong community
+so that the project can continue to keep up with emerging technologies
+and remain a dominant platform for functional test automation.
+
+
+### History
+
+When Selenium 1 was released in 2004,
+it was out of the necessity to reduce time spent
+manually verifying consistent behaviour in the front-end of a web application.
+It made use of what tools were available at the time,
+and relied heavily on the injection of JavaScript to the web page under test
+to emulate a user's interaction.
+
+Whilst JavaScript is a good tool to let you introspect the properties of the DOM
+and to do certain client-side observations that you would otherwise not be able to do,
+it falls short on the ability to naturally replicate a user's interactions
+as if the mouse and keyboard are being used.
+
+Since then, Selenium has grown and matured a lot,
+into a tool widely used by many—if not most—of
+the largest organisations around the world.
+Selenium has gone from a homebrewed test automation toolkit developed at Thoughtworks
+for a niché audience and a specific use case,
+to the world's _de facto_ browser automation library.
+
+Just as Selenium RC made use of the tools of the trade available at the time,
+[Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) drives that tradition on by taking
+the browser interaction part to the browser vendor's home turf,
+and asking them to take responsibility of the backend, browser-facing implementations.
+Recently this work has evolved into a W3C standardisation process
+where the goal is to turn the WebDriver component in Selenium
+into the _du jour_ remote control library for user agents.
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.es.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.es.md
new file mode 100644
index 00000000000..1b450931af2
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.es.md
@@ -0,0 +1,47 @@
+---
+title: "El proyecto Selenium y herramientas"
+weight: 1
+---
+
+### Selenium controla navegadores web
+
+_Selenium_ es muchas cosas, pero en esencia es un conjunto de herramientas para la automatización del navegador web que utiliza las mejores técnicas disponibles para controlar de forma remota las instancias del navegador y emular la interacción de un usuario con el navegador.
+
+Permite a los _testers_ simular actividades comunes realizadas por los usuarios finales; ingresar texto en los campos, seleccionar valores desplegables y casillas de verificación, y hacer clic en los enlaces de los documentos. También proporciona muchos otros controles, como el movimiento del mouse, la ejecución arbitraria de JavaScript y mucho más.
+
+Aunque se utiliza principalmente para la prueba de front-end de sitios web, Selenium es en esencia una _Librería_ de agente de usuario de navegador. Las interfaces son ubicuas a la aplicación, lo que fomenta la relación con otras librerías para adaptarse a su necesidad.
+
+
+### Una interfaz para gobernarlos a todos
+
+Uno de los principios rectores del proyecto es admitir una interfaz común para los principales navegadores web.
+Los navegadores web son aplicaciones increíblemente complejas y de alta ingeniería, que realizan sus operaciones de formas completamente diferentes, pero que con frecuencia se ven iguales al hacerlo. Aunque el texto se representa en las mismas fuentes, las imágenes se muestran en el mismo lugar y los enlaces lo llevan al mismo destino. Lo que sucede debajo es tan diferente como la noche y el día.
+Selenium "resume" estas diferencias, ocultando sus detalles y complejidades a la persona que escribe el código. Esto le permite escribir varias líneas de código para realizar un flujo de trabajo complicado, pero estas mismas líneas se ejecutarán en Firefox, Internet Explorer, Chrome y todos los demás navegadores compatibles.
+
+
+### Herramientas y soporte
+
+El enfoque de diseño minimalista de Selenium le da versatilidad para ser incluido como componente en aplicaciones más grandes. La infraestructura circundante proporcionada bajo Selenium le brinda las herramientas para armar su propia [_Grid_ de navegadores]({{< ref "/grid/_index.md" >}}) o _grid_ para que las pruebas se puedan ejecutar en diferentes navegadores y múltiples sistemas operativos en una amplia gama de máquinas.
+
+Imagine un banco de computadoras en la sala de servidores o en el centro de datos que activan todos los navegadores al mismo tiempo que hacen clic en los enlaces, formularios y tablas de su sitio, probando su aplicación las 24 horas del día. A través de la interfaz de programación simple provista para los lenguajes más comunes, estas pruebas se ejecutarán incansablemente en paralelo y le informarán cuando ocurran errores.
+
+Es un objetivo ayudar a que esto sea una realidad para usted, proporcionando a los usuarios herramientas y documentación para controlar no solo los navegadores, sino también para facilitar la ejecución a gran escala y la implementación de dichas _Grids_.
+
+
+### Quién usa Selenium
+
+Muchas de las compañías más importantes del mundo han adoptado Selenium para sus pruebas basadas en navegadores, a menudo reemplazando los esfuerzos de años que involucran otras herramientas propietarias. A medida que ha crecido en popularidad, también se han multiplicado sus requisitos y desafíos.
+
+A medida que la web se vuelve más complicada y se agregan nuevas tecnologías a los sitios web, la misión de este proyecto es mantenerse al día con ellos siempre que sea posible. Al ser un proyecto de código abierto, este apoyo se brinda a través de la generosa donación de tiempo de muchos voluntarios, cada uno de los cuales tiene un "trabajo diario".
+
+Otra misión del proyecto es alentar a más voluntarios a participar en este esfuerzo, y construir una comunidad fuerte para que el proyecto pueda seguir el ritmo de las tecnologías emergentes y seguir siendo una plataforma dominante para la automatización de pruebas funcionales.
+
+
+### Historia
+
+Cuando Selenium 1 se lanzó en 2004, la necesidad era reducir el tiempo dedicado a verificar manualmente el comportamiento consistente en el front-end de una aplicación web. Se hizo uso de las herramientas disponibles en ese momento y se basó en gran medida en la inyección de JavaScript en la página web bajo prueba para emular la interacción de un usuario. Si bien JavaScript es una buena herramienta para permitirle introspectar las propiedades del DOM y hacer ciertas observaciones del lado del cliente que de otro modo no podría hacer, no tiene la capacidad de replicar de forma natural las interacciones de un usuario como el uso del teclado y ratón.
+
+Desde entonces, Selenium ha crecido y madurado mucho, convirtiéndose en una herramienta ampliamente utilizada por muchas, si no la mayoría, de las organizaciones más grandes del mundo. Selenium ha pasado de ser un kit de herramientas de automatización de pruebas de fabricación casera desarrollado en Thoughtworks para un público especial y un caso de uso específico, a la librería de automatización del navegador _de facto_ en el mundo.
+
+Del mismo modo que Selenium RC hizo uso de las herramientas del mercado disponibles en ese momento, [Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) impulsa esa tradición al llevar la parte de interacción del navegador al territorio del desarrollador del navegador y pedirles que se responsabilicen de las implementaciones de back-end orientadas al navegador. Recientemente, este trabajo se ha convertido en un proceso de estandarización W3C donde el objetivo es convertir el componente WebDriver en Selenium en la libería de control remoto de uso cumún para las simulaciones de agentes de usuario.
+
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.fr.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.fr.md
new file mode 100644
index 00000000000..28d157d6e81
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.fr.md
@@ -0,0 +1,123 @@
+---
+title: "Le projet Selenium et les outils"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+### Selenium controls web browsers
+
+_Selenium_ is many things,
+but at its core it's a toolset for web browser automation
+that uses the best techniques available
+to remotely control browser instances
+and emulate a user's interaction with the browser.
+
+It allows users to simulate common activities performed by end-users;
+entering text into fields,
+selecting drop-down values and checking boxes,
+and clicking links in documents.
+It also provides many other controls such as mouse movement,
+arbitrary JavaScript execution, and much more.
+
+Although used primarily for front-end testing of websites,
+Selenium is at its core a browser user agent _library_.
+The interfaces are ubiquitous to their application,
+which encourages composition with other libraries to suit your purpose.
+
+
+### One interface to rule them all
+
+One of the project's guiding principles
+is to support a common interface for all (major) browser technologies.
+Web browsers are incredibly complex, highly engineered applications,
+performing their operations in completely different ways
+but which frequently look the same while doing so.
+Even though the text is rendered in the same fonts,
+the images are displayed in the same place
+and the links take you to the same destination.
+What is happening underneath is as different as night and day.
+Selenium “abstracts” these differences,
+hiding their details and intricacies from the person writing the code.
+This allows you to write several lines of code to perform a complicated workflow,
+but these same lines will execute on Firefox,
+Internet Explorer, Chrome, and all other supported browsers.
+
+
+### Tools and support
+
+Selenium's minimalist design approach gives it
+versatility to be included as a component in bigger applications.
+The surrounding infrastructure provided under the Selenium umbrella
+gives you the tools to put together
+your own [grid of browsers]({{< ref "/grid/_index.md" >}})
+so tests can be run on different browsers and multiple operating systems
+across a range of machines.
+
+Imagine a bank of computers in your server room or data centre
+all firing up browsers at the same time
+hitting your site's links, forms,
+and tables—testing your application 24 hours a day.
+Through the simple programming interface
+provided for the most common languages,
+these tests will run tirelessly in parallel,
+reporting back to you when errors occur.
+
+It's an aim to help make this a reality for you,
+by providing users with tools and documentation to not only control browsers,
+but to make it easy to scale and deploy such grids.
+
+
+### Who uses Selenium
+
+Many of the most important companies in the world
+have adopted Selenium for their browser-based testing,
+often replacing years-long efforts involving other proprietary tools.
+As it has grown in popularity, so have its requirements and challenges multiplied.
+
+As the web becomes more complicated
+and new technologies are added to websites,
+it's the mission of this project to keep up with them where possible.
+Being an open source project,
+this support is provided through the generous donation of time from many volunteers,
+every one of which has a “day job”.
+
+Another mission of the project is to encourage
+more volunteers to partake in this effort,
+and build a strong community
+so that the project can continue to keep up with emerging technologies
+and remain a dominant platform for functional test automation.
+
+
+### History
+
+When Selenium 1 was released in 2004,
+it was out of the necessity to reduce time spent
+manually verifying consistent behaviour in the front-end of a web application.
+It made use of what tools were available at the time,
+and relied heavily on the injection of JavaScript to the web page under test
+to emulate a user's interaction.
+
+Whilst JavaScript is a good tool to let you introspect the properties of the DOM
+and to do certain client-side observations that you would otherwise not be able to do,
+it falls short on the ability to naturally replicate a user's interactions
+as if the mouse and keyboard are being used.
+
+Since then, Selenium has grown and matured a lot,
+into a tool widely used by many—if not most—of
+the largest organisations around the world.
+Selenium has gone from a homebrewed test automation toolkit developed at Thoughtworks
+for a niché audience and a specific use case,
+to the world's _de facto_ browser automation library.
+
+Just as Selenium RC made use of the tools of the trade available at the time,
+[Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) drives that tradition on by taking
+the browser interaction part to the browser vendor's home turf,
+and asking them to take responsibility of the backend, browser-facing implementations.
+Recently this work has evolved into a W3C standardisation process
+where the goal is to turn the WebDriver component in Selenium
+into the _du jeur_ remote control library for user agents.
\ No newline at end of file
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.ja.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.ja.md
new file mode 100644
index 00000000000..db1d28f8f3e
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.ja.md
@@ -0,0 +1,122 @@
+---
+title: "The Selenium project and tools"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+### Selenium controls web browsers
+
+_Selenium_ is many things,
+but at its core it's a toolset for web browser automation
+that uses the best techniques available
+to remotely control browser instances
+and emulate a user's interaction with the browser.
+
+It allows users to simulate common activities performed by end-users;
+entering text into fields,
+selecting drop-down values and checking boxes,
+and clicking links in documents.
+It also provides many other controls such as mouse movement,
+arbitrary JavaScript execution, and much more.
+
+Although used primarily for front-end testing of websites,
+Selenium is at its core a browser user agent _library_.
+The interfaces are ubiquitous to their application,
+which encourages composition with other libraries to suit your purpose.
+
+
+### One interface to rule them all
+
+One of the project's guiding principles
+is to support a common interface for all (major) browser technologies.
+Web browsers are incredibly complex, highly engineered applications,
+performing their operations in completely different ways
+but which frequently look the same while doing so.
+Even though the text is rendered in the same fonts,
+the images are displayed in the same place
+and the links take you to the same destination.
+What is happening underneath is as different as night and day.
+Selenium “abstracts” these differences,
+hiding their details and intricacies from the person writing the code.
+This allows you to write several lines of code to perform a complicated workflow,
+but these same lines will execute on Firefox,
+Internet Explorer, Chrome, and all other supported browsers.
+
+
+### Tools and support
+
+Selenium's minimalist design approach gives it
+versatility to be included as a component in bigger applications.
+The surrounding infrastructure provided under the Selenium umbrella
+gives you the tools to put together
+your own [grid of browsers]({{< ref "/grid/_index.md" >}})
+so tests can be run on different browsers and multiple operating systems
+across a range of machines.
+
+Imagine a bank of computers in your server room or data centre
+all firing up browsers at the same time
+hitting your site's links, forms,
+and tables—testing your application 24 hours a day.
+Through the simple programming interface
+provided for the most common languages,
+these tests will run tirelessly in parallel,
+reporting back to you when errors occur.
+
+It's an aim to help make this a reality for you,
+by providing users with tools and documentation to not only control browsers,
+but to make it easy to scale and deploy such grids.
+
+
+### Who uses Selenium
+
+Many of the most important companies in the world
+have adopted Selenium for their browser-based testing,
+often replacing years-long efforts involving other proprietary tools.
+As it has grown in popularity, so have its requirements and challenges multiplied.
+
+As the web becomes more complicated
+and new technologies are added to websites,
+it's the mission of this project to keep up with them where possible.
+Being an open source project,
+this support is provided through the generous donation of time from many volunteers,
+every one of which has a “day job”.
+
+Another mission of the project is to encourage
+more volunteers to partake in this effort,
+and build a strong community
+so that the project can continue to keep up with emerging technologies
+and remain a dominant platform for functional test automation.
+
+
+### History
+
+When Selenium 1 was released in 2004,
+it was out of the necessity to reduce time spent
+manually verifying consistent behaviour in the front-end of a web application.
+It made use of what tools were available at the time,
+and relied heavily on the injection of JavaScript to the web page under test
+to emulate a user's interaction.
+
+Whilst JavaScript is a good tool to let you introspect the properties of the DOM
+and to do certain client-side observations that you would otherwise not be able to do,
+it falls short on the ability to naturally replicate a user's interactions
+as if the mouse and keyboard are being used.
+
+Since then, Selenium has grown and matured a lot,
+into a tool widely used by many—if not most—of
+the largest organisations around the world.
+Selenium has gone from a homebrewed test automation toolkit developed at Thoughtworks
+for a niché audience and a specific use case,
+to the world's _de facto_ browser automation library.
+
+Just as Selenium RC made use of the tools of the trade available at the time,
+[Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) drives that tradition on by taking
+the browser interaction part to the browser vendor's home turf,
+and asking them to take responsibility of the backend, browser-facing implementations.
+Recently this work has evolved into a W3C standardisation process
+where the goal is to turn the WebDriver component in Selenium
+into the _du jeur_ remote control library for user agents.
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.nl.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.nl.md
new file mode 100644
index 00000000000..6ffa2bef2fd
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.nl.md
@@ -0,0 +1,123 @@
+---
+title: "The Selenium project and tools"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+### Selenium controls web browsers
+
+_Selenium_ is many things,
+but at its core it's a toolset for web browser automation
+that uses the best techniques available
+to remotely control browser instances
+and emulate a user's interaction with the browser.
+
+It allows users to simulate common activities performed by end-users;
+entering text into fields,
+selecting drop-down values and checking boxes,
+and clicking links in documents.
+It also provides many other controls such as mouse movement,
+arbitrary JavaScript execution, and much more.
+
+Although used primarily for front-end testing of websites,
+Selenium is at its core a browser user agent _library_.
+The interfaces are ubiquitous to their application,
+which encourages composition with other libraries to suit your purpose.
+
+
+### One interface to rule them all
+
+One of the project's guiding principles
+is to support a common interface for all (major) browser technologies.
+Web browsers are incredibly complex, highly engineered applications,
+performing their operations in completely different ways
+but which frequently look the same while doing so.
+Even though the text is rendered in the same fonts,
+the images are displayed in the same place
+and the links take you to the same destination.
+What is happening underneath is as different as night and day.
+Selenium “abstracts” these differences,
+hiding their details and intricacies from the person writing the code.
+This allows you to write several lines of code to perform a complicated workflow,
+but these same lines will execute on Firefox,
+Internet Explorer, Chrome, and all other supported browsers.
+
+
+### Tools and support
+
+Selenium's minimalist design approach gives it
+versatility to be included as a component in bigger applications.
+The surrounding infrastructure provided under the Selenium umbrella
+gives you the tools to put together
+your own [grid of browsers]({{< ref "/grid/_index.md" >}})
+so tests can be run on different browsers and multiple operating systems
+across a range of machines.
+
+Imagine a bank of computers in your server room or data centre
+all firing up browsers at the same time
+hitting your site's links, forms,
+and tables—testing your application 24 hours a day.
+Through the simple programming interface
+provided for the most common languages,
+these tests will run tirelessly in parallel,
+reporting back to you when errors occur.
+
+It's an aim to help make this a reality for you,
+by providing users with tools and documentation to not only control browsers,
+but to make it easy to scale and deploy such grids.
+
+
+### Who uses Selenium
+
+Many of the most important companies in the world
+have adopted Selenium for their browser-based testing,
+often replacing years-long efforts involving other proprietary tools.
+As it has grown in popularity, so have its requirements and challenges multiplied.
+
+As the web becomes more complicated
+and new technologies are added to websites,
+it's the mission of this project to keep up with them where possible.
+Being an open source project,
+this support is provided through the generous donation of time from many volunteers,
+every one of which has a “day job”.
+
+Another mission of the project is to encourage
+more volunteers to partake in this effort,
+and build a strong community
+so that the project can continue to keep up with emerging technologies
+and remain a dominant platform for functional test automation.
+
+
+### History
+
+When Selenium 1 was released in 2004,
+it was out of the necessity to reduce time spent
+manually verifying consistent behaviour in the front-end of a web application.
+It made use of what tools were available at the time,
+and relied heavily on the injection of JavaScript to the web page under test
+to emulate a user's interaction.
+
+Whilst JavaScript is a good tool to let you introspect the properties of the DOM
+and to do certain client-side observations that you would otherwise not be able to do,
+it falls short on the ability to naturally replicate a user's interactions
+as if the mouse and keyboard are being used.
+
+Since then, Selenium has grown and matured a lot,
+into a tool widely used by many—if not most—of
+the largest organisations around the world.
+Selenium has gone from a homebrewed test automation toolkit developed at Thoughtworks
+for a niché audience and a specific use case,
+to the world's _de facto_ browser automation library.
+
+Just as Selenium RC made use of the tools of the trade available at the time,
+[Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) drives that tradition on by taking
+the browser interaction part to the browser vendor's home turf,
+and asking them to take responsibility of the backend, browser-facing implementations.
+Recently this work has evolved into a W3C standardisation process
+where the goal is to turn the WebDriver component in Selenium
+into the _du jeur_ remote control library for user agents.
\ No newline at end of file
diff --git a/docs_source_files/content/introduction/the_selenium_project_and_tools.zh-cn.md b/docs_source_files/content/introduction/the_selenium_project_and_tools.zh-cn.md
new file mode 100644
index 00000000000..85aaede9351
--- /dev/null
+++ b/docs_source_files/content/introduction/the_selenium_project_and_tools.zh-cn.md
@@ -0,0 +1,92 @@
+---
+title: "Selenium 项目和工具"
+weight: 1
+---
+
+### Selenium 控制网页浏览器
+
+_Selenium_ 有很多功能,
+但其核心是 web 浏览器自动化的一个工具集,
+它使用最好的技术来远程控制浏览器实例,
+并模拟用户与浏览器的交互。
+
+它允许用户模拟终端用户执行的常见活动;将文本输入到字段中,选择下拉值和复选框,并单击文档中的链接。
+它还提供许多其他控件,比如鼠标移动、任意 JavaScript 执行等等。
+
+虽然 Selenium 主要用于网站的前端测试,但其核心是浏览器用户代理库。
+这些接口在应用程序中无处不在,它们鼓励与其他库进行组合,以满足您的目的。
+
+### 一个接口来统治它们
+
+该项目的指导原则之一是支持所有(主要)浏览器技术的通用接口。
+Web 浏览器是非常复杂的,高度工程化的应用程序,
+以完全不同的方式执行它们的操作,但是在执行这些操作时,它们通常看起来是一样的
+即使文本以相同的字体呈现,图像也会显示在相同的位置,并且链接会将您带到相同的目的地。
+下面发生的事情就像白天和黑夜一样不同。
+Selenium “抽象”了这些差异,向编写代码的人隐藏了它们的细节和复杂性。
+这允许您编写几行代码来执行一个复杂的工作流程,
+但是这几行代码将在 Firefox、 Internet Explorer、 Chrome 和所有其他支持的浏览器上执行。
+
+### 工具和支持
+
+Selenium 的极简设计方法使其具有通用性,可以作为更大应用程序中的组件。
+Selenium 保护伞下提供的周边基础设施为您提供了组合自己的
+[浏览器 grid]({{< ref "/grid/_index.md" >}}) 的工具,
+因此测试就可以跨一系列机器在不同的浏览器和多个操作系统上运行。
+
+想象一下,
+服务器机房或数据中心的一组计算机同时启动浏览器,访问站点的链接、表单和表格 —
+全天 24 小时测试应用程序。
+通过为最常见的语言提供的简单编程接口,
+这些测试将不知疲倦地并行运行,
+当错误发生时向您报告。
+
+通过为用户提供工具和文档,
+不仅可以控制浏览器,
+还可以方便地扩展和部署这些 grid,
+从而帮助您实现这一目标。
+
+通过为用户提供工具和文档,不仅可以控制浏览器,
+还可以简化网格的伸缩和部署。
+来帮助您实现这一目标,
+这些工具和文档
+
+### 谁在使用 Selenium
+
+世界上许多最重要的公司都在基于浏览器的测试中采用了 Selenium,
+这常常取代了多年来涉及其他专有工具的工作。
+随着它越来越受欢迎,
+它的需求和挑战也成倍增加。
+
+随着网络变得越来越复杂,新的技术被添加到网站上,
+这个项目的任务就是尽可能地跟上它们。
+作为一个开源项目,这种支持是通过许多志愿者的慷慨捐赠来提供的,
+每个志愿者都有一份“日常工作”。
+
+该项目的另一个任务是鼓励更多的志愿者参与到这项工作中来,
+并建立一个强大的社区,以便项目能够继续跟上新兴的技术,
+并继续成为功能测试自动化的主导平台。
+
+### 历史
+
+当 Selenium 1 于 2004 年发布时,
+出于减少在 web 应用程序前端手工验证一致行为所花费的时间的需要。
+它利用了当时可用的工具,
+并严重依赖于向测试中的 web 页面注入 JavaScript 来模拟用户的交互。
+
+虽然 JavaScript 是一个很好的工具,
+可以让您自省 DOM 的属性,
+并进行某些客户端观察,
+否则您将无法进行这些观察,
+但是它不具备像使用鼠标和键盘那样自然复制用户交互的能力。
+
+从那时起,Selenium 已经成长并成熟了很多,
+成为世界上许多(不是大多数)大型机构广泛使用的工具。
+Selenium 已经从 Thoughtworks 为特定受众和特定用例开发的自制测试自动化工具包,
+转移到世界上的浏览器自动化库。
+
+正如 Selenium RC 利用了当时可用的工具一样,
+[Selenium WebDriver]({{< ref "/webdriver/_index.md" >}}) 将浏览器交互部分带到浏览器供应商的地盘,
+并要求他们负责后端、面向浏览器的实现,从而推动了这一传统。
+最近,这项工作已经发展成为 W3C 标准化过程,
+其目标是将 Selenium 中的 WebDriver 组件转换为用户代理的 _du jeur_ 远程控制库。
diff --git a/docs_source_files/content/introduction/types_of_testing.en.md b/docs_source_files/content/introduction/types_of_testing.en.md
new file mode 100644
index 00000000000..476234423eb
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.en.md
@@ -0,0 +1,115 @@
+---
+title: "Types of testing"
+weight: 3
+---
+## Acceptance testing
+This type of test is done in order to determine if a product's
+feature matches its requirements.
+This generally involves the customer's feedback or specification.
+
+For web applications, the automation of this testing can be done
+directly with Selenium by simulating user expected behaviour.
+This simulation could be done by record/playback or through the
+different supported languages as explained in this documentation.
+Note: Acceptance testing is a subtype of **_functional testing_**,
+which some people might also refer to.
+
+### Functional testing
+This type of test is done in order to determine if a product's
+feature functions properly, without issues.
+
+This generally includes: the tests work without errors
+(404, exceptions...), in a usable way (correct redirections),
+in an accessible way and matching its specifications
+(see **_acceptance testing_** above).
+
+For web applications, the automation of this testing can be
+done directly with Selenium by simulating expected returns.
+This simulation could be done by record/playback or through
+the different supported languages as explained in this documentation.
+
+### Performance testing
+As its name indicates, performance tests are done in order
+to measure how well an application is performing.
+
+There are two main sub-types for performance testing:
+
+#### Load testing
+Load testing is done in order to verify how well the
+application works under different defined loads
+(usually a particular number of users connected at once).
+
+#### Stress testing
+Stress testing is done in order to verify how well the
+application works under stress (or above the maximum supported load).
+
+Generally, performance tests are done by executing a
+number of Selenium written tests simulating different users
+hitting a particular function on the web app and
+retrieving some meaningful measurements.
+
+This is generally done by other tools that retrieve the metrics.
+One such tools is **_JMeter_**.
+
+For a web application, details to measure include:
+throughput, latency, data loss, individual component loading times...
+
+Note: All browsers have a performance tab in their
+developers' tools section (accessible by pressing F12)
+
+Note 2: is a subtype of **_non-functional testing_**
+as this is generally measured per system and not per function/feature.
+
+### Regression testing
+This testing is generally done after a change, fix or feature addition.
+
+In order to ensure that the change has not broken any of the existing
+functionality, some already executed tests are executed again.
+
+The set of re-executed test can be full or partial
+and can include several different types, depending
+on the application and development team.
+
+### Test driven development (TDD)
+Rather than a test type _per se_, TDD is an iterative
+development methodology in which tests drive the design of a feature.
+
+Each cycle starts by creating a set of unit tests that
+the feature should eventually pass (they should fail their first time executed).
+
+After this, development takes place in order to make the tests pass.
+The tests are executed again, starting another cycle
+and this process continues until all tests are passing.
+
+This aims to speed up the development of an application
+based on the fact that defects are less costly the earlier they are found.
+
+### Behavior-driven development (BDD)
+BDD is also an iterative development methodology
+based on the above TDD, in which the goal is to involve
+all the parties in the development of an application.
+
+Each cycle starts by creating some specification
+(which should fail). Then create the failing unit
+tests (which should also fail) and then do the development.
+
+This cycle is repeated until all types of tests are passing.
+
+In order to do so, a specification language is
+used. It should be understandable by all parties and
+simple, standard and explicit.
+Most tools use **_Gherkin_** as this language.
+
+The goal is to be able to detect even more errors
+than TDD, by targeting potential acceptance errors
+too and make communication between parties smoother.
+
+A set of tools are currently available in order
+to write the specifications and match them with code functions,
+such as **_Cucumber_** or **_SpecFlow._**
+
+A set of tools are built on top of Selenium to make this process
+even faster by directly transforming the BDD specifications into
+executable code.
+Some of these are: **_JBehave, Capybara and Robot Framework_**.
+
diff --git a/docs_source_files/content/introduction/types_of_testing.es.md b/docs_source_files/content/introduction/types_of_testing.es.md
new file mode 100644
index 00000000000..d905fcb62b6
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.es.md
@@ -0,0 +1,65 @@
+---
+title: "Tipos de pruebas"
+weight: 3
+---
+
+
+## Prueba de aceptación
+Este tipo de prueba se realiza para determinar si la característica de un producto cumple con sus requisitos. Esto generalmente implica la retroalimentación o especificación del cliente.
+
+Para aplicaciones web, la automatización de este tipo de prueba se puede hacer directamente con Selenium simulando el comportamiento esperado del usuario. Esta simulación se puede realizar mediante grabación / reproducción o mediante los diferentes lenguajes de programación admitidos, tal como se explica en esta documentación.
+Nota: Las pruebas de aceptación son un subtipo de **_pruebas funcionales_**, a las que algunas personas también pueden referirse.
+
+### Prueba funcional
+Este tipo de prueba se realiza para determinar si la característica de un producto funciona correctamente, sin problemas.
+
+Esto generalmente incluye: que las pruebas funcionen sin errores (páginas 404, excepciones ...), de manera utilizable (redirecciones correctas), de manera accesible y con sus especificaciones (ver **_pruebas de aceptación_** más arriba).
+
+Para aplicaciones web, la automatización de estas pruebas se puede hacer directamente con Selenium simulando los retornos esperados. Esta simulación podría realizarse mediante grabación / reproducción o mediante los diferentes lenguajes admitidos, tal como se explica en esta documentación.
+
+### Pruebas de rendimiento o desempeño
+Como su nombre lo indica, se realizan pruebas de rendimiento para medir el rendimiento de una aplicación.
+
+Hay dos subtipos principales para las pruebas de rendimiento:
+
+#### Prueba de carga
+La prueba de carga se realiza para verificar qué tan bien funciona la aplicación bajo diferentes cargas definidas (generalmente un número particular de usuarios conectados a la vez).
+
+#### Pruebas de estrés o esfuerzo
+La prueba de esfuerzo se realiza para verificar qué tan bien funciona la aplicación bajo estrés (o por encima de la carga máxima soportada).
+
+En general, las pruebas de rendimiento se realizan mediante la ejecución de una serie de pruebas escritas de Selenium que simulan a diferentes usuarios que acceden a una función particular en la aplicación web y recuperan algunas mediciones significativas.
+
+En general, esto lo hacen otras herramientas que recuperan las métricas. Una de esas herramientas es **_JMeter_**.
+
+Para una aplicación web, los detalles a medir incluyen: rendimiento (_throughput_), latencia, pérdida de datos, tiempos de carga de componentes individuales ...
+
+Nota: Todos los navegadores tienen una pestaña de rendimiento en la sección de herramientas de desarrolladores (accesible presionando F12).
+
+Nota 2: es un subtipo de **_pruebas no funcionales_** ya que generalmente se mide por sistema y no por función / característica.
+
+### Pruebas de regresión
+Esta prueba generalmente se realiza después de un cambio, corrección o adición de características.
+
+Para garantizar que el cambio no haya roto ninguna de las funciones existentes, algunas pruebas ya ejecutadas se ejecutan nuevamente.
+
+El conjunto de pruebas ejecutadas de nuevo puede ser completo o parcial y puede incluir varios tipos diferentes, según la aplicación y el equipo de desarrollo.
+
+### Desarrollo guiado por pruebas (TDD)
+En lugar de un tipo de prueba per se, TDD es una metodología de desarrollo iterativa en la que las pruebas guían el diseño de una característica. Cada ciclo comienza creando un conjunto de pruebas unitarias que la característica debe pasar (que debe fallar la primera vez que se ejecuta).Después de esto, se lleva a cabo el desarrollo para que las pruebas pasen. Las pruebas se ejecutan nuevamente comenzando otro ciclo y este proceso continúa hasta que todas las pruebas hayan pasado.
+
+El objetivo es acelerar el desarrollo de una aplicación basada en el hecho de que los defectos son menos costosos cuanto antes se encuentran.
+
+### Desarrollo impulsado por el comportamiento (BDD)
+BDD es también una metodología de desarrollo iterativa basada en el anterior (TDD) en la que el objetivo es involucrar a todas las partes en el desarrollo de una aplicación.
+
+Cada ciclo comienza creando alguna especificación (que debería fallar). Luego se crean las pruebas unitarias fallidas (que también deberían fallar) y luego se crea el desarrollo. Este ciclo se repite hasta que pase todo tipo de pruebas.
+
+Para hacerlo, se utiliza un lenguaje de especificación. Debe ser entendible por todas las partes y simple, estándar y explícito. La mayoría de las herramientas usan **_Gherkin_** como este lenguaje.
+
+El objetivo es ser capaz de detectar incluso más errores que TDD al enfocarse también en posibles errores de aceptación y hacer que la comunicación entre las partes sea más fluida.
+
+Actualmente hay un conjunto de herramientas disponibles para escribir las especificaciones y combinarlas con funciones de código, como **_Cucumber_** o **_SpecFlow_**.
+
+Se ha creado un conjunto de herramientas sobre Selenium para que este proceso sea aún más rápido al transformar directamente las especificaciones de BDD en código ejecutable. Algunos de estos son: **_JBehave, Capybara y Robot Framework_**.
+
diff --git a/docs_source_files/content/introduction/types_of_testing.fr.md b/docs_source_files/content/introduction/types_of_testing.fr.md
new file mode 100644
index 00000000000..d4c67fe2075
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.fr.md
@@ -0,0 +1,122 @@
+---
+title: "Types de test"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Acceptance testing
+This type of test is done in order to determine if a product's
+feature matches its requirements.
+This generally involves the customer's feedback or specification.
+
+For web applications, the automation of this testing can be done
+directly with Selenium by simulating user expected behavior.
+This simulation could be done by record/playback or through the
+different supported languages as explained in this documentation.
+Note: Acceptance testing is a subtype of **_functional testing_**,
+which some people might also refer to.
+
+### Functional testing
+This type of test is done in order to determine if a product's
+feature functions properly, without issues.
+
+This generally include: the tests work without errors
+(404, exceptions...), in an usable way (right redirections),
+in an accessible way and matching its specifications
+(see **_acceptance testing_** above).
+
+For web applications, the automation of this testing can be
+done directly with Selenium by simulating expected returns.
+This simulation could be done by record/playback or through
+the different supported languages as explainedin this documentation.
+
+### Performance testing
+As its name indicates, performance tests are done in order
+to measure how well an application is performing.
+
+There are two main sub-types for performance testing:
+
+#### Load testing
+Load testing is done in order to verify how well the
+application works under different defined loads
+(usually a particular number of users connected at once)
+
+#### Stress testing
+Stress testing is done in order to verify how well the
+application works under stress (or above the maximum supported load).
+
+Generally, performance tests are done by executing a
+number of Selenium written tests simulating different users
+hitting a particular function on the web app and
+retrieving some meaningful measurements.
+
+This is generally done by other tools that retrieve the metrics.
+One such tools is **_JMeter_**.
+
+For a web application, details to measure include:
+throughput, latency, data loss, individual component loading times...
+
+Note: All browsers have a performance tab in their
+developers' tools section (accessible by pressing F12)
+
+Note 2: is a subtype of **_non-functional testing_**
+as this is generally measured per system and not per function/feature.
+
+### Regression testing
+This testing is generally done after a change, fix or feature addition.
+
+In order to ensure that the change has not broken any of the existing
+functionality, some already executed tests are executed again.
+
+The set of re-executed test can be full or partial
+and can include several different types, depending
+on the application and development team.
+
+### Test driven development (TDD)
+Rather than a test type per se, TDD is an iterative
+development methodology in which tests drive the design of a feature.
+
+Each cycle starts by creating a set of unit tests that
+the feature should pass (which should fail their first time executed).
+
+After this, development takes place in order to make the tests pass.
+The tests are executed again starting another cycle
+and this process continues until all tests are passing.
+
+This aims to speed up the development of an application
+based on the fact that defects are less costly the earlier they are found.
+
+### Behavior-driven development (BDD)
+BDD is also an iterative development methodology
+based on above (TDD) in which the goal is to involve
+all the parties in the development of an application.
+
+Each cycle starts by creating some specification
+(which should fail). Then create the failing unit
+tests (which should also fail) and then create the development.
+
+This cycle is repeated until all type of tests are passing.
+
+In order to do so, a specification language is
+used. It should be understandable by all parties and
+simple, standard and explicit.
+Most tools use **_Gherkin_** as this language.
+
+The goal is to be able to detect even more errors
+than TDD by targeting potential acceptance errors
+too and make communication between parties smoother.
+
+A set of tools are currently available in order
+to write the specifications and match them with code functions,
+such as **_Cucumber_** or **_SpecFlow._**
+
+A set of tools are built on top of Selenium to make this process
+even faster by directly transform the BDD specifications into
+executable code.
+Some of these are: **_JBehave, Capybara and Robot Framework_**.
+
diff --git a/docs_source_files/content/introduction/types_of_testing.ja.md b/docs_source_files/content/introduction/types_of_testing.ja.md
new file mode 100644
index 00000000000..4451dd9371e
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.ja.md
@@ -0,0 +1,120 @@
+---
+title: "Types of testing"
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+## Acceptance testing
+This type of test is done in order to determine if a product's
+feature matches its requirements.
+This generally involves the customer's feedback or specification.
+
+For web applications, the automation of this testing can be done
+directly with Selenium by simulating user expected behavior.
+This simulation could be done by record/playback or through the
+different supported languages as explained in this documentation.
+Note: Acceptance testing is a subtype of **_functional testing_**,
+which some people might also refer to.
+
+### Functional testing
+This type of test is done in order to determine if a product's
+feature functions properly, without issues.
+
+This generally include: the tests work without errors
+(404, exceptions...), in an usable way (right redirections),
+in an accessible way and matching its specifications
+(see **_acceptance testing_** above).
+
+For web applications, the automation of this testing can be
+done directly with Selenium by simulating expected returns.
+This simulation could be done by record/playback or through
+the different supported languages as explainedin this documentation.
+
+### Performance testing
+As its name indicates, performance tests are done in order
+to measure how well an application is performing.
+
+There are two main sub-types for performance testing:
+
+#### Load testing
+Load testing is done in order to verify how well the
+application works under different defined loads
+(usually a particular number of users connected at once)
+
+#### Stress testing
+Stress testing is done in order to verify how well the
+application works under stress (or above the maximum supported load).
+
+Generally, performance tests are done by executing a
+number of Selenium written tests simulating different users
+hitting a particular function on the web app and
+retrieving some meaningful measurements.
+
+This is generally done by other tools that retrieve the metrics.
+One such tools is **_JMeter_**.
+
+For a web application, details to measure include:
+throughput, latency, data loss, individual component loading times...
+
+Note: All browsers have a performance tab in their
+developers' tools section (accessible by pressing F12)
+
+Note 2: is a subtype of **_non-functional testing_**
+as this is generally measured per system and not per function/feature.
+
+### Regression testing
+This testing is generally done after a change, fix or feature addition.
+
+In order to ensure that the change has not broken any of the existing
+functionality, some already executed tests are executed again.
+
+The set of re-executed test can be full or partial
+and can include several different types, depending
+on the application and development team.
+
+### Test driven development (TDD)
+Rather than a test type per se, TDD is an iterative
+development methodology in which tests drive the design of a feature.
+
+Each cycle starts by creating a set of unit tests that
+the feature should pass (which should fail their first time executed).
+
+After this, development takes place in order to make the tests pass.
+The tests are executed again starting another cycle
+and this process continues until all tests are passing.
+
+This aims to speed up the development of an application
+based on the fact that defects are less costly the earlier they are found.
+
+### Behavior-driven development (BDD)
+BDD is also an iterative development methodology
+based on above (TDD) in which the goal is to involve
+all the parties in the development of an application.
+
+Each cycle starts by creating some specification
+(which should fail). Then create the failing unit
+tests (which should also fail) and then create the development.
+
+This cycle is repeated until all type of tests are passing.
+
+In order to do so, a specification language is
+used. It should be understandable by all parties and
+simple, standard and explicit.
+Most tools use **_Gherkin_** as this language.
+
+The goal is to be able to detect even more errors
+than TDD by targeting potential acceptance errors
+too and make communication between parties smoother.
+
+A set of tools are currently available in order
+to write the specifications and match them with code functions,
+such as **_Cucumber_** or **_SpecFlow._**
+
+A set of tools are built on top of Selenium to make this process
+even faster by directly transform the BDD specifications into
+executable code.
+Some of these are: **_JBehave, Capybara and Robot Framework_**.
diff --git a/docs_source_files/content/introduction/types_of_testing.nl.md b/docs_source_files/content/introduction/types_of_testing.nl.md
new file mode 100644
index 00000000000..444bd188e1c
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.nl.md
@@ -0,0 +1,122 @@
+---
+title: "Types of testing"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Acceptance testing
+This type of test is done in order to determine if a product's
+feature matches its requirements.
+This generally involves the customer's feedback or specification.
+
+For web applications, the automation of this testing can be done
+directly with Selenium by simulating user expected behavior.
+This simulation could be done by record/playback or through the
+different supported languages as explained in this documentation.
+Note: Acceptance testing is a subtype of **_functional testing_**,
+which some people might also refer to.
+
+### Functional testing
+This type of test is done in order to determine if a product's
+feature functions properly, without issues.
+
+This generally include: the tests work without errors
+(404, exceptions...), in an usable way (right redirections),
+in an accessible way and matching its specifications
+(see **_acceptance testing_** above).
+
+For web applications, the automation of this testing can be
+done directly with Selenium by simulating expected returns.
+This simulation could be done by record/playback or through
+the different supported languages as explainedin this documentation.
+
+### Performance testing
+As its name indicates, performance tests are done in order
+to measure how well an application is performing.
+
+There are two main sub-types for performance testing:
+
+#### Load testing
+Load testing is done in order to verify how well the
+application works under different defined loads
+(usually a particular number of users connected at once)
+
+#### Stress testing
+Stress testing is done in order to verify how well the
+application works under stress (or above the maximum supported load).
+
+Generally, performance tests are done by executing a
+number of Selenium written tests simulating different users
+hitting a particular function on the web app and
+retrieving some meaningful measurements.
+
+This is generally done by other tools that retrieve the metrics.
+One such tools is **_JMeter_**.
+
+For a web application, details to measure include:
+throughput, latency, data loss, individual component loading times...
+
+Note: All browsers have a performance tab in their
+developers' tools section (accessible by pressing F12)
+
+Note 2: is a subtype of **_non-functional testing_**
+as this is generally measured per system and not per function/feature.
+
+### Regression testing
+This testing is generally done after a change, fix or feature addition.
+
+In order to ensure that the change has not broken any of the existing
+functionality, some already executed tests are executed again.
+
+The set of re-executed test can be full or partial
+and can include several different types, depending
+on the application and development team.
+
+### Test driven development (TDD)
+Rather than a test type per se, TDD is an iterative
+development methodology in which tests drive the design of a feature.
+
+Each cycle starts by creating a set of unit tests that
+the feature should pass (which should fail their first time executed).
+
+After this, development takes place in order to make the tests pass.
+The tests are executed again starting another cycle
+and this process continues until all tests are passing.
+
+This aims to speed up the development of an application
+based on the fact that defects are less costly the earlier they are found.
+
+### Behavior-driven development (BDD)
+BDD is also an iterative development methodology
+based on above (TDD) in which the goal is to involve
+all the parties in the development of an application.
+
+Each cycle starts by creating some specification
+(which should fail). Then create the failing unit
+tests (which should also fail) and then create the development.
+
+This cycle is repeated until all type of tests are passing.
+
+In order to do so, a specification language is
+used. It should be understandable by all parties and
+simple, standard and explicit.
+Most tools use **_Gherkin_** as this language.
+
+The goal is to be able to detect even more errors
+than TDD by targeting potential acceptance errors
+too and make communication between parties smoother.
+
+A set of tools are currently available in order
+to write the specifications and match them with code functions,
+such as **_Cucumber_** or **_SpecFlow._**
+
+A set of tools are built on top of Selenium to make this process
+even faster by directly transform the BDD specifications into
+executable code.
+Some of these are: **_JBehave, Capybara and Robot Framework_**.
+
diff --git a/docs_source_files/content/introduction/types_of_testing.zh-cn.md b/docs_source_files/content/introduction/types_of_testing.zh-cn.md
new file mode 100644
index 00000000000..6e68b9b598c
--- /dev/null
+++ b/docs_source_files/content/introduction/types_of_testing.zh-cn.md
@@ -0,0 +1,121 @@
+---
+title: "Types of testing"
+weight: 3
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+## Acceptance testing
+This type of test is done in order to determine if a product's
+feature matches its requirements.
+This generally involves the customer's feedback or specification.
+
+For web applications, the automation of this testing can be done
+directly with Selenium by simulating user expected behavior.
+This simulation could be done by record/playback or through the
+different supported languages as explained in this documentation.
+Note: Acceptance testing is a subtype of **_functional testing_**,
+which some people might also refer to.
+
+### Functional testing
+This type of test is done in order to determine if a product's
+feature functions properly, without issues.
+
+This generally include: the tests work without errors
+(404, exceptions...), in an usable way (right redirections),
+in an accessible way and matching its specifications
+(see **_acceptance testing_** above).
+
+For web applications, the automation of this testing can be
+done directly with Selenium by simulating expected returns.
+This simulation could be done by record/playback or through
+the different supported languages as explainedin this documentation.
+
+### Performance testing
+As its name indicates, performance tests are done in order
+to measure how well an application is performing.
+
+There are two main sub-types for performance testing:
+
+#### Load testing
+Load testing is done in order to verify how well the
+application works under different defined loads
+(usually a particular number of users connected at once)
+
+#### Stress testing
+Stress testing is done in order to verify how well the
+application works under stress (or above the maximum supported load).
+
+Generally, performance tests are done by executing a
+number of Selenium written tests simulating different users
+hitting a particular function on the web app and
+retrieving some meaningful measurements.
+
+This is generally done by other tools that retrieve the metrics.
+One such tools is **_JMeter_**.
+
+For a web application, details to measure include:
+throughput, latency, data loss, individual component loading times...
+
+Note: All browsers have a performance tab in their
+developers' tools section (accessible by pressing F12)
+
+Note 2: is a subtype of **_non-functional testing_**
+as this is generally measured per system and not per function/feature.
+
+### Regression testing
+This testing is generally done after a change, fix or feature addition.
+
+In order to ensure that the change has not broken any of the existing
+functionality, some already executed tests are executed again.
+
+The set of re-executed test can be full or partial
+and can include several different types, depending
+on the application and development team.
+
+### Test driven development (TDD)
+Rather than a test type per se, TDD is an iterative
+development methodology in which tests drive the design of a feature.
+
+Each cycle starts by creating a set of unit tests that
+the feature should pass (which should fail their first time executed).
+
+After this, development takes place in order to make the tests pass.
+The tests are executed again starting another cycle
+and this process continues until all tests are passing.
+
+This aims to speed up the development of an application
+based on the fact that defects are less costly the earlier they are found.
+
+### Behavior-driven development (BDD)
+BDD is also an iterative development methodology
+based on above (TDD) in which the goal is to involve
+all the parties in the development of an application.
+
+Each cycle starts by creating some specification
+(which should fail). Then create the failing unit
+tests (which should also fail) and then create the development.
+
+This cycle is repeated until all type of tests are passing.
+
+In order to do so, a specification language is
+used. It should be understandable by all parties and
+simple, standard and explicit.
+Most tools use **_Gherkin_** as this language.
+
+The goal is to be able to detect even more errors
+than TDD by targeting potential acceptance errors
+too and make communication between parties smoother.
+
+A set of tools are currently available in order
+to write the specifications and match them with code functions,
+such as **_Cucumber_** or **_SpecFlow._**
+
+A set of tools are built on top of Selenium to make this process
+even faster by directly transform the BDD specifications into
+executable code.
+Some of these are: **_JBehave, Capybara and Robot Framework_**.
+
diff --git a/docs_source_files/content/remote_webdriver/_index.en.md b/docs_source_files/content/remote_webdriver/_index.en.md
new file mode 100644
index 00000000000..3ef9603cd39
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.en.md
@@ -0,0 +1,15 @@
+---
+title: "Remote WebDriver"
+chapter: true
+weight: 6
+---
+
+# Remote WebDriver
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
\ No newline at end of file
diff --git a/docs_source_files/content/remote_webdriver/_index.es.md b/docs_source_files/content/remote_webdriver/_index.es.md
new file mode 100644
index 00000000000..d859f572e7b
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.es.md
@@ -0,0 +1,21 @@
+---
+title: "WebDriver remoto"
+chapter: true
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# WebDriver remoto
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
\ No newline at end of file
diff --git a/docs_source_files/content/remote_webdriver/_index.fr.md b/docs_source_files/content/remote_webdriver/_index.fr.md
new file mode 100644
index 00000000000..7ed4b37a4e9
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.fr.md
@@ -0,0 +1,21 @@
+---
+title: "Remote WebDriver"
+chapter: true
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Remote WebDriver
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
\ No newline at end of file
diff --git a/docs_source_files/content/remote_webdriver/_index.ja.md b/docs_source_files/content/remote_webdriver/_index.ja.md
new file mode 100644
index 00000000000..69481455f8e
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.ja.md
@@ -0,0 +1,20 @@
+---
+title: "Remote WebDriver"
+chapter: true
+weight: 6
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Remote WebDriver
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
diff --git a/docs_source_files/content/remote_webdriver/_index.nl.md b/docs_source_files/content/remote_webdriver/_index.nl.md
new file mode 100644
index 00000000000..385e18225c9
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.nl.md
@@ -0,0 +1,21 @@
+---
+title: "Remote WebDriver"
+chapter: true
+weight: 6
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Remote WebDriver
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
\ No newline at end of file
diff --git a/docs_source_files/content/remote_webdriver/_index.zh-cn.md b/docs_source_files/content/remote_webdriver/_index.zh-cn.md
new file mode 100644
index 00000000000..9b12de94f75
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/_index.zh-cn.md
@@ -0,0 +1,20 @@
+---
+title: "Remote WebDriver"
+chapter: true
+weight: 6
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+# Remote WebDriver
+
+You can use WebDriver remotely the same way you would use it
+locally. The primary difference is that a remote WebDriver needs to be
+configured so that it can run your tests on a separate machine.
+
+A remote WebDriver is composed of two pieces: a client and a
+server. The client is your WebDriver test and the server is simply a
+Java servlet, which can be hosted in any modern JEE app server.
\ No newline at end of file
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.en.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.en.md
new file mode 100644
index 00000000000..2a32a0810e5
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.en.md
@@ -0,0 +1,136 @@
+---
+title: "Remote WebDriver client"
+weight: 2
+---
+
+To run a remote WebDriver client, we first need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.es.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.es.md
new file mode 100644
index 00000000000..b3a804dd5d7
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.es.md
@@ -0,0 +1,142 @@
+---
+title: "WebDriver remoto - cliente"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First, we need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.fr.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.fr.md
new file mode 100644
index 00000000000..c283befcead
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.fr.md
@@ -0,0 +1,142 @@
+---
+title: "Le client Remote WebDriver"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First, we need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.ja.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.ja.md
new file mode 100644
index 00000000000..77ec4a23bc7
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.ja.md
@@ -0,0 +1,140 @@
+---
+title: "Remote WebDriver client"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+First, we need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.nl.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.nl.md
new file mode 100644
index 00000000000..36a9563cc52
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.nl.md
@@ -0,0 +1,142 @@
+---
+title: "Remote WebDriver client"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First, we need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_client.zh-cn.md b/docs_source_files/content/remote_webdriver/remote_webdriver_client.zh-cn.md
new file mode 100644
index 00000000000..4768d971bbc
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_client.zh-cn.md
@@ -0,0 +1,141 @@
+---
+title: "Remote WebDriver client"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+First, we need to connect to the RemoteWebDriver.
+We do this by pointing the URL to the address of the server running our tests.
+In order to customize our configuration, we set desired capabilities.
+Below is an example of instantiating a remote WebDriver object
+pointing to our remote web server, _www.example.com_,
+running our tests on Firefox.
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+FirefoxOptions firefoxOptions = new FirefoxOptions();
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), firefoxOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+require 'selenium-webdriver'
+
+driver = Selenium::WebDriver.for :remote, url: "http://www.example.com", desired_capabilities: :firefox
+driver.get "http://www.google.com"
+driver.close
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+To further customize our test configuration, we can add other desired capabilities.
+
+
+## Desired capabilities
+
+Desired capabilities can be expanded further.
+All remote Webdriver capabilities are sent through JsonWireProtocol.
+For a list of configurable capabilities, and more information on JsonWireProtocol,
+please visit the documentation
+[here](//github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities).
+
+For example, suppose you wanted to run Chrome on Windows XP,
+using Chrome version 67:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+ChromeOptions chromeOptions = new ChromeOptions();
+chromeOptions.setCapability("browserVersion", "67");
+chromeOptions.setCapability("platformName", "Windows XP");
+WebDriver driver = new RemoteWebDriver(new URL("http://www.example.com"), chromeOptions);
+driver.get("http://www.google.com");
+driver.quit();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+caps = Selenium::WebDriver::Remote::Capabilities.chrome
+caps.platform = Windows XP
+caps.version = 67
+
+driver = Selenium::WebDriver.for :remote, :url => "http://www.example.com", :desired_capabilities => caps
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
+## Local file detector
+
+The Local File Detector allows the transfer of files from the client
+machine to the remote server. For example, if a test needs to upload a
+file to a web application, a remote WebDriver can automatically transfer
+the file from the local machine to the remote web server during
+runtime. This allows the file to be uploaded from the remote machine
+running the test. It is not enabled by default and can be enabled in
+the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.setFileDetector(new LocalFileDetector());
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.file_detector = lambda do |args|
+ # args => ["/path/to/file"]
+ str = args.first.to_s
+ str if File.exist?(str)
+end
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Once the above code is defined, you can upload a file in your test in the following way:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
+WebElement upload = driver.findElement(By.id("myfile"));
+upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# We don't have a Python code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+@driver.navigate.to "http://sso.dev.saucelabs.com/test/guinea-file-upload"
+ element = @driver.find_element(:id, 'myfile')
+ element.send_keys "/Users/sso/SauceLabs/sauce/hostess/maitred/maitred/public/images/darkbulb.jpg"
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.en.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.en.md
new file mode 100644
index 00000000000..2d3570c7600
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.en.md
@@ -0,0 +1,101 @@
+---
+title: "Remote WebDriver server"
+weight: 1
+---
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it is also possible to host the page in a lightweight
+container, such as Jetty, configured entirely in code.
+
+* Download the `selenium-server.zip` and unpack.
+* Put the JARs on the CLASSPATH.
+* Create a new class called `AppServer`.
+Here, we are using Jetty, so you will need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.es.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.es.md
new file mode 100644
index 00000000000..5722b6f89d5
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.es.md
@@ -0,0 +1,107 @@
+---
+title: "WebDriver remoto - servidor"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it's also possible to host the page in a lightweight
+container, such as Jetty configured entirely in code. Steps to do this
+follow.
+
+Download the `selenium-server.zip` and unpack. Put the JARs on the
+CLASSPATH. Create a new class called `AppServer`. Here, I'm using
+Jetty, so you'll need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.fr.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.fr.md
new file mode 100644
index 00000000000..dcd7ea04a6d
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.fr.md
@@ -0,0 +1,107 @@
+---
+title: "Le serveur Remote WebDriver"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it's also possible to host the page in a lightweight
+container, such as Jetty configured entirely in code. Steps to do this
+follow.
+
+Download the `selenium-server.zip` and unpack. Put the JARs on the
+CLASSPATH. Create a new class called `AppServer`. Here, I'm using
+Jetty, so you'll need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.ja.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.ja.md
new file mode 100644
index 00000000000..2cb4d73ac75
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.ja.md
@@ -0,0 +1,105 @@
+---
+title: "Remote WebDriver server"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it's also possible to host the page in a lightweight
+container, such as Jetty configured entirely in code. Steps to do this
+follow.
+
+Download the `selenium-server.zip` and unpack. Put the JARs on the
+CLASSPATH. Create a new class called `AppServer`. Here, I'm using
+Jetty, so you'll need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.nl.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.nl.md
new file mode 100644
index 00000000000..6caf77adf93
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.nl.md
@@ -0,0 +1,107 @@
+---
+title: "Remote WebDriver server"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it's also possible to host the page in a lightweight
+container, such as Jetty configured entirely in code. Steps to do this
+follow.
+
+Download the `selenium-server.zip` and unpack. Put the JARs on the
+CLASSPATH. Create a new class called `AppServer`. Here, I'm using
+Jetty, so you'll need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
+
diff --git a/docs_source_files/content/remote_webdriver/remote_webdriver_server.zh-cn.md b/docs_source_files/content/remote_webdriver/remote_webdriver_server.zh-cn.md
new file mode 100644
index 00000000000..a5579ecbc8f
--- /dev/null
+++ b/docs_source_files/content/remote_webdriver/remote_webdriver_server.zh-cn.md
@@ -0,0 +1,106 @@
+---
+title: "Remote WebDriver server"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+The server will always run on the machine with the browser you want to
+test. The server can be used either from the command line or through code
+configuration.
+
+
+## Starting the server from the command line
+
+Once you have downloaded `selenium-server-standalone-{VERSION}.jar`,
+place it on the computer with the browser you want to test. Then, from
+the directory with the jar, run the following:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar
+```
+
+## Considerations for running the server
+
+The caller is expected to terminate each session properly, calling
+either `Selenium#stop()` or `WebDriver#quit`.
+
+The selenium-server keeps in-memory logs for each ongoing session,
+which are cleared when `Selenium#stop()` or `WebDriver#quit` is called. If
+you forget to terminate these sessions, your server may leak memory. If
+you keep extremely long-running sessions, you will probably need to
+stop/quit every now and then (or increase memory with -Xmx jvm option).
+
+
+## Timeouts (from version 2.21)
+
+The server has two different timeouts, which can be set as follows:
+
+```shell
+java -jar selenium-server-standalone-{VERSION}.jar -timeout=20 -browserTimeout=60
+```
+
+* browserTimeout
+ * Controls how long the browser is allowed to hang (value in seconds).
+* timeout
+ * Controls how long the client is allowed to be gone
+ before the session is reclaimed (value in seconds).
+
+The system property `selenium.server.session.timeout`
+is no longer supported as of 2.21.
+
+Please note that the `browserTimeout`
+is intended as a backup timeout mechanism
+when the ordinary timeout mechanism fails,
+which should be used mostly in grid/server environments
+to ensure that crashed/lost processes do not stay around for too long,
+polluting the runtime environment.
+
+
+## Configuring the server programmatically
+
+In theory, the process is as simple as mapping the `DriverServlet` to
+a URL, but it's also possible to host the page in a lightweight
+container, such as Jetty configured entirely in code. Steps to do this
+follow.
+
+Download the `selenium-server.zip` and unpack. Put the JARs on the
+CLASSPATH. Create a new class called `AppServer`. Here, I'm using
+Jetty, so you'll need to [download](//www.eclipse.org/jetty/download.html)
+that as well:
+
+```java
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import javax.servlet.Servlet;
+import java.io.File;
+
+import org.openqa.selenium.remote.server.DriverServlet;
+
+public class AppServer {
+ private Server server = new Server();
+
+ public AppServer() throws Exception {
+ WebAppContext context = new WebAppContext();
+ context.setContextPath("");
+ context.setWar(new File("."));
+ server.addHandler(context);
+
+ context.addServlet(DriverServlet.class, "/wd/*");
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(3001);
+ server.addConnector(connector);
+
+ server.start();
+ }
+}
+```
+
diff --git a/docs_source_files/content/selenium_installation/_index.en.md b/docs_source_files/content/selenium_installation/_index.en.md
new file mode 100644
index 00000000000..fd920c0aec6
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.en.md
@@ -0,0 +1,9 @@
+---
+title: "Selenium installation"
+chapter: true
+weight: 3
+---
+
+# Selenium Installation
+
+Selenium setup is quite different from the setup of other commercial tools. To use Selenium in your automation project you need to install the language bindings libraries for your language of choice. In addition you will need WebDriver binaries for the browsers you want to automate and run test on.
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/_index.es.md b/docs_source_files/content/selenium_installation/_index.es.md
new file mode 100644
index 00000000000..76ba29b56da
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.es.md
@@ -0,0 +1,10 @@
+---
+title: "Instalación de Selenium"
+chapter: true
+weight: 3
+---
+
+# Instalación de Selenium
+
+La configuración de Selenium es bastante diferente de la configuración de otras herramientas comerciales. Para usar Selenium en su proyecto de automatización, necesita instalar las librerías para el lenguaje de programación de su elección. Además, necesitará los binarios del WebDriver para los navegadores en los que desea automatizar y ejecutar la prueba.
+
diff --git a/docs_source_files/content/selenium_installation/_index.fr.md b/docs_source_files/content/selenium_installation/_index.fr.md
new file mode 100644
index 00000000000..64035aea58d
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.fr.md
@@ -0,0 +1,15 @@
+---
+title: "Installation de Selenium"
+chapter: true
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Selenium Installation
+
+Selenium setup is quite different from the setup of other commercial tools. To use Selenium in your automation project you need to install the language bindings libraries for your language of choice. In addition you will need WebDriver binaries for the browsers you want to automate and run test on.
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/_index.ja.md b/docs_source_files/content/selenium_installation/_index.ja.md
new file mode 100644
index 00000000000..5e35a83e94e
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.ja.md
@@ -0,0 +1,14 @@
+---
+title: "Selenium installation"
+chapter: true
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Selenium Installation
+
+Selenium setup is quite different from the setup of other commercial tools. To use Selenium in your automation project you need to install the language bindings libraries for your language of choice. In addition you will need WebDriver binaries for the browsers you want to automate and run test on.
diff --git a/docs_source_files/content/selenium_installation/_index.nl.md b/docs_source_files/content/selenium_installation/_index.nl.md
new file mode 100644
index 00000000000..1be3f73b94e
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.nl.md
@@ -0,0 +1,15 @@
+---
+title: "Selenium installation"
+chapter: true
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Selenium Installation
+
+Selenium setup is quite different from the setup of other commercial tools. To use Selenium in your automation project you need to install the language bindings libraries for your language of choice. In addition you will need WebDriver binaries for the browsers you want to automate and run test on.
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/_index.zh-cn.md b/docs_source_files/content/selenium_installation/_index.zh-cn.md
new file mode 100644
index 00000000000..b6457b7434c
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/_index.zh-cn.md
@@ -0,0 +1,11 @@
+---
+title: "Selenium 安装"
+chapter: true
+weight: 3
+---
+
+# Selenium 安装
+
+Selenium 设置与其他商业工具的设置完全不同。
+要在自动化项目中使用 Selenium,您需要为您选择的语言安装语言绑定库。
+此外,对于要自动运行并运行测试的浏览器,您将需要 WebDriver 二进制文件。
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.en.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.en.md
new file mode 100644
index 00000000000..178a294d89a
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.en.md
@@ -0,0 +1,87 @@
+---
+title: "Installing Selenium libraries"
+weight: 1
+---
+
+First you need to install the Selenium bindings for your automation project.
+The installation process for libraries depends on the language you choose to use.
+
+## _Java_
+Installation of Selenium libraries for Java can be done using Maven.
+Add the _selenium-java_ dependency in your project pom.xml:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+The _selenium-java_ dependency supports running your automation
+project with all Selenium supported browsers. If you want to run tests
+only in a specific browser, you can add the dependency for that browser
+in your _pom.xml_ file.
+For example, you should add following dependency in your _pom.xml_
+file to run your tests only in Firefox:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+In a similar manner, if you want to run tests only in Chrome,
+you should add the following dependency:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+## _Python_
+Installation of Selenium libraries for Python can be done using pip:
+
+```shell
+pip install selenium
+```
+
+Alternatively you can download the [PyPI source archive](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) and install it using _setup.py_:
+
+```shell
+python setup.py install
+```
+
+## _C#_
+Installation of Selenium libraries for C# can be done using NuGet:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+## _Ruby_
+Installation of Selenium libraries for Ruby can be done using gem:
+
+```shell
+gem install selenium-webdriver
+```
+
+## _JavaScript_
+Installation of Selenium libraries for JavaScript can be done using npm:
+
+```shell
+npm install selenium-webdriver
+```
+
+
+
+
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.es.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.es.md
new file mode 100644
index 00000000000..aae7e401d61
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.es.md
@@ -0,0 +1,78 @@
+---
+title: "Instalación de las librerías Selenium"
+weight: 1
+---
+
+
+Primero debe instalar las librerías de Selenium para su proyecto de automatización. El proceso de instalación de las librerías depende del lenguaje que elija usar.
+
+## _Java_
+La instalación de las bibliotecas Selenium para Java se puede hacer usando Maven.
+Agregue la dependencia _selenium-java_ en el archivo *pom.xml* de su proyecto:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+La dependencia de _selenium-java_ admite la ejecución de su proyecto de automatización con todos los navegadores compatibles con Selenium. Si desea ejecutar pruebas solo en un navegador específico, puede agregar la dependencia para ese navegador en su archivo _pom.xml_. Por ejemplo, debe agregar la siguiente dependencia en su archivo _pom.xml_ para ejecutar sus pruebas solo en Firefox:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+De manera similar, si desea ejecutar pruebas solo en Chrome, debe agregar la siguiente dependencia:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+## _Python_
+La instalación de las librerías de Selenium en Python se puede hacer usando pip:
+
+```shell
+pip install selenium
+```
+
+Alternativamente, puede descargar el [archivo fuente PyPI](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) e instalarlo usando _setup.py_:
+
+```shell
+python setup.py install
+```
+
+## _C#_
+La instalación de las librerías de Selenium para C# se puede hacer usando NuGet:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+## _Ruby_
+La instalación de las librerías de Selenium para Ruby se puede hacer usando gem:
+
+```shell
+gem install selenium-webdriver
+```
+
+## _JavaScript_
+La instalación de las librerías de Selenium para JavaScript se puede hacer usando npm:
+
+```shell
+npm install selenium-webdriver
+```
+
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.fr.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.fr.md
new file mode 100644
index 00000000000..c6f2c024542
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.fr.md
@@ -0,0 +1,93 @@
+---
+title: "Installer les librairies Selenium"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+First you need to install the Selenium bindings for your automation project.
+The installation process for libraries depends on the language you choose to use.
+
+## _Java_
+Installation of Selenium libraries for Java can be done using Maven.
+Add the _selenium-java_ dependency in your project pom.xml:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+The _selenium-java_ dependency supports running your automation
+project with all Selenium supported browsers. If you want to run tests
+only in a specific browser, you can add the dependency for that browser
+in your _pom.xml_ file.
+For example, you should add following dependency in your _pom.xml_
+file to run your tests only in Firefox:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+In a similar manner, if you want to run tests only in Chrome,
+you should add the following dependency:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+## _Python_
+Installation of Selenium libraries for Python can be done using pip:
+
+```shell
+pip install selenium
+```
+
+Alternatively you can download the [PyPI source archive](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) and install it using _setup.py_:
+
+```shell
+python setup.py install
+```
+
+## _C#_
+Installation of Selenium libraries for C# can be done using NuGet:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+## _Ruby_
+Installation of Selenium libraries for Ruby can be done using gem:
+
+```shell
+gem install selenium-webdriver
+```
+
+## _JavaScript_
+Installation of Selenium libraries for JavaScript can be done using npm:
+
+```shell
+npm install selenium-webdriver
+```
+
+
+
+
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.ja.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.ja.md
new file mode 100644
index 00000000000..ada83a9db91
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.ja.md
@@ -0,0 +1,88 @@
+---
+title: "Installing Selenium libraries"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+First you need to install the Selenium bindings for your automation project.
+The installation process for libraries depends on the language you choose to use.
+
+## _Java_
+Installation of Selenium libraries for Java can be done using Maven.
+Add the _selenium-java_ dependency in your project pom.xml:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+The _selenium-java_ dependency supports running your automation
+project with all Selenium supported browsers. If you want to run tests
+only in a specific browser, you can add the dependency for that browser
+in your _pom.xml_ file.
+For example, you should add following dependency in your _pom.xml_
+file to run your tests only in Firefox:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+In a similar manner, if you want to run tests only in Chrome,
+you should add the following dependency:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+## _Python_
+Installation of Selenium libraries for Python can be done using pip:
+
+```shell
+pip install selenium
+```
+
+Alternatively you can download the [PyPI source archive](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) and install it using _setup.py_:
+
+```shell
+python setup.py install
+```
+
+## _C#_
+Installation of Selenium libraries for C# can be done using NuGet:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+## _Ruby_
+Installation of Selenium libraries for Ruby can be done using gem:
+
+```shell
+gem install selenium-webdriver
+```
+
+## _JavaScript_
+Installation of Selenium libraries for JavaScript can be done using npm:
+
+```shell
+npm install selenium-webdriver
+```
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.nl.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.nl.md
new file mode 100644
index 00000000000..b0b4994df55
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.nl.md
@@ -0,0 +1,94 @@
+---
+title: "Installing Selenium libraries"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Installing Selenium libraries
+First you need to install the Selenium bindings for your automation project.
+The installation process for libraries depends on the language you choose to use.
+
+### _Java_
+Installation of Selenium libraries for Java can be done using Maven.
+Add the _selenium-java_ dependency in your project pom.xml:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+The _selenium-java_ dependency supports running your automation
+project with all Selenium supported browsers. If you want to run tests
+only in a specific browser, you can add the dependency for that browser
+in your _pom.xml_ file.
+For example, you should add following dependency in your _pom.xml_
+file to run your tests only in Firefox:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+In a similar manner, if you want to run tests only in Chrome,
+you should add the following dependency:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+### _Python_
+Installation of Selenium libraries for Python can be done using pip:
+
+```shell
+pip install selenium
+```
+
+Alternatively you can download the [PyPI source archive](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) and install it using _setup.py_:
+
+```shell
+python setup.py install
+```
+
+### _C#_
+Installation of Selenium libraries for C# can be done using NuGet:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+### _Ruby_
+Installation of Selenium libraries for Ruby can be done using gem:
+
+```shell
+gem install selenium-webdriver
+```
+
+### _JavaScript_
+Installation of Selenium libraries for JavaScript can be done using npm:
+
+```shell
+npm install selenium-webdriver
+```
+
+
+
+
diff --git a/docs_source_files/content/selenium_installation/installing_selenium_libraries.zh-cn.md b/docs_source_files/content/selenium_installation/installing_selenium_libraries.zh-cn.md
new file mode 100644
index 00000000000..de91c6e6019
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_selenium_libraries.zh-cn.md
@@ -0,0 +1,84 @@
+---
+title: "安装 Selenium 库"
+weight: 1
+---
+
+首先,您需要为自动化项目安装 Selenium 绑定库。
+库的安装过程取决于您选择使用的语言。
+
+## _Java_
+
+可以使用 Maven 安装 Java 的 Selenium 库。
+在项目 pom.xml 中添加 _selenium-java_ 依赖项:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-java
+ 3.X
+
+```
+
+_selenium-java_ 依赖项支持在所有 Selenium 支持的浏览器中运行自动化项目。
+如果只想在特定的浏览器中运行测试,可以在 _pom.xml_ 文件中添加该浏览器的依赖项。
+例如,您应该在 _pom.xml_ 文件中添加以下依赖项,以便于只在 Firefox 中运行测试:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-firefox-driver
+ 3.X
+
+```
+
+同样,如果您只想在 Chrome 上运行测试,您应该添加以下依赖项:
+
+```xml
+
+ org.seleniumhq.selenium
+ selenium-chrome-driver
+ 3.X
+
+```
+
+## _Python_
+
+可以使用 pip 安装 Python 的 Selenium 库:
+
+```shell
+pip install selenium
+```
+
+或者,您也可以下载 [PyPI source archive](https://pypi.org/project/selenium/#files)
+(selenium-x.x.x.tar.gz) 并使用 _setup.py_ 进行安装:
+
+```shell
+python setup.py install
+```
+
+## _C#_
+
+可以使用 NuGet 安装 C# 的 Selenium 库:
+
+```shell
+# Using package manager
+Install-Package Selenium.WebDriver
+# or using .Net CLI
+dotnet add package Selenium.WebDriver
+```
+
+## _Ruby_
+
+可以使用 gem 安装 Ruby 的 Selenium 库:
+
+```shell
+gem install selenium-webdriver
+```
+
+## _JavaScript_
+
+可以使用 npm 安装 JavaScript 的 Selenium 库
+
+```shell
+npm install selenium-webdriver
+```
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.en.md b/docs_source_files/content/selenium_installation/installing_standalone_server.en.md
new file mode 100644
index 00000000000..fa0d994a023
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.en.md
@@ -0,0 +1,22 @@
+---
+title: "Installing Standalone server"
+weight: 3
+---
+
+If you plan to use [Grid]({{< ref "/grid/_index.md" >}}) then you should download the
+[selenium-server-standalone JAR](//www.seleniumhq.org/download/) file.
+ The _selenium-server-standalone_ jar is never uploaded, but all the components are available via
+ [selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/).
+ The standalone JAR contains everything, including the remote Selenium server
+ and the client-side bindings.
+ This means that if you use the selenium-server-standalone jar
+ in your project, you do not have to add selenium-java
+ or a browser specific jar.
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.es.md b/docs_source_files/content/selenium_installation/installing_standalone_server.es.md
new file mode 100644
index 00000000000..08025967549
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.es.md
@@ -0,0 +1,23 @@
+---
+title: "Instalación del servidor Standalone"
+weight: 3
+---
+
+Si planeas usar [Grid]({{< ref "/grid/_index.md" >}}) debes descargar el fichero
+[selenium-server-standalone JAR](//www.seleniumhq.org/download/).
+El jar _selenium-server-standalone_ nunca se carga, pero todos los componentes están disponibles a través de
+[selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/).
+El _standalone_ JAR contiene todo, incluso el servidor remoto de Selenium
+y los enlaces del lado del cliente.
+Ésto quiere decir que si usas el selenium-server-standalone jar
+en tu proyecto, no tienes que añadir selenium-java
+o un jar de navegador específico.
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
+
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.fr.md b/docs_source_files/content/selenium_installation/installing_standalone_server.fr.md
new file mode 100644
index 00000000000..d54e044cfbd
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.fr.md
@@ -0,0 +1,28 @@
+---
+title: "Installer le serveur Standalone"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+If you plan to use [Grid]({{< ref "/grid/_index.md" >}}) then you should download the
+[selenium-server-standalone JAR](//www.seleniumhq.org/download/) file.
+ The _selenium-server-standalone_ jar is never uploaded, but all the components are available via
+ [selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/).
+ The standalone JAR contains everything, including the remote Selenium server
+ and the client-side bindings.
+ This means that if you use the selenium-server-standalone jar
+ in your project, then you don't have to add selenium-java
+ or a browser specific jar.
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.ja.md b/docs_source_files/content/selenium_installation/installing_standalone_server.ja.md
new file mode 100644
index 00000000000..85c2dbbc50e
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.ja.md
@@ -0,0 +1,27 @@
+---
+title: "Installing Standalone server"
+weight: 3
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+If you plan to use [Grid]({{< ref "/grid/_index.md" >}}) then you should download the
+[selenium-server-standalone JAR](//www.seleniumhq.org/download/) file.
+ The _selenium-server-standalone_ jar is never uploaded, but all the components are available via
+ [selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/).
+ The standalone JAR contains everything, including the remote Selenium server
+ and the client-side bindings.
+ This means that if you use the selenium-server-standalone jar
+ in your project, then you don't have to add selenium-java
+ or a browser specific jar.
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.nl.md b/docs_source_files/content/selenium_installation/installing_standalone_server.nl.md
new file mode 100644
index 00000000000..020b02c2bf5
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.nl.md
@@ -0,0 +1,31 @@
+---
+title: "Installing Standalone server"
+weight: 3
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Installing Standalone server
+
+
+If you plan to use [Grid]({{< ref "/grid/_index.md" >}}) then you should download the
+[selenium-server-standalone JAR](//www.seleniumhq.org/download/) file.
+ The _selenium-server-standalone_ jar is never uploaded, but all the components are available via
+ [selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/).
+ The standalone JAR contains everything, including the remote Selenium server
+ and the client-side bindings.
+ This means that if you use the selenium-server-standalone jar
+ in your project, then you don't have to add selenium-java
+ or a browser specific jar.
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/installing_standalone_server.zh-cn.md b/docs_source_files/content/selenium_installation/installing_standalone_server.zh-cn.md
new file mode 100644
index 00000000000..b12d8fce3e9
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_standalone_server.zh-cn.md
@@ -0,0 +1,19 @@
+---
+title: "安装独立服务器"
+weight: 3
+---
+
+如果您打算使用 [Grid]({{< ref "/grid/_index.md" >}}),
+那么您应该下载 [selenium-server-standalone JAR](//www.seleniumhq.org/download/) 文件,
+_selenium-server-standalone_ jar 文件不会被上传,
+但是所有的组件都可以通过 [selenium-server](//repo1.maven.org/maven2/org/seleniumhq/selenium/selenium-server/) 提供。
+standalone JAR 文件包含所有内容,包括远程 Selenium 服务器和客户端绑定。
+这意味着,如果在项目中使用 selenium-server-standalone JAR,则不必添加 selenium-java 或浏览器特定的 jar。
+
+ ```xml
+
+ org.seleniumhq.selenium
+ selenium-server
+ 3.X
+
+```
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.en.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.en.md
new file mode 100644
index 00000000000..baeca92ecc8
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.en.md
@@ -0,0 +1,11 @@
+---
+title: "Installing WebDriver binaries"
+weight: 2
+---
+
+To execute your project and control the browser you need to have
+browser-specific WebDriver binaries installed.
+
+Download the [WebDriver binary]({{< ref "/webdriver/driver_requirements.en.md#quick-reference" >}})
+supported by your browser and place it in the
+[System PATH]({{< ref "/webdriver/driver_requirements.en.md#adding-executables-to-your-path" >}}).
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.es.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.es.md
new file mode 100644
index 00000000000..aad03799a79
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.es.md
@@ -0,0 +1,11 @@
+---
+title: "Instalación de las librerías WebDriver"
+weight: 2
+---
+
+
+Para ejecutar su proyecto y controlar el navegador, debe tener instalados los binarios de WebDriver específicos del navegador.
+
+Descargue el [binario del WebDriver]({{< ref "/webdriver/driver_requirements.es.md#quick-reference" >}})
+compatible con su navegador y colóquelo en el [RUTA o PATH del sistema]({{< ref "/webdriver/driver_requirements.es.md#adding-executables-to-your-path" >}}).
+
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.fr.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.fr.md
new file mode 100644
index 00000000000..05321e60ebf
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.fr.md
@@ -0,0 +1,17 @@
+---
+title: "Installer les binaires WebDriver"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+To execute your project and control browser you need to have
+browser-specific WebDriver binaries installed.
+
+Download the [WebDriver binary]({{< ref "/webdriver/driver_requirements.fr.md#quick-reference" >}})
+supported by your browser and place it in the
+[System PATH]({{< ref "/webdriver/driver_requirements.fr.md#adding-executables-to-your-path" >}}).
\ No newline at end of file
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.ja.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.ja.md
new file mode 100644
index 00000000000..d2782ba7e95
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.ja.md
@@ -0,0 +1,16 @@
+---
+title: "Installing WebDriver binaries"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+To execute your project and control browser you need to have
+browser-specific WebDriver binaries installed.
+
+Download the [WebDriver binary]({{< ref "/webdriver/driver_requirements.ja.md#quick-reference" >}})
+supported by your browser and place it in the
+[System PATH]({{< ref "/webdriver/driver_requirements.ja.md#adding-executables-to-your-path" >}}).
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.nl.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.nl.md
new file mode 100644
index 00000000000..84e544d29c4
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.nl.md
@@ -0,0 +1,19 @@
+---
+title: "Installing WebDriver binaries"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+## Installing WebDriver binaries
+
+To execute your project and control browser you need to have
+browser-specific WebDriver binaries installed.
+
+Download the [WebDriver binary]({{< ref "/webdriver/driver_requirements.nl.md#quick-reference" >}})
+supported by your browser and place it in the
+[System PATH]({{< ref "/webdriver/driver_requirements.nl.md#adding-executables-to-your-path" >}}).
diff --git a/docs_source_files/content/selenium_installation/installing_webdriver_binaries.zh-cn.md b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.zh-cn.md
new file mode 100644
index 00000000000..506070e5f53
--- /dev/null
+++ b/docs_source_files/content/selenium_installation/installing_webdriver_binaries.zh-cn.md
@@ -0,0 +1,8 @@
+---
+title: "安装 WebDriver 二进制文件"
+weight: 2
+---
+
+要执行项目并控制浏览器,需要安装特定于浏览器的 WebDriver 二进制文件。
+
+下载 [WebDriver 二进制文件]({{< ref "/webdriver/driver_requirements.zh-cn.md#quick-reference" >}}) 并放入 [系统 PATH 环境变量]({{< ref "/webdriver/driver_requirements.zh-cn.md#adding-executables-to-your-path" >}}) 中.
diff --git a/docs_source_files/content/support_packages/_index.en.md b/docs_source_files/content/support_packages/_index.en.md
new file mode 100644
index 00000000000..fc0f09a61d4
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.en.md
@@ -0,0 +1,8 @@
+---
+title: "Support packages"
+chapter: true
+weight: 11
+---
+
+# Support packages
+
diff --git a/docs_source_files/content/support_packages/_index.es.md b/docs_source_files/content/support_packages/_index.es.md
new file mode 100644
index 00000000000..243ed58c82c
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.es.md
@@ -0,0 +1,14 @@
+---
+title: "Paquetes de soporte"
+chapter: true
+weight: 11
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Paquetes de soporte
+
diff --git a/docs_source_files/content/support_packages/_index.fr.md b/docs_source_files/content/support_packages/_index.fr.md
new file mode 100644
index 00000000000..004e9930523
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.fr.md
@@ -0,0 +1,14 @@
+---
+title: "Packages de support"
+chapter: true
+weight: 11
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Packages de support
+
diff --git a/docs_source_files/content/support_packages/_index.ja.md b/docs_source_files/content/support_packages/_index.ja.md
new file mode 100644
index 00000000000..2b37e2fe593
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.ja.md
@@ -0,0 +1,12 @@
+---
+title: "Support packages"
+chapter: true
+weight: 11
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+# Support packages
diff --git a/docs_source_files/content/support_packages/_index.nl.md b/docs_source_files/content/support_packages/_index.nl.md
new file mode 100644
index 00000000000..bc972f3255c
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.nl.md
@@ -0,0 +1,14 @@
+---
+title: "Support packages"
+chapter: true
+weight: 11
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+# Support packages
+
diff --git a/docs_source_files/content/support_packages/_index.zh-cn.md b/docs_source_files/content/support_packages/_index.zh-cn.md
new file mode 100644
index 00000000000..6f0ebfc627c
--- /dev/null
+++ b/docs_source_files/content/support_packages/_index.zh-cn.md
@@ -0,0 +1,13 @@
+---
+title: "Support packages"
+chapter: true
+weight: 11
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+# Support packages
+
diff --git a/docs_source_files/content/support_packages/browser_navigation.en.md b/docs_source_files/content/support_packages/browser_navigation.en.md
new file mode 100644
index 00000000000..39506983c1f
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.en.md
@@ -0,0 +1,64 @@
+---
+title: "Browser navigation"
+weight: 1
+---
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/browser_navigation.es.md b/docs_source_files/content/support_packages/browser_navigation.es.md
new file mode 100644
index 00000000000..ff9ad9a517c
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.es.md
@@ -0,0 +1,70 @@
+---
+title: "Navegación"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/browser_navigation.fr.md b/docs_source_files/content/support_packages/browser_navigation.fr.md
new file mode 100644
index 00000000000..f698a86f5ad
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.fr.md
@@ -0,0 +1,70 @@
+---
+title: "Navigation"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/browser_navigation.ja.md b/docs_source_files/content/support_packages/browser_navigation.ja.md
new file mode 100644
index 00000000000..4e22c657659
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.ja.md
@@ -0,0 +1,69 @@
+---
+title: "Browser navigation"
+weight: 1
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
diff --git a/docs_source_files/content/support_packages/browser_navigation.nl.md b/docs_source_files/content/support_packages/browser_navigation.nl.md
new file mode 100644
index 00000000000..1a0bc68a6e9
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.nl.md
@@ -0,0 +1,70 @@
+---
+title: "Browser navigation"
+weight: 1
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/browser_navigation.zh-cn.md b/docs_source_files/content/support_packages/browser_navigation.zh-cn.md
new file mode 100644
index 00000000000..016828cb028
--- /dev/null
+++ b/docs_source_files/content/support_packages/browser_navigation.zh-cn.md
@@ -0,0 +1,69 @@
+---
+title: "Browser navigation"
+weight: 1
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+There are commands for various webpage loading actions:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+// Navigate to a URL (both of the statements below are
+// functionally equivalent).
+driver.get("https://www.google.com");
+driver.navigate().to("https://www.google.com");
+
+// Go forward one page in the browser (if you're not on the
+// last page that was viewed).
+driver.navigate().forward();
+
+// Go back one page in the browser (if you're not on the
+// first page that was viewed).
+driver.navigate().back();
+
+// Refresh the current page.
+driver.navigate().refresh();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+# Navigate to a URL.
+driver.get('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.forward()
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.back()
+
+# Refresh the current page.
+driver.refresh()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# Navigate to a URL (both of the statements below are
+# functionally equivalent).
+driver.get('https://www.google.com')
+driver.navigate.to('https://www.google.com')
+
+# Go forward one page in the browser (if you're not on the
+# last page that was viewed).
+driver.navigate.forward
+
+# Go back one page in the browser (if you're not on the
+# first page that was viewed).
+driver.navigate.back
+
+# Refresh the current page.
+driver.navigate.refresh
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.en.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.en.md
new file mode 100644
index 00000000000..63ffe52918e
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.en.md
@@ -0,0 +1,133 @@
+---
+title: "Mouse and keyboard actions in detail"
+weight: 4
+---
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it is visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it is possible to mimic hovering of the cursor over **e**. In order
+to do so, you will need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+* Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+* Delete the text that is in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.es.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.es.md
new file mode 100644
index 00000000000..8ae546d53bf
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.es.md
@@ -0,0 +1,140 @@
+---
+title: "Acciones en detalle del mouse y teclado"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it's visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it's possible to mimic hovering of the cursor over **e**. In order
+to do so, you'll need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+1. Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
2. Delete the text that's in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.fr.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.fr.md
new file mode 100644
index 00000000000..783cd9c66e4
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.fr.md
@@ -0,0 +1,139 @@
+---
+title: "Action clavier et souris en détail"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it's visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it's possible to mimic hovering of the cursor over **e**. In order
+to do so, you'll need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+1. Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
2. Delete the text that's in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.ja.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.ja.md
new file mode 100644
index 00000000000..381ee4ee57a
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.ja.md
@@ -0,0 +1,138 @@
+---
+title: "Mouse and keyboard actions in detail"
+weight: 4
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it's visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it's possible to mimic hovering of the cursor over **e**. In order
+to do so, you'll need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+1. Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
2. Delete the text that's in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.nl.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.nl.md
new file mode 100644
index 00000000000..0db017a9219
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.nl.md
@@ -0,0 +1,139 @@
+---
+title: "Mouse and keyboard actions in detail"
+weight: 4
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it's visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it's possible to mimic hovering of the cursor over **e**. In order
+to do so, you'll need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+1. Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
2. Delete the text that's in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.zh-cn.md b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.zh-cn.md
new file mode 100644
index 00000000000..6d7254158b9
--- /dev/null
+++ b/docs_source_files/content/support_packages/mouse_and_keyboard_actions_in_detail.zh-cn.md
@@ -0,0 +1,138 @@
+---
+title: "Mouse and keyboard actions in detail"
+weight: 4
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+Suppose you have an arbitrary web element **e:**
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+WebElement e = driver.findElement(By.id("testElement"));
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e = driver.find_element_by_id("testElement")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can simulate mouse clicking on e if it's visible and has a height and width
+that are greater than 0:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.click();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.click()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Moreover, it's possible to mimic hovering of the cursor over **e**. In order
+to do so, you'll need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.interactions.Actions;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver import ActionChains
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+With this statement in place, you can now move over the element in question:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Actions actions = new Actions(driver);
+actions.moveToElement(e);
+actions.perform();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+actions = ActionChains(driver)
+actions.move_to_element(e)
+actions.perform()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+If **e** is an **input** or **textarea** element, the following keyboard
+actions can be carried out:
+
+1. Enter a sequence of characters in e:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.sendKeys("Test");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.send_keys("Test")
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+
2. Delete the text that's in e (if there is any):
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+e.clear();
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+e.clear()
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+# We don't have a Ruby code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
\ No newline at end of file
diff --git a/docs_source_files/content/support_packages/working_with_colours.en.md b/docs_source_files/content/support_packages/working_with_colours.en.md
new file mode 100644
index 00000000000..9a226741850
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.en.md
@@ -0,0 +1,199 @@
+---
+title: "Working with colours"
+weight: 2
+---
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Would it not be nice if there was an easy way to compare
+a HEX representation of a colour with a RGB representation of a colour,
+or a RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There is a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_colours.es.md b/docs_source_files/content/support_packages/working_with_colours.es.md
new file mode 100644
index 00000000000..ce971c3363b
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.es.md
@@ -0,0 +1,205 @@
+---
+title: "Trabajando con colores"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Spanish. Do you speak Spanish? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Wouldn't it be nice if there was an easy way to compare
+a HEX representation of a colour with an RGB representation of a colour,
+or an RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There's a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_colours.fr.md b/docs_source_files/content/support_packages/working_with_colours.fr.md
new file mode 100644
index 00000000000..867f0ec5e37
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.fr.md
@@ -0,0 +1,205 @@
+---
+title: "Travailler avec les couleurs"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to French. Do you speak French? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Wouldn't it be nice if there was an easy way to compare
+a HEX representation of a colour with an RGB representation of a colour,
+or an RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There's a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_colours.ja.md b/docs_source_files/content/support_packages/working_with_colours.ja.md
new file mode 100644
index 00000000000..ff063dfd8e6
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.ja.md
@@ -0,0 +1,204 @@
+---
+title: "Working with colours"
+weight: 2
+---
+
+{{% notice info %}}
+ ページは英語から日本語へ訳されています。
+日本語は話せますか?プルリクエストをして翻訳を手伝ってください!
+{{% /notice %}}
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Wouldn't it be nice if there was an easy way to compare
+a HEX representation of a colour with an RGB representation of a colour,
+or an RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There's a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_colours.nl.md b/docs_source_files/content/support_packages/working_with_colours.nl.md
new file mode 100644
index 00000000000..4a2f71e2523
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.nl.md
@@ -0,0 +1,205 @@
+---
+title: "Working with colours"
+weight: 2
+---
+
+{{% notice info %}}
+ Page being translated from
+English to Dutch. Do you speak Dutch? Help us to translate
+it by sending us pull requests!
+{{% /notice %}}
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Wouldn't it be nice if there was an easy way to compare
+a HEX representation of a colour with an RGB representation of a colour,
+or an RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There's a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_colours.zh-cn.md b/docs_source_files/content/support_packages/working_with_colours.zh-cn.md
new file mode 100644
index 00000000000..39aabeaa2ad
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_colours.zh-cn.md
@@ -0,0 +1,204 @@
+---
+title: "Working with colours"
+weight: 2
+---
+
+{{% notice info %}}
+ 页面需要从英语翻译为简体中文。
+您熟悉英语与简体中文吗?帮助我们翻译它,通过 pull requests 给我们!
+{{% /notice %}}
+
+You will occasionally want to validate the colour of something as part of your tests;
+the problem is that colour definitions on the web are not constant.
+Wouldn't it be nice if there was an easy way to compare
+a HEX representation of a colour with an RGB representation of a colour,
+or an RGBA representation of a colour with a HSLA representation of a colour?
+
+Worry not. There's a solution: the _Color_ class!
+
+First of all, you will need to import the class:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.Color;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.color import Color
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now start creating colour objects.
+Every colour object will need to be created from a string representation of
+your colour.
+Supported colour representations are:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color HEX_COLOUR = Color.fromString("#2F7ED8");
+private final Color RGB_COLOUR = Color.fromString("rgb(255, 255, 255)");
+private final Color RGB_COLOUR = Color.fromString("rgb(40%, 20%, 40%)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(255, 255, 255, 0.5)");
+private final Color RGBA_COLOUR = Color.fromString("rgba(40%, 20%, 40%, 0.5)");
+private final Color HSL_COLOUR = Color.fromString("hsl(100, 0%, 50%)");
+private final Color HSLA_COLOUR = Color.fromString("hsla(100, 0%, 50%, 0.5)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+HEX_COLOUR = Color.from_string('#2F7ED8')
+RGB_COLOUR = Color.from_string('rgb(255, 255, 255)')
+RGB_COLOUR = Color.from_string('rgb(40%, 20%, 40%)')
+RGBA_COLOUR = Color.from_string('rgba(255, 255, 255, 0.5)')
+RGBA_COLOUR = Color.from_string('rgba(40%, 20%, 40%, 0.5)')
+HSL_COLOUR = Color.from_string('hsl(100, 0%, 50%)')
+HSLA_COLOUR = Color.from_string('hsla(100, 0%, 50%, 0.5)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+The Color class also supports all of the base colour definitions
+specified in
+[http://www.w3.org/TR/css3-color/#html4](//www.w3.org/TR/css3-color/#html4).
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color BLACK = Color.fromString("black");
+private final Color CHOCOLATE = Color.fromString("chocolate");
+private final Color HOTPINK = Color.fromString("hotpink");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+BLACK = Color.from_string('black')
+CHOCOLATE = Color.from_string('chocolate')
+HOTPINK = Color.from_string('hotpink')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Sometimes browsers will return a colour value of "transparent"
+if no colour has been set on an element.
+The Color class also supports this:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+private final Color TRANSPARENT = Color.fromString("transparent");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+TRANSPARENT = Color.from_string('transparent')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can now safely query an element
+to get its colour/background colour knowing that
+any response will be correctly parsed
+and converted into a valid Color object:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+Color loginButtonColour = driver.findElement(By.id("login")).getCssValue("color");
+Color loginButtonBackgroundColour = driver.findElement(By.id("login")).getCssValue("background-color");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+login_button_colour = driver.find_element_by_id('login').value_of_css_property('color')
+login_button_background_colour = driver.find_element_by_id('login').value_of_css_property('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+login_button_colour = driver.find_element(id: 'login').css_value('color')
+login_button_background_colour = driver.find_element(id: 'login').css_value('background-color');
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You can then directly compare colour objects:
+
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.equals(HOTPINK);
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour == HOTPINK
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour == HOTPINK)
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Or you can convert the colour into one of the following formats
+and perform a static validation:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+assert loginButtonBackgroundColour.asHex().equals("#ff69b4");
+assert loginButtonBackgroundColour.asRgba().equals("rgba(255, 105, 180, 1)");
+assert loginButtonBackgroundColour.asRgb().equals("rgb(255, 105, 180)");
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+assert login_button_background_colour.hex == '#ff69b4'
+assert login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)'
+assert login_button_background_colour.rgb == 'rgb(255, 105, 180)'
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+assert(login_button_background_colour.hex == '#ff69b4')
+assert(login_button_background_colour.rgba == 'rgba(255, 105, 180, 1)')
+assert(login_button_background_colour.rgb == 'rgb(255, 105, 180)')
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+Colours are no longer a problem.
diff --git a/docs_source_files/content/support_packages/working_with_select_elements.en.md b/docs_source_files/content/support_packages/working_with_select_elements.en.md
new file mode 100644
index 00000000000..77c4a759f9b
--- /dev/null
+++ b/docs_source_files/content/support_packages/working_with_select_elements.en.md
@@ -0,0 +1,233 @@
+---
+title: "Working with select elements"
+weight: 3
+---
+
+Select elements can require quite a bit of boiler plate code to automate.
+To reduce this, and make your tests cleaner, there is a
+`Select` class in the Selenium support package.
+To use it, you will need the following import statement:
+
+{{< code-tab >}}
+ {{< code-panel language="java" >}}
+import org.openqa.selenium.support.ui.Select;
+ {{< / code-panel >}}
+ {{< code-panel language="python" >}}
+from selenium.webdriver.support.select import Select
+ {{< / code-panel >}}
+ {{< code-panel language="csharp" >}}
+// We don't have a C# code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+ {{< code-panel language="ruby" >}}
+include Selenium::WebDriver::Support
+ {{< / code-panel >}}
+ {{< code-panel language="javascript" >}}
+// We don't have a JavaScript code sample yet - Help us out and raise a PR
+ {{< / code-panel >}}
+{{< / code-tab >}}
+
+You are then able to create a Select object using a WebElement that
+references a `