28 KiB
v3.0.0-beta-3
- Fixed a bug where the promise manager would silently drop callbacks after recovering from an unhandled promise rejection.
- Added the
firefox.ServiceBuilder
class, which may be used to customize the geckodriver used forfirefox.Driver
instances. - Added support for Safari 10 safaridriver. safaridriver may be disabled
via tha API,
safari.Options#useLegacyDriver
, to use the safari extension driver. - Updated the
lib/proxy
module to support configuring a SOCKS proxy. - For the
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.
API Changes
- Added
remote.DriverService.Builder
as a base class for configuring DriverService instances that run in a child-process. Thechrome.ServiceBuilder
,edge.ServiceBuilder
, andopera.ServiceBuilder
classes now all extend this base class with browser-specific options. - For each of the ServiceBuilder clases, renamed
usingPort
andwithEnvironment
tosetPort
andsetEnvironment
, respectively. - Renamed
chrome.ServiceBuilder#setUrlBasePath
to#setPath
- Changed the signature of the
firefox.Driver
from(config, flow, executor)
to(config, executor, flow)
. - Exposed the
Condition
andWebElementCondition
classes from the top-levelselenium-webdriver
module (these were previously only available fromlib/webdriver
).
Changes for W3C WebDriver Spec Compliance
v3.0.0-beta-2
API Changes
- Moved the
builder.Builder
class into the main module (selenium-webdriver
). - Removed the
builder
module. - Fix
webdriver.WebDriver#setFileDetector
when driving Chrome or Firefox on a remote machine.
v3.0.0-beta-1
- Allow users to set the agent used for HTTP connections through
builder.Builder#usingHttpAgent()
- Added new wait conditions:
until.urlIs()
,until.urlContains()
,until.urlMatches()
- Added work around for GeckoDriver bug raising a type conversion error
- Internal cleanup replacing uses of managed promises with native promises
- Removed the mandatory use of Firefox Dev Edition, when using Marionette driver
- Fixed timeouts' URL
- Properly send HTTP requests when using a WebDriver server proxy
- Properly configure proxies when using the geckodriver
http.Executor
now accepts a promised client. Thebuilder.Builder
class will now use this instead of acommand.DeferredExecutor
when creating WebDriver instances.- For Chrome and Firefox, the
builder.Builder
class will always return an instanceofchrome.Driver
andfirefox.Driver
, respectively, even when configured to use a remote server (frombuilder.Builder#usingServer(url)
,SELENIUM_REMOTE_URL
, etc).
API Changes
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.- When adding cookies, the desired expiry must be provided as a Date or in seconds since epoch. When retrieving cookies, the expiration is always returned in seconds.
- Renamed
firefox.Options#useMarionette
tofirefox.Options#useGeckoDriver
- Removed deprecated modules:
selenium-webdriver/error
(useselenium-webdriver/lib/error
,
or theerror
property exported byselenium-webdriver
)selenium-webdriver/executors
— this was not previously deprecated, but is no longer used.
- Removed deprecated types:
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
(useerror.NoSuchSessionError
)executors.DeferredExecutor
until.Condition
(usewebdriver.Condition
)until.WebElementCondition
(usewebdriver.WebElementCondition
)webdriver.UnhandledAlertError
(useerror.UnexpectedAlertOpenError
)
- Removed deprecated functions:
Deferred#cancel()
Deferred#catch()
Deferred#finally()
Deferred#isPending()
Deferred#then()
Promise#thenCatch()
Promise#thenFinally()
WebDriver#isElementPresent()
WebElement#getInnerHtml()
WebElement#getOuterHtml()
WebElement#getRawId()
WebElement#isElementPresent()
- Removed deprecated properties:
WebDriverError#code
v2.53.2
- Changed
io.exists()
to return a rejected promise if the input path is not a string - Deprecated
Promise#thenFinally()
- usePromise#finally()
. The thenFinally shim added to the promise module in v2.53.0 will be removed in v3.0 Sorry for the churn! - FIXED: capabilities serialization now properly handles undefined vs. false-like values.
- FIXED: properly handle responses from the remote end in
WebDriver.attachToSession
v2.53.1
- FIXED: for consistency with the other language bindings,
remote.FileDetector
will ignore paths that refer to a directory.
v2.53.0
Change Summary
-
Added preliminary support for Marionette, Mozilla's WebDriver implementation for Firefox. Marionette may be enabled via the API,
firefox.Options#useMarionette
, or by setting theSELENIUM_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()
andWebElement#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 oferror.NoSuchSessionError
. -
Moved the
error
module tolib/error
so all core modules are co-located. The top-levelerror
module will be removed in v3.0. -
Moved
until.Condition
anduntil.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()
andWebEleemnt#getOuterHtml()
-
Deprecated
Promise#thenCatch()
- usePromise#catch()
instead -
Deprecated
Promise#thenFinally()
- usepromise.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 theSELENIUM_PHANTOMJS_LOG
environment variable.
Changes for W3C WebDriver Spec Compliance
- Changed
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.
v2.52.0
Notice
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.
Change Summary
- Add support for Microsoft's Edge web browser
- Added
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. - Added
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. - Added
promise.Promise#catch()
for API compatibility with native Promises.promise.Promise#thenCatch()
is not yet deprecated, but it simply delegates tocatch
. - Changed some
io
operations to use native promises. - Changed
command.Executor#execute()
andHttpClient#send()
to return promises instead of using callback passing. - Replaced the
Serializable
class with an internal, Symbol-defined method. - Changed the
Capabilities
class to extend the nativeMap
type. - Changed the
Capabilities.has(key)
to only test if a capability has been set (Map semantics). To check whether the value is true, useget(key)
. - Deprecated
executors.DeferredExecutor
in favor oflib/command.DeferredExecutor
. - API documentation is no longer distributed with the npm package, but remains available at http://seleniumhq.github.io/selenium/docs/api/javascript/
- Rewrote the
error
module to export an Error subtype for each type of error defined in the W3C WebDriver spec. - Changed the
http.Request
andhttp.Response
classes to store headers in maps instead of object literals. - Updated
ws
dependency to version1.0.1
. - Removed fluent predicates "is" and "not" from the experimental
testing/assert
module. - Wait conditions that locate an element, or that wait on an element's state, will return a WebElementPromise.
- Lots of internal clean-up to break selenium-webdriver's long standing dependency on Google's Closure library.
Changes for W3C WebDriver Spec Compliance
- Updated the
By
locators that are not in the W3C spec to delegated to using CSS selectors:By.className
,By.id
,By.name
, andBy.tagName
.
v2.49-51
- Releases skipped to stay in sync with the rest of the Selenium project
v2.48.2
- Added
WebElement#takeScreenshot()
. - More adjustments to promise callback tracking.
v2.48.1
- FIXED: Adjusted how the control flow tracks promise callbacks to avoid a potential deadlock.
v2.48.0
-
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 version2.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 thewebdriver.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 toremote/SeleniumServer
. When set, the server will be accessed using the current host's loopback address.
v2.47.0
Notice
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.
Change Summary
- Add support for Node v4.0.0
- Updated
ws
dependency from0.7.1
to0.8.0
- Updated
- Bumped the minimum supported version of Node from
0.10.x
to0.12.x
. This is in accordance with the Node support policy established inv2.45.0
.
v2.46.1
- Fixed internal module loading on Windows.
- Fixed error message format on timeouts for
until.elementLocated()
anduntil.elementsLocated()
.
v2.46.0
- Exposed a new logging API via the
webdriver.logging
module. For usage, seeexample/logging.js
. - Added support for using a proxy server for WebDriver commands.
See
Builder#usingWebDriverProxy()
for more info. - Removed deprecated functions:
- Capabilities#toJSON()
- UnhandledAlertError#getAlert()
- chrome.createDriver()
- phantomjs.createDriver()
- promise.ControlFlow#annotateError()
- promise.ControlFlow#await()
- promise.ControlFlow#clearHistory()
- promise.ControlFlow#getHistory()
- Removed deprecated enum values:
ErrorCode.NO_MODAL_DIALOG_OPEN
andErrorCode.MODAL_DIALOG_OPENED
. UseErrorCode.NO_SUCH_ALERT
andErrorCode.UNEXPECTED_ALERT_OPEN
, respectively. - FIXED: The
promise.ControlFlow
will maintain state for promise chains generated in a loop. - FIXED: Correct serialize target elements used in an action sequence.
- FIXED:
promise.ControlFlow#wait()
now has consistent semantics for an omitted or 0-timeout: it will wait indefinitely. - FIXED:
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. - FIXED: Skip launching Firefox with the
-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. - FIXED: 8564:
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 therm -rf
operation on the profile directory to fail.
v2.45.1
- FIXED: 8548: Task callbacks are once again dropped if the task was cancelled due to a previously uncaught error within the frame.
- FIXED: 8496: Extended the
chrome.Options
API to cover all configuration options (e.g. mobile emulation and performance logging) documented on the ChromeDriver project site.
v2.45.0
Important Policy Change
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).
Change Summary
-
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 selenium-webdriver@2.44.0 // start // middle // end // // Output in selenium-webdriver@2.45.0 // 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
, andpromise.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 intest/upload_test.js
-
Expanded the interactions API to include touch actions. See
WebDriver.touchActions()
. -
FIXED: 8380:
firefox.Driver
will delete its temporary profile onquit
. -
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.
v2.44.0
-
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 definedError.prepareStackTrace
) -
FIXED: 5855: Added a module (
until
) that defines several common conditions for use with explicit waits. See updated examples for usage.
v2.43.5
- FIXED: 7905:
Builder.usingServer(url)
once again returnsthis
for chaining.
v2.43.2-4
- No changes; version bumps while attempting to work around an issue with publishing to npm (a version string may only be used once).
v2.43.1
- Fixed an issue with flakiness when setting up the Firefox profile that could prevent the driver from initializing properly.
v2.43.0
-
Added native support for Firefox - the Java Selenium server is no longer required.
-
Added support for generator functions to
ControlFlow#execute
andControlFlow#wait
. For more information, see documentation onwebdriver.promise.consume
. Requires harmony support (run withnode --harmony-generators
inv0.11.x
). -
Various improvements to the
Builder
API. Notably, thebuild()
function will no longer default to attempting to use a server athttp://localhost:4444/wd/hub
if it cannot start a browser directly - you must specify the WebDriver server withusingServer(url)
. You can also set the target browser and WebDriver server through a pair of environment variables. See the documentation on theBuilder
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 in2.45.0
. -
FIXED: 7641: Deprecated
ErrorCode.NO_MODAL_DIALOG_OPEN
andErrorCode.MODAL_DIALOG_OPENED
in favor of the newErrorCode.NO_SUCH_ALERT
andErrorCode.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.
v2.42.1
- FIXED: 7465: Fixed
net.getLoopbackAddress
on Windows - FIXED: 7277: Support
done
callback in Mocha's BDD interface - FIXED: 7156:
Promise#thenFinally
should not suppress original error
v2.42.0
- Removed deprecated functions
Promise#addCallback()
,Promise#addCallbacks()
,Promise#addErrback()
, andPromise#addBoth()
. - Fail with a more descriptive error if the server returns a malformed redirect
- FIXED: 7300: Connect to ChromeDriver using the loopback address since ChromeDriver 2.10.267517 binds to localhost by default.
- FIXED: 7339: Preserve wrapped test function's string representation for Mocha's BDD interface.
v2.41.0
- FIXED: 7138: export logging API from webdriver module.
- FIXED: 7105: beforeEach/it/afterEach properly bind
this
for Mocha tests.
v2.40.0
- API documentation is now included in the docs directory.
- Added utility functions for working with an array of promises:
promise.all
,promise.map
, andpromise.filter
- Introduced
Promise#thenCatch()
andPromise#thenFinally()
. - Deprecated
Promise#addCallback()
,Promise#addCallbacks()
,Promise#addErrback()
, andPromise#addBoth()
. - Removed deprecated function
webdriver.WebDriver#getCapability
. - FIXED: 6826: Added support for custom locators.
v2.39.0
- Version bump to stay in sync with the Selenium project.
v2.38.1
- FIXED: 6686: Changed
webdriver.promise.Deferred#cancel()
to silently no-op if the deferred has already been resolved.
v2.38.0
- When a promise is rejected, always annotate the stacktrace with the parent flow state so users can identify the source of an error.
- Updated tests to reflect features not working correctly in the SafariDriver (cookie management and proxy support; see issues 5051, 5212, and 5503)
- FIXED: 6284: For mouse moves, correctly omit the x/y offsets if not specified as a function argument (instead of passing (0,0)).
- FIXED: 6471: Updated documentation on
webdriver.WebElement#getAttribute
- FIXED: 6612: On Unix, use the default IANA ephemeral port range if unable to retrieve the current system's port range.
- FIXED: 6617: Avoid triggering the node debugger when initializing the stacktrace module.
- FIXED: 6627: Safely rebuild chrome.Options from a partial JSON spec.
v2.37.0
- FIXED: 6346: The remote.SeleniumServer class now accepts JVM arguments using
the
jvmArgs
option.
v2.36.0
- Release skipped to stay in sync with main Selenium project.
v2.35.2
- FIXED: 6200: Pass arguments to the Selenium server instead of to the JVM.
v2.35.1
- FIXED: 6090: Changed example scripts to use chromedriver.
v2.35.0
- Version bump to stay in sync with the Selenium project.
v2.34.1
- FIXED: 6079: The parent process should not wait for spawn driver service processes (chromedriver, phantomjs, etc.)
v2.34.0
-
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
toSeleniumServer(jar, options)
. -
Tests are now included in the npm published package. See
README.md
for execution instructions -
Removed the deprecated
webdriver.Deferred#resolve
andwebdriver.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.
v2.33.0
- Added support for WebDriver's logging API
- FIXED: 5511: Added webdriver.manage().timeouts().pageLoadTimeout(ms)
v2.32.1
- FIXED: 5541: Added missing return statement for windows in
portprober.findFreePort()
v2.32.0
- Added the
selenium-webdriver/testing
package, which provides a basic framework for writing tests using Mocha. Seeselenium-webdriver/example/google_search_test.js
for usage. - For Promises/A+ compatibility, backing out the change in 2.30.0 that ensured rejections were always Error objects. Rejection reasons are now left as is.
- Removed deprecated functions originally scheduled for removal in 2.31.0
- promise.Application.getInstance()
- promise.ControlFlow#schedule()
- promise.ControlFlow#scheduleTimeout()
- promise.ControlFlow#scheduleWait()
- Renamed some functions for consistency with Promises/A+ terminology. The
original functions have been deprecated and will be removed in 2.34.0:
- promise.resolved() -> promise.fulfilled()
- promise.Deferred#resolve() -> promise.Deferred#fulfill()
- FIXED: remote.SeleniumServer#stop now shuts down within the active control flow, allowing scripts to finish. Use #kill to shutdown immediately.
- FIXED: 5321: cookie deletion commands
v2.31.0
- Added an example script.
- Added a class for controlling the standalone Selenium server (server available separately)
- Added a portprober for finding free ports
- FIXED: WebElements now belong to the same flow as their parent driver.
v2.30.0
- Ensures promise rejections are always Error values.
- Version bump to keep in sync with the Selenium project.
v2.29.1
- Fixed a bug that could lead to an infinite loop.
- Added a README.md
v2.29.0
-
Initial release for npm:
npm install selenium-webdriver