javascript/selenium-webdriver/CHANGES.md
default as a value for SameSite (#16129)can request cookies (#16141)setCacheBehavior command (#15136)npm run lint pass for javascript/selenium-webdriver (#13560)Fix logging levels in http.js and webdriver.js (#13098)
Remove unused targets from the JS tree (#13129)
Add CDP v120 and remove v117
execSync with spawnSync in seleniumManager.js (#11649) (#11873)fix: iedriver download with selenium-manager #11579
Deprecates withCapabilities method and removes tests (#9701)
expose withLocator method at the top level
Enables Mobile feature for Firefox (Still need to expand this to chromium based browsers)
Add the ability to do Relative Locators with all By types. Fixes #9559
Add default Opera capabilities. Fixes #9654
Add support for ChromeDriver --enable-chrome-logs (
#9575) [Author: Mark Stacey]
The --enable-chrome-logs ChromeDriver option can now be enabled using the
Chromium (or Chrome)
ServiceBuilder, similarly to the other options provided by ChromeDriver.
Add the debuggerAddress option to chromium.js ( #9561) [Author: Brandon Walderman]
Adds http client options [#9638](Author: Dharin Shah)
Updating edge.js to extend chromium.driver (fixes #9626)
print endpoint (#8880)Rolling back native support for Opera Browser
Added new ieOptions capabilities:
addArguments(...args) in favor
of addBrowserCommandSwitches(...args)Added relative locators
Added Chrome DevTools Protocol (CDP) support
Added support for BASIC authentication.
Added listener for DOM mutations.
Added support for listening out for console log events.
Added support listening js exceptions using CDP
pollTimeout argument to the wait() method. Default value is 200msswitchTo().parentFrame() for non-W3C compatible driverslib/input.Origin from the top level selenium-webdriver module.selenium/${VERSION} (js ${PLATFORM}).Native support has been removed for Opera and PhantomJS as the WebDriver implementations for these browsers are no longer under active development.
For Opera, users should be able to simply rely on testing Chrome as the Opera
browser is based on Chromium (and the operadriver was a thin wrapper around
chromedriver). For PhantomJS, users should use Chrome or Firefox in headless
mode (see example/headless.js)
Revamped the actions API to conform with the WebDriver Spec:
https://www.w3.org/TR/webdriver/#actions. For details, refer to the JS doc
on
the lib/input.Actions class.
As of January, 2018, only Firefox natively supports this new API. You can put
the Actions class
into "bridge mode" and it will attempt to translate mouse and keyboard actions
to the legacy API (
see class docs). Alternatively, you may continue to use the legacy API
directly via
the lib/actions module.
NOTE: The legacy API is considered strongly deprecated and will be removed
in a minor release
once Google's Chrome and Microsoft's Edge browsers support the new API.
All window manipulation commands are now supported.
Added driver.switchTo().parentFrame()
When a named cookie is requested, attempt to fetch it directly using the W3C
endpoint, GET /session/{session id}/cookie/{name}. If this command is not
recognized by the
remote end, fallback to fetching all cookies and then searching for the
desired name.
Replaced WebElement.getSize() and WebElement.getLocation() with a single
method, WebElement.getRect().
index.Builder#setControlFlow()cancel() method:index.Builderlib/webdriver.AlertPromiselib/webdriver.WebElementPromiseremote/index.DriverService.prototype.stop() (use #kill() instead)lib/actions modulelib/events modulephantomjs modulelib/promise, which includes the removal of
the following
exported names (replacements, if any, in parentheses):
Builder class:
chrome.Driver
chrome.Options
Capabilities classedge.Options
Capabilities classie.Options
Capabilities classfirefox.Binary class. Custom binaries can still be selected
using firefox.Options#setBinary(). Likewise, custom binary arguments can be
specified
with firefox.Options#addArguments().firefox.Driver
firefox.Options
Capabilities classfirefox.Profile class. All of its functionality is now provided
directly
by firefox.Optionsfirefox/binary modulefirefox/profile modulesafari.Options
Capabilities classlib/capabilities.Browser:
lib/capabilities.Capabilities:
lib/error:
lib/webdriver.WebDriver:
lib/input.Actions classWebDriver.attachToSession() factory method. Users can just
the WebDriver
constructor directly instead.call() method. This was used to inject custom function calls
into the control
flow. Now that the promise manager is no longer used, this method is no
longer necessary.
Users are now responsible for coordinating actions (ideally with async
functions) and can just
call functions directly instead of through driver.call().lib/webdriver.WebElement:
lib/webdriver.Alert:
lib/webdriver.Options (driver.manage()):
lib/webdriver.Window (driver.manage().window()):
testing/assert moduletesting/index
suite function. For details, refer to the jsdoc or
example/google_search_test.jsremote.DriverService#kill()selenium-webdriver/firefox.Options:
selenium-webdriver/firefox/binary.Binaryselenium-webdriver/firefox.Options#useGeckoDriver()selenium-webdriver/firefox/profile.decode()selenium-webdriver/firefox/profile.Profile that had no
effect since support
for the legacy FirefoxDriver was dropped in 3.5.0:
selenium-webdriver/firefox.ServiceBuilder#setFirefoxBinary(); custom
binaries should be
configured through the firefox.Options class.selenium-webdriver/firefox.Capability. These hold overs from the
legacy FirefoxDriver
are no longer supported.error.ElementNotVisibleError in favor of the more generic
error.ElementNotInteractableError.httpOnly option when adding a cookie.Native support for Firefox 45 (ESR) has been removed. Users will have to connect to a remote Selenium server that supports Firefox 45.
SELENIUM_MARIONETTE environment variable no longer has an effect.selenium-webdriver/firefox.Capability.MARIONETTE is deprecated.selenium-webdriver/firefox.Options#useGeckoDriver() is deprecated and now
a no-op.firefox.Options will no longer discard the "moz:firefoxOptions" set in
user provided
capabilities (via Builder.withCapabilities({})). When both are used, the
settings
in firefox.Options will be applied last.chrome.Options#headless() and chrome.Options#windowSize(), which may
be used to start
Chrome in headless mode (requires Chrome 59+) and to set the initial window
size, respectively.error.WebDriverError#remoteStacktrace to capture the stacktrace
reported by a remote
WebDriver endpoint (if any).WebElement#sendKeys to send text as a string instead of an array of
strings.This release requires geckodriver 0.15.0 or newer.
Options#getTimeouts() for retrieving the currently configured session
timeouts (i.e.
implicit wait). This method will only work with W3C compatible WebDriver
implementations.Timeouts class in favor of Options#setTimeouts(), which
supports setting
multiple timeouts at once.value
key.Added warning log messages when the user creates new managed promises, or schedules unchained tasks. Users may opt in to printing these log messages with
const { logging } = require('selenium-webdriver')
logging.installConsoleHandler()
logging.getLogger('promise.ControlFlow').setLevel(logging.Level.WARNING)
If the JAVA_HOME environment variable is set, use it to locate java.exe.
lib package is once again platform agnostic (excluding lib/devmode).promise.when(value, callback, errback).
Use promise.fulfilled(value).then(callback, errback)promise.fulfilled(value), promise.rejected(reason) and
promise.defer() to all use native promises when the promise manager is
disabled.selenium-webdriver/testing to export describe.only along with
describe.skip.selenium-webdriver/lib/until.ableToSwitchToFrame. It was previously
dropping arguments and
would never work.promise.fulfilled(value), use promise.Promise#resolve(value)promise.rejected(reason), use promise.Promise#reject(reason)wait() condition times out, the returned promise will now be rejected
with
an error.TimeoutError instead of a generic Error object.WebDriver#wait() will now throw a TypeError if an invalid wait condition is
provided.(NOTICE) The minimum supported version of Node is now 6.9.0 LTS
Removed support for the SafariDriver browser extension. This has been replaced by Apple's safaridriver, which is included with Safari 10 (available on OS X El Capitan and macOS Sierra).
To use Safari 9 or older, users will have to use an older version of Selenium.
geckodriver v0.11.0 or newer is now required for Firefox.
Fixed potential reference errors in selenium-webdriver/testing when users
create a cycle with
mocha by running with mocha's --hook flag.
Fixed WebDriver.switchTo().activeElement() to use the correct HTTP method
for compatibility with
the W3C spec.
Update the selenium-webdriver/firefox module to use geckodriver's
"moz:firefoxOptions" dictionary for Firefox-specific configuration values.
Extending the selenium-webdriver/testing module to support tests defined
using generator
functions.
The promise manager can be disabled by setting an environment variable:
SELENIUM_PROMISE_MANAGER=0. This is part of a larger plan to remove the
promise manager, as
documented at
https://github.com/SeleniumHQ/selenium/issues/2969
When communicating with a W3C-compliant remote end, use the atoms library for
the WebElement.getAttribute() and WebElement.isDisplayed() commands. This
behavior is
consistent with the java, .net, python, and ruby clients.
safari.Options#useLegacyDriver()promise.Thenable for compatibility with native promises:
#isPending()#cancel()#finally()webdriver.WebDriver to overload the static
function WebDriver.createSession() instead of doing work in the constructor.
All constructors
now inherit the base class' function signature. Users are still encouraged to
use the Builder
class instead of creating drivers directly.Builder#build() now returns a "thenable" WebDriver instance, allowing users
to immediately
schedule commands (as before), or issue them through standard promise
callbacks. This is the same
pattern already employed for WebElements.Builder#buildAsync() as it was redundant with the new semantics of
build().firefox.ServiceBuilder class, which may be used to customize the
geckodriver used
for firefox.Driver instances.safari.Options#useLegacyDriver, to use the safari extension driver.lib/proxy module to support configuring a SOCKS proxy.promise.ControlFlow, fire the "uncaughtException" event in a new
turn of the JS event
loop. As a result of this change, any errors thrown by an event listener will
propagate to the
global error handler. Previously, this event was fired with in the context of
a (native) promise
callback, causing errors to be silently suppressed in the promise chain.remote.DriverService.Builder as a base class for configuring
DriverService instances that
run in a child-process. The
chrome.ServiceBuilder, edge.ServiceBuilder, and opera.ServiceBuilder
classes now all extend this base class with browser-specific options.usingPort and
withEnvironment to setPort and setEnvironment, respectively.chrome.ServiceBuilder#setUrlBasePath to #setPathfirefox.Driver from (config, flow, executor)
to (config, executor, flow).Condition and WebElementCondition classes from the top-level
selenium-webdriver module (these were previously only available from
lib/webdriver).builder.Builder class into the main module (selenium-webdriver).builder module.webdriver.WebDriver#setFileDetector when driving Chrome or Firefox on a
remote machine.builder.Builder#usingHttpAgent()until.urlIs(), until.urlContains(),
until.urlMatches()http.Executor now accepts a promised client. The builder.Builder class
will now use this
instead of a command.DeferredExecutor when creating WebDriver instances.builder.Builder class will always return an
instanceof chrome.Driver and firefox.Driver, respectively, even when
configured to use a
remote server (from builder.Builder#usingServer(url),
SELENIUM_REMOTE_URL, etc).promise.Deferred is no longer a thenable object.Options#addCookie() now takes a record object instead of 7 individual
parameters. A TypeError
will be thrown if addCookie() is called with invalid arguments.firefox.Options#useMarionette to firefox.Options#useGeckoDriverselenium-webdriver/error (use selenium-webdriver/lib/error,error property exported by selenium-webdriver)selenium-webdriver/executors — this was not previously deprecated, but is
no longer used.command.DeferredExecutor — this was not previously deprecated, but is no
longer used. It can
be trivially implemented by clients should it be needed.error.InvalidSessionIdError (use error.NoSuchSessionError)executors.DeferredExecutoruntil.Condition (use webdriver.Condition)until.WebElementCondition (use webdriver.WebElementCondition)webdriver.UnhandledAlertError (use error.UnexpectedAlertOpenError)Deferred#cancel()Deferred#catch()Deferred#finally()Deferred#isPending()Deferred#then()Promise#thenCatch()Promise#thenFinally()WebDriver#isElementPresent()WebElement#getInnerHtml()WebElement#getOuterHtml()WebElement#getRawId()WebElement#isElementPresent()WebDriverError#codeio.exists() to return a rejected promise if the input path is not a
stringPromise#thenFinally() - use Promise#finally(). The thenFinally
shim added to the
promise module in v2.53.0 will be removed in v3.0 Sorry for the churn!WebDriver.attachToSessionremote.FileDetector
will ignore paths that refer to a directory.Added preliminary support for Marionette, Mozilla's WebDriver implementation
for Firefox.
Marionette may be enabled via the API,
firefox.Options#useMarionette, or by setting the SELENIUM_MARIONETTE
environment variable.
Moved all logic for parsing and interpreting responses from the remote end
into the
individual command.Executor implementations.
For consistency with the other Selenium language bindings,
WebDriver#isElementPresent() and WebElement#isElementPresent() have been
deprecated. These
methods will be removed in v3.0. Use the findElements command to test for the
presence of an
element:
driver.findElements(By.css('.foo')).then(found => !!found.length);
Added support for W3C-spec compliant servers.
For consistent naming, deprecating error.InvalidSessionIdError in favor of
error.NoSuchSessionError.
Moved the error module to lib/error so all core modules are co-located.
The top-level error
module will be removed in v3.0.
Moved until.Condition and until.WebElementCondition to the webdriver
module to break a
circular dependency.
Added support for setting the username and password in basic auth pop-up dialogs (currently IE only).
Deprecated WebElement#getInnerHtml() and WebEleemnt#getOuterHtml()
Deprecated Promise#thenCatch() - use Promise#catch() instead
Deprecated Promise#thenFinally() - use promise.thenFinally() instead
FIXED: io.findInPath() will no longer match against directories that have
the same basename as
the target file.
FIXED: phantomjs.Driver now takes a third argument that defines the path to
a log file to use
for the phantomjs executable's output. This may be quickly set at runtime with
the SELENIUM_PHANTOMJS_LOG environment variable.
element.sendKeys(...) to send the key sequence as an array where
each element defines a
single key. The legacy wire protocol permits arrays where each element is a
string of arbitrary
length. This change is solely at the protocol level and should have no
user-visible effect.Starting with v2.52.0, each release of selenium-webdriver will support the latest minor LTS and stable Node releases. All releases between the LTS and stable release will have best effort support. Further details are available in the selenium-webdriver package README.
webdriver.Builder#buildAsync(), which returns a promise that will be
fulfilled with the
newly created WebDriver instance once the associated browser has been full
initialized. This is
purely a convenient alternative to the existing build() method as the
WebDriver class will always
defer commands until it has a fully created browser.firefox.Profile#setHost() which may be used to set the host that the
FirefoxDriver's
server listens for commands on. The server uses
"localhost" by default.promise.Promise#catch() for API compatibility with native Promises.
promise.Promise#thenCatch() is not yet deprecated, but it simply delegates
to catch.io operations to use native promises.command.Executor#execute() and HttpClient#send() to return
promises instead of using
callback passing.Serializable class with an internal, Symbol-defined method.Capabilities class to extend the native Map type.Capabilities.has(key) to only test if a capability has been set
(Map semantics). To check whether the value is true, use get(key).executors.DeferredExecutor in favor of
lib/command.DeferredExecutor.error module to export an Error subtype for each type of error
defined in
the W3C WebDriver spec.http.Request and http.Response classes to store headers in
maps instead of object
literals.ws dependency to version 1.0.1.testing/assert module.By locators that are not in the W3C spec to delegated to using
CSS
selectors: By.className, By.id, By.name, and By.tagName.WebElement#takeScreenshot().Node v0.12.x users must run with --harmony. This is the last release that will support v0.12.x
FIXED: (Promise/A+ compliance) When a promise is rejected with a thenable, the
promise adopts the
thenable as its rejection reason instead of waiting for it to settle. The
previous (incorrect)
behavior was hidden by bugs in the promises-aplus-tests compliance test
suite that were fixed in
version
2.1.1.
FIXED: the webdriver.promise.ControlFlow now has a consistent execution
order for
tasks/callbacks scheduled in different turns of the JS event loop. Refer to
the webdriver.promise documentation for more details.
FIXED: do not drop user auth from the WebDriver server URL.
FIXED: a single firefox.Binary instance may be used to configure and launch
multiple
FirefoxDriver sessions.
var binary = new firefox.Binary();
var options = new firefox.Options().setBinary(binary);
var builder = new Builder().setFirefoxOptions(options);
var driver1 = builder.build();
var driver2 = builder.build();
FIXED: zip files created for transfer to a remote WebDriver server are no longer compressed. If the zip contained a file that was already compressed, the server would return an "invalid code lengths set" error.
FIXED: Surfaced the loopback option to remote/SeleniumServer. When set,
the server will be
accessed using the current host's loopback address.
This is the last release for selenium-webdriver that will support ES5.
Subsequent releases will depend on ES6 features that are enabled by
default in Node v4.0.0. Node v0.12.x will
continue to be supported, but will require setting the --harmony flag.
ws dependency from 0.7.1 to 0.8.00.10.x to 0.12.x. This
is in accordance with
the Node support policy established in v2.45.0.until.elementLocated()
and until.elementsLocated().webdriver.logging module. For usage, see
example/logging.js.Builder#usingWebDriverProxy()
for more info.ErrorCode.NO_MODAL_DIALOG_OPEN and
ErrorCode.MODAL_DIALOG_OPENED. Use ErrorCode.NO_SUCH_ALERT and
ErrorCode.UNEXPECTED_ALERT_OPEN, respectively.promise.ControlFlow will maintain state for promise chains
generated in a loop.promise.ControlFlow#wait() now has consistent semantics for an
omitted or 0-timeout: it
will wait indefinitely.remote.DriverService#start() will now fail if the child process dies
while waiting for
the server to start accepting requests. Previously, start would continue to
poll the server
address until the timeout expired.-silent flag to preheat the profile.
Starting with
Firefox 38, this would cause the browser to crash. This step, which was first
introduced for
Selenium's java client back with Firefox 2, no longer appears to be required.firefox.Driver#quit() will wait for the Firefox process to
terminate before
deleting the temporary webdriver profile. This eliminates a race condition
where Firefox would
write profile data during shutdown, causing the rm -rf operation on the
profile directory to
fail.chrome.Options API to cover all configuration
options (e.g. mobile
emulation and performance logging) documented on the
ChromeDriver project site.Starting with the 2.45.0 release, selenium-webdriver will support the last two stable minor releases for Node. For 2.45.0, this means Selenium will support Node 0.10.x and 0.12.x. Support for the intermediate, un-stable release (0.11.x) is "best-effort". This policy will be re-evaluated once Node has a major version release (i.e. 1.0.0).
Added native browser support for Internet Explorer, Opera 26+, and Safari
With the release
of Node 0.12.0
(finally!), the minimum supported version of Node is now 0.10.x.
The promise module is now Promises/A+
compliant. The biggest compliance change is that promise callbacks are now
invoked in a future
turn of the JS event loop. For example:
var promise = require('selenium-webdriver').promise;
console.log('start');
promise.fulfilled().then(function() {
console.log('middle');
});
console.log('end');
// Output in [email protected]
// start
// middle
// end
//
// Output in [email protected]
// start
// end
// middle
The promise.ControlFlow class has been updated to track the asynchronous
breaks required by
Promises/A+, so there are no changes to task execution order.
Updated how errors are annotated on failures. When a task fails, the
stacktrace from when that
task was scheduled is appended to the rejection reason with a From: prefix (
if it is an Error
object). For example:
var driver = new webdriver.Builder().forBrowser('chrome').build();
driver.get('http://www.google.com/ncr');
driver.call(function() {
driver.wait(function() {
return driver.isElementPresent(webdriver.By.id('not-there'));
}, 2000, 'element not found');
});
This code will fail an error like:
Error: element not found
Wait timed out after 2002ms
at <stack trace>
From: Task: element not found
at <stack trace>
From: Task: WebDriver.call(function)
at <stack trace>
Changed the format of strings returned by promise.ControlFlow#getSchedule.
This function now
accepts a boolean to control whether the returned string should include the
stacktraces for when
each task was scheduled.
Deprecating promise.ControlFlow#getHistory,
promise.ControlFlow#clearHistory, and promise.ControlFlow#annotateError.
These functions were
all intended for internal use and are no longer necessary, so they have been
made no-ops.
WebDriver.wait() may now be used to wait for a promise to resolve, with an
optional timeout.
Refer to the API documentation for more information.
Added support for copying files to a remote Selenium via sendKeys to test
file uploads. Refer to
the API documentation for more information. Sample usage included
in test/upload_test.js
Expanded the interactions API to include touch actions.
See WebDriver.touchActions().
FIXED: 8380: firefox.Driver will delete its temporary profile on quit.
FIXED: 8306: Stack overflow in promise callbacks eliminated.
FIXED: 8221: Added support for defining custom command mappings. Includes
support for
PhantomJS's executePhantomJS (requires PhantomJS 1.9.7 or GhostDriver
1.1.0).
FIXED: 8128: When the FirefoxDriver marshals an object to the page for
executeScript, it defines additional properties (required by the driver's
implementation). These
properties will no longer be enumerable and should be omitted (i.e. they won't
show up in
JSON.stringify output).
FIXED: 8094: The control flow will no longer deadlock when a task returns a promise that depends on the completion of sub-tasks.
Added the until module, which defines common explicit wait conditions.
Sample usage:
var firefox = require('selenium-webdriver/firefox'),
until = require('selenium-webdriver/until');
var driver = new firefox.Driver();
driver.get('http://www.google.com/ncr');
driver.wait(until.titleIs('Google Search'), 1000);
FIXED: 8000: Builder.forBrowser() now accepts an empty string since some
WebDriver
implementations ignore the value. A value must still be specified, however,
since it is a required
field in WebDriver's wire protocol.
FIXED: 7994: The stacktrace module will not modify stack traces if the
initial parse fails (e.g.
the user defined Error.prepareStackTrace)
FIXED: 5855: Added a module (until) that defines several common conditions
for use with explicit
waits. See updated examples for usage.
Builder.usingServer(url) once again returns this for
chaining.Added native support for Firefox - the Java Selenium server is no longer required.
Added support for generator functions to ControlFlow#execute and
ControlFlow#wait. For more information, see documentation on
webdriver.promise.consume. Requires harmony support (run with
node --harmony-generators in v0.11.x).
Various improvements to the Builder API. Notably, the build() function
will no longer default
to attempting to use a server at
http://localhost:4444/wd/hub if it cannot start a browser directly - you
must specify the
WebDriver server with usingServer(url). You can also set the target browser
and WebDriver server
through a pair of environment variables. See the documentation on
the Builder constructor for
more information.
For consistency with the other language bindings, added browser specific classes that can be used to start a browser without the builder.
var webdriver = require('selenium-webdriver')
chrome = require('selenium-webdriver/chrome');
// The following are equivalent.
var driver1 = new webdriver.Builder().forBrowser('chrome').build();
var driver2 = new chrome.Driver();
Promise A+ compliance: a promise may no longer resolve to itself.
For consistency with other language bindings, deprecated
UnhandledAlertError#getAlert and added #getAlertText.
getAlert will be removed in 2.45.0.
FIXED: 7641: Deprecated ErrorCode.NO_MODAL_DIALOG_OPEN and
ErrorCode.MODAL_DIALOG_OPENED in favor of the new
ErrorCode.NO_SUCH_ALERT and ErrorCode.UNEXPECTED_ALERT_OPEN, respectively.
FIXED: 7563: Mocha integration no longer disables timeouts. Default Mocha
timeouts apply (2000 ms)
and may be changed using this.timeout(ms).
FIXED: 7470: Make it easier to create WebDriver instances in custom flows for parallel execution.
net.getLoopbackAddress on Windowsdone callback in Mocha's BDD interfacePromise#thenFinally should not suppress original errorPromise#addCallback(),
Promise#addCallbacks(), Promise#addErrback(), and Promise#addBoth().this for Mocha tests.promise.all, promise.map, and promise.filterPromise#thenCatch() and Promise#thenFinally().Promise#addCallback(), Promise#addCallbacks(),
Promise#addErrback(), and Promise#addBoth().webdriver.WebDriver#getCapability.webdriver.promise.Deferred#cancel() to silently no-op
if the deferred has
already been resolved.webdriver.WebElement#getAttributejvmArgs option.Added the selenium-webdriver/testing/assert module. This module simplifies
writing assertions
against promised values (see example in module documentation).
Added the webdriver.Capabilities class.
Added native support for the ChromeDriver. When using the Builder,
requesting chrome without
specifying a remote server URL will default to the native ChromeDriver
implementation. The
ChromeDriver server
must be downloaded separately.
// Will start ChromeDriver locally.
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
// Will start ChromeDriver using the remote server.
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
usingServer('http://server:1234/wd/hub').
build();
Added support for configuring proxies through the builder. For examples, see
selenium-webdriver/test/proxy_test.
Added native support for PhantomJS.
Changed signature of SeleniumServer to SeleniumServer(jar, options).
Tests are now included in the npm published package. See README.md for
execution instructions
Removed the deprecated webdriver.Deferred#resolve and
webdriver.promise.resolved functions.
Removed the ability to connect to an existing session from the Builder. This feature is intended for use with the browser-based client.
portprober.findFreePort()selenium-webdriver/testing package, which provides a basic
framework for writing tests
using Mocha. See
selenium-webdriver/example/google_search_test.js for usage.Initial release for npm:
npm install selenium-webdriver