node package manager



NPM Version Build Status Coverage Status Dependency Status

wd-runjs is a tiny command which runs JavaScript code on browsers by piping stdin via Selenium WebDriver.


wd-runjs uses the WebDriver or the Selenium Server for running JavaScript code on browsers.

If you have already installed Docker onto your local machine, you can use docker-compose for starting a Selenium Grid Hub and Selenium nodes. See masnagam/docker-compose-collection for details.


  Usage: wd-runjs [options] [URI, path to a navigation script or a window index starting with @ ...]

  Run JavaScript code on browsers by piping stdin via Selenium WebDriver


    -h, --help                    output usage information
    -V, --version                 output the version number
    -b, --browser <browser>       Browser where the JavaScript code will be run (default: chrome)
    -c, --concurrency <number>    Number of ControlFlows to be run at the same time (default: 1)
    -l, --logging <logger:level>  Filters for the local logging of selenium-webdriver (default: '')
    -o, --browser-options <json>  Browser specific options (default: [object Object])
    -s, --server [uri]            Use a WebDriver server which is already running (default: false)

When it is succeeded to execute the JavaScript code, wd-runjs outputs a JSON array of the following format to stdout.

  "uri": "<uri>",
  "browser": "<browser>",
  "title": "<title>",
  "result": <result-json>

When it is failed, error is output instead of result.


Maximum depth of nested elements:

$ cat examples/max-depth.js | wd-runjs

Tag statistics:

$ cat examples/tags.js | wd-runjs

By using jq, it is possible to process a result JSON as follows:

$ cat examples/tags.js | wd-runjs | \
    jq '.[] | { uri, browser, countTags: [.result[]] | add }'
  "uri": "",
  "browser": "chrome",
  "countTags": 257

Use of a URI list:

$ cat uris
$ echo "return 'hello';" | wd-runjs -c 3 $(cat uris)

It is recommended to specify the concurrency number less than the number of available Chrome instances.

Navigation script:

$ cat examples/tags.js | wd-runjs examples/navigation.js

The navigation script has to export navigate() function like below:

module.exports.navigate = (driver) => {

By using the navigation script, it is possible to run a script on web pages where the user authentication is required.


By using the logging option, it is possible to output messages for debugging.

The following loggers are defined in wd-runjs.

  • wd-runjs.flow-pool
  • wd-runjs.script-runner
  • webdriver.Builder
  • webdriver.http
  • webdriver.http.Executor
  • promise

For available levels, see selenium-webdriver's document.

It is possible to specify multiple logging options as follows:

$ wd-runjs -l wd-runjs:DEBUG -l promise:FINER

For outputting all log messages, specify the logging option like below:

$ wd-runjs -l :ALL

At this time, the remote logging is not supported.

Connecting to an existing browser

Chrome running with --remote-debugging-port=9222:

$ wd-runjs -o '{"debuggerAddress": "localhost:9222"}'

The JavaScript code will be executed on the current tab/window of the existing Chrome browser.

At the moment, this feature only works with the ChromeDriver.


This software is distributed under the MIT license. See LICENSE file for details.