v4.21.0
======

* Add CDP for Chrome 125 and remove 122
* [bidi]Add methods to allow all parameters for script callFunction and evaluate method (#13873)
* Setting a connection timeout for the WebSocket connections
* [grid] flatten combined routes to improve routing (#13856)
* Java language level aids (#13834)
* [grid] apply protocol version in relay session factory (#13880)
* Configure Selenium Manager environment from System Properties (#13858)
* [grid] Set test name to video file name in dynamic grid (#13907)
* [grid] Set connection timeout to session-timeout in RemoteNode (#13854)
* Type casting and numeric improvements (#13909)
* Allow filters to recover from failed requests in NetworkInterceptor (#13847)
* Allow a DevTools listener to determinate the order of handler calls (#13921)
* Read selenium manager output as UTF-8 #13653
* Reduce redundant toString() calls (#13932)
* Fixed format of expires in Cookie.toString #13927
* [bidi] Remove root ownership parameter due to update in BiDi spec

v4.20.0
======

* Add CDP for Chrome 124 and remove 121
* [bidi] Deprecate using builder for Locate Node parameters. (#13767)
* [grid] handle baseRoute like the hubRoute and the graphqlRoute (#13772)
* [grid] Fixing Dynamic Grid Docker (#13789)
* [grid] Browser containers provisioned in dynamic grid uses node-docker hostConfig
* Making Selenium Manager a thin wrapper (#13385)
  * This change has been made to make it easier to maintain and improve, the interface has
  changed and if users were invoking it, they might experience issues. Selenium Manager is
  still in beta and these type of changes are expected.
* [grid] Dynamic Grid re-fetch browser images if they were pruned during runtime (#13821)
* [grid] Relay service can set protocol version in fetching status (#13849)
* [cdp] Continue requests without modification for know errors in NetworkInterceptor (#13836)
* [bidi] Update browsing context create method (#13766)

v4.19.1
======
* [bidi] Fix the bazel file after the BiDi breaking change

v4.19.0
======
* Add CDP for Chrome 123 and remove 120
* Use daemon threads in JdkHttpClient #13601
* Use a static class for ProxySelector #13622
* Improve memory allocation of an idle relay node #13643
* Close the httpclient after checking the service status #13643
* [bidi] Add storage module (#13675)
* [bidi] Add browser module (#13677)
* [bidi] Add continueRequest and continueResponse command (#13692)
* [bidi] Add provide response command (#13708)
* [bidi] Add setFiles command of the Input Module (#13711)
* Add JSON serialization for ShadowRoot (#13680)
* [grid] Ensure the original RemoteNode stays DOWN #13646 (#13647)
* Removed usage of FileBackedOutputStream in the client  (#13308)
* [grid] Remove "se:bidi" (#13528)
* [bidi] Update the capture screenshot APIs to include all parameters and remove scroll parameter (#13743)

v4.18.1
======

* Add CDP for Chrome 122 and remove 119

v4.18.0
======

* Recommitting self-signed certificate should not require certificate file
* [bidi] Add browsing context destroyed event
* Add missing support events for Web Driver Listener  (#13210)
* [bidi] Add network intercept commands
* [bidi] Add command "continuewithAuth"
* [bidi] Add failRequest command
* use the W3C state to detect errors
* [grid] Fixing driver configuration parsing (Fixes #13531)
* [cdp] Ensure dom mutation listener calls to webdriver apis are thread safe (Fixes #13500)
* Fix typo in comment (#13549)
* Allow `null` input in `FluentWait` (#13558)
* Add missing event handlers for `TargetLocator` interface (#13559)
* shutdown the process of a failed driver server start
* ensure ExternalProcess.waitFor will not block
* fixed the format of DriverService
* use message templates in logger calls
* [bidi] Add 'fetchError' event
* Fixing NPE when "se:downloadsEnabled" not set (#13583)
* Make Rectangle fields final to enhance immutability (#13586)
* Use all provided options while merging them for Firefox (#13582)
* Fix access modifier for script module classes
* use the ErrorCodec to build the WebDriverException #13580
* give the driver some time to terminate graceful

v4.17.0
======

* Self-signed certificate do not require certificate file (#13268)
* Remove deprecated event listener classes (#13200)
* Add ability to disable UI on grid (#13212)
* Recognise `chrome-headless-shell` as Chrome browser (#13292)
* Remove most of guava from remote package
* Add java to Selenium Manager input for tracking (see #13288)
* Add cookie support for network module (#13325)
* Refactored log capture and formatting code (#13322)
* Add support for Input module (Actions) (#13259)
* Close http connection for RemoteNode (#13313)
* Add Duration overload to SlowLoadableComponent constructor and deprecate the int (#13309)
* Improve logging errors (#13327)
* Ensure calling close() and quit() don't cause BiDi websocket errors (#13333)
* Check for emptiness instead of using length or size (#13335)
* Remove unnecessary overridden methods (#13336)
* improved logging when driver discovery failed
* WebSocket NoVNC session against the grid URL contains trailing slash (#13353)
* Updating channel name from Aurora to Dev
* Removing mentions to firefox-bin in docs and tests
* Deprecate FirefoxBinary class
* Deprecate json wire related ErrorCodes
* Fix the ScreenshotException message
* Add ShadowRoot.hashCode / .equals #13326
* Deprecate unused RemoteStatus
* Remove use of guava from FluentWait
* Remove all references to firefox-bin
* Deprecate all html5 offline storage implementations See #10397 (#13373)
* Remove endpoints and commands that are not w3c compliant (#13372)
* Deprecate methods for getting and setting location (#13372)
* Deprecate methods for getting and setting network connection (#13372)
* remove non-w3c endpoint references that are mobile specific
* Add auth required event
* Copy the output in a daemon thread
* No longer accept session requests with desiredCapabilities
* Remove requiredCapabilities from metadata ignored list
* Deprecate `AddWebStorage` augmenter provider as well (#13399)
* Update logging and errors for driver management
* Deprecate `ContextAware` interface (#13405)
* Add check back to driver service session factory
* Fix broken driver finder conditional
* Node WebSocket not working with sub-path option (#13407)
* Add window proxy properties class
* Schema HTTPS in Distributor, SessionQueue, SessionMap (#13413)
* Add BiDi Input module release command (#13362)
* Add Node properties class as precursor to BiDi's locateNodes command
* Deprecate `NoSuchContextException` (#13425)
* Ensure the worker thread is stopped
* Log the complete exception
* Add deprecation annotation to FirefoxBinary
* Add a warning while passing a decorated driver to augmenter (#13246)
* Tapping the Node session when there is WebSocket activity (#12223)
* Small code improvement in ProxyWebsocketsIntoGrid
* Using `max-sessions` from Node when it was declared (#12836)
* Fix typo in NodeFlags (#13440)
* Add locate nodes command (#13445)
* Add user friendly methods to locate nodes
* Add click dialog support to Federated Credential Management implementation
* Use the ErrorCodec to encode exceptions
* Ignore null text of UnhandledAlertException
* Add CDP for Chrome 121 and remove 118

v4.16.1
======

* Re-release due to broken packages

v4.16.0
======

* Allow stereotype to always allow browser version of "stable"
* [bidi] Listen to channel message
* [bidi] Add realm related events
* Move the module-info.class to the correct place
* Allow external uri to be configurable for components that support server functionality - #12491 (#12508)
* Close the streams after I/O failure #13096
* Fix events without parameters #13109
* Chrome-based browsers can do CDP-based script pinning (#13125)
* Ensure the complete output is read #13091
* Fixed reading array parameters in the CDP client
* Keep HttpClient alive until unused #12558  (#12978)
* Implement Safe Casting in getPermissions Method (#13143)
* Fix null request in case of chunked request (#13113)
* Set a name for thread started to forward output of external processes (#13142)
* Allow resuing devtools instance with JDK 11 client (#12882, #13165)
* Ensure all print options are sent as map instead of object
* Allow setting print options page ranges using list
* Fix bug replacing setDownloadThroughput for setUploadThroughput (#13187)
* Add macOS 14.0 to Platform enum
* Do not return linux Selenium Manager by default
* [bidi] Add traverse history command
* Make the json parsing exception text more helpful
* Add javadoc to support event classes (#13199)
* Packages should be opened to modules #13217
* Add more tests for java support event class (#13198)
* Add a `/quitquitquit` endpoint to the test server to make killing it easy
* Grid vnc session is not using the --sub-path argument (#12791, #13219)
* Remove retrying on timeout exception (#13224, #12975)
* Must not request further invocations for a broken websocket
* Moved org.openqa.selenium.remote.http.jdk to selenium-http (#13243)
* Add Chrome 120 and remove 117 for CDP

v4.15.0
======

* Fixed the characteristics of the collector
* Marked Client Config version field as final. (#12941)
* Removed use of guava from browser packages
* Removed use of guava from devtools (#12943)
* Do not set browser binary if it is an empty string (#12738)
* Allow setting proxy for all http client instances (#12940)
* Ensure request can be modified while intercepting (#12930)
* Add BiDi browsing contexts events related to navigation and user prompt
* Update Actions.java as removed modifier keys (#12903)
* Removed the unused netty domain socket client and dependencies
* Removed the guava reference from os, manager, bidi package
* Removed the unused sockets test base
* Removed most usages of guava from the support package
* Copy SM binary to cache folder and use it from there (#11359) (#12539)
* Prevent browser to be created and unused in case a short session-request-timeout is set (#12848)
* Add BiDi request data types from Network module
* Remove the http2-settings header in the reverse proxy
* Add BiDi network response data type, network initiator type
* Add value key to delete downloadFile response per w3c convention (#13025)
* Add BiDi BeforeRequestSent type
* Add BiDi mechanism to listen to network event - beforeRequestSent
* Fix bug in downloading files by ensuring browser vendor options in capabilities (#13024)
* Add BiDi network module events - onResponseStarted and onResponseCompleted
* Fixed processing continuation frames #12962
* Remove CDP version dependencies in the server (#12502)
* Add placeholder for BiDi script module commands and events
* Add BiDi script types, remote reference types, and local value types for script module
* Change local value method name for BiDi serialization
* Fixed the invalid session id response #12655
* Add BiDi channel value type, remote value type and evaluate result types
* Add BiDi call script command, evaluate function command, disown command, get realms command
* Open the selenium-manager to the selenium-json package for the Java Module System
* Add message to exception error for downloads error
* Add BiDi command to add and remove preload script
* Add CDP v119 and remove v116
* Implement file downloads (#12979)

v4.14.1
======
* Add print, activate and set viewport commands to Browsing Context
* Remove deprecated lift packages (#12917)
* Add validation for browsing context id (#12920)
* Fix default values for print options page size
* Use the java process builder to run external processes (#12898)
* Allow a custom timeout when shutting down a process
* Replacing Guava implementations with native Java implementations
* Allow setting version in Http Client Config (#12919)

v4.14.0
======
* Supported CDP versions: 85, 116, 117, 118
* Replace the EventAttribute(Value) with an AttributeMap (#12684)
* Add browsing context's capture box and element screenshot commands
* Enable handle user prompt tests for Firefox
* Delete SM binary only when SE_MANAGER_PATH is not set (#12840)
* Shutdown executors created for a single tasks
* Ensure closed socket connection does not prevent freeing up resources
* Remove the unused htmlunit-driver from the unit tests (#12849)
* Ensure proper error message gets logged (#12853)
* Allow setting SSL context in client config for HttpClient (#12874)
* Improve warning when CDP version not found (#12880)
* Ensure retry mechanism does not swallow an exception (#12838)
* Require Java 11 and move jdk-http-client into default package (#12843)
* Reduce log noise at FINE level (#12866)
* Refactor frame method to use isEmpty for list check and String check. (#12894)
* Use new 'getArray' method to extract driver configurations (#12716)

v4.13.0
======
* Supported CDP versions: 85, 115, 116, 117
* Deprecate setScriptTimeout(), use scriptTimeout()
* Remove deprecated method move on Point class
* Remove deprecated method GeckoDriverService usingFirefoxBinary, use setBinary
* Remove deprecated method GeckoDriverService createDefaultService with capabilities
* Remove deprecated onConsoleLog in BiDi LogInspector
* Fix NewSession Runner (#12700)
* Add 'getArray' method for array values (#12703)
* Ensure HttpClients not closed while waiting for responses
* Fix bug for overwriting driver log output stream passed in by user
* Update pinned browser versions
* Improve stability with final variables (#12733)
* Fix bug for Appium subclass that sets neither log file nor output (#12696)
* Remove deprecated headless methods from Options classes
* Remove deprecated driver service constructors and methods
* Remove deprecated log_file methods
* Allow users to set Selenium Manager path by environment variable (#12752)

v4.12.1
======
* Supported CDP versions: 85, 114, 115, 116
* Safari driver service system properties should be public
* [grid] Removing browserVersion before sending payload to driver
* Selenium Manager don't log file paths by default (#12673)
* Parse log output to support streams and file location in system properties (#12674)
* Fixing default service for drivers #12682

v4.12.0
======
* Supported CDP versions: 85, 114, 115, 116
* Update Selenium Manager to use io for executing command line
* Improve logic for deleting Selenium Manager binary on exit
* Remove deprecated BROWSER_LOGFILE
* Ensure grid maps exceptions to the correct error
* Allow deleting remote downloaded files from grid (#12501)
* Deprecate the Remote Response status field
* Remove deprecated UNEXPECTED_ALERT_BEHAVIOR capability in IE Options
* Deprecate disableNativeEvents method in IE Options
* Remove deprecated createPointerDown and createPointerUp methods
* use devtools script pinning mechanism by default (#11622)
* ensure all headers are removed or replaced
* Remove deprecated /file JWP endpoint (#12354)
* Increase maximum depth of generated JSON (see #12581)
* Do not register multiple listeners
* Improve synchronization for network event listeners
* Fix bug for null hashCode in element subclasses (#12442)
* Fix potential deadlock in processing events (#12576)
* Fix proxy breaking in RemoteWebDriver (#12607)
* Grid detects Safari and Safari Technology Preview only on macOS
* Grid avoids using Selenium Manager offline mode when it is enabled in arguments
* Batch copy input to multiple streams
* Remove browserVersion from options in Selenium Manager (#12639)

v4.11.0
======
* Supported CDP versions: 85, 113, 114, 115
* Add Missing W3C Exceptions (#12175)
* Increased the max depth of new session payload (#12205)
* Create less HttpClient instances while creating a CDP connection (#12216)
* Raise a ConnectionFailedException when openSocket failed (#12215)
* Ack the log file argument without need to combine it. Fixes #12225
* Improved the exit code and error handling (#12219)
* No need to have the auto-service dependency in the client bindings (#12244)
* Deprecate all 'lift style' code (#12263)
* Minor spelling Fix (#12258)
* Adding ignore process match for IE Mode across bindings (#12279)
* Extract original driver from decorated driver when Augmenting a driver (#12248)
* BidiException instead of DevToolsException in getBiDi (#12284)
* [grid] Switching to fine log level when clearing caches in LocalNode
* Removing deprecated methods (findElement & findElements)
* less memory allocation (#12320)
* Add move to location method to Actions (#11509)
* [grid] Add supports for list-of-table options (#12363)
* [grid] reject requests only if it has been in the queue before trying… (#12336)
* [grid] do not rely on .hashCode for .equals (#12361)
* Use Selenium Manager to locate drivers on PATH (#12352)
* [grid] Improved the new session handling when the queue is empty (#12385)
* [grid] Using SM to find drivers on PATH
* Using same variable for log output, fixes #12406
* UnreachableBrowserException logs the command parameter details only in debug mode (#11328)
* Filter related fixed in the NettyClient and the JdkHttpClient
* Removing deprecated `createServiceWithConfig` in ChromeDriverService
* Removing deprecated `webdriver.chrome.whitelistedIps` in ChromeDriverService
* Removing deprecated ChromeDriverLogLevel
* Add browser output from Selenium Manager to options (#12424)
* [grid] Make user defined SlotMatcher used everywhere in grid code (#12240)
* Add support for FedCM commands (#12096)
* [grid] Returning se:bidi when the user sends `webSocketUrl`. Fixes #12314
* [grid] Covering use case where a Node is UP after being marked DOWN. Fixes #12116
* Make external modules static (#12294)
* Use double-checked locking to initialise the Selenium Manager instance
* Making sure browser path is not null before setting the binary when value is returned from SM
* Showing SM error when the exception is thrown

v4.10.0
======
* Supported CDP versions: 85, 112, 113, 114
* Remove Selenium RC and WebDriverBackedSelenium code (#12024)
* Fixed URI in logs (#12000)
* Enhancing stereotype in Dynamic Grid (#12034)
* Support proxies in Selenium Manager (#12036)
* Close websockets when closing JDK HTTP Client (#12035)
* Change bidi loglevel warning level (#12054)
* Allow driving embedded apps without CDP (#11963)
* Fix possible freeze from incompatible HTTP responses (#12055)
* Fix bug when JSON max depth reached (#12056)
* Remove deprecated capabilities `SUPPORTS_JAVASCRIPT` and `SUPPORTS_WEB_STORAGE`
* Remove deprecated setters in `Rectangle`
* improve cleaning of upload and download directories (#12059)
* Fix redirect bug in JDK HTTP Client (#12070)
* Prevent grid from creating sessions that will time out in queue (#12014)
* Respect disabled pretty printing for arrays (#12079)
* Add support for WebView2 in Edge
* Allow setting savefile directory in Chrome when downloads are enabled (#12109)
* Add BiDi support for browing context events
* Enable BiDi functionality for Chromium browsers
* Improve "near" locator behavior (#11290)
* Do not send driver logs to console by default (#12136)
* Fix bug with GeckoDriver option for truncating log lines
* Do not log Selenium Manager details as INFO (#12145)
* Error messages link to Selenium documentation where supported
* Create NoSuchDriverException for referencing driver location problems

v4.9.1
======
* Supported CDP versions: 85, 111, 112, 113
* Typo in the "addArguments" method comment (#11945)
* Handling case where -1 is returned as statusCode (#11910)
* Adding remote-allow-origins argument only when the Java 11 http client is not used (#11949)
* Remove deprecated "version" JWP capability
* Remove deprecated "platform" JWP capability
* Remove deprecated "takesScreenshot" JWP capability
* Remove deprecated "unexpectedAlertBehaviour" JWP capability
* [grid] Displaying the real stereotype config at startup
* Add logging for starting the driver
* [grid] Do not switch and remove node in one iteration (#11961)
* Handle fragmented websocket messages (#11962)
* Add more logging to Selenium Manager (#11959)
* Make Driver Services consistent (#11973)
* Using driver path always for Safari and Safari Technology Preview (#11952)
* Overriding methods to have main platform names lowercase (#11952)

v4.9.0
======
* Supported CDP versions: 85, 110, 111, 112
* Handle redirects inside the JdkHttpClient (#11816)
* [grid] Remove Json Wire Protocol support (#11823)
* Selenium Manager use binary from Browser Options
* [grid] Allowing binary to be set via options when not set in Grid
* Log exception message (#11922)
* [grid] Fixing remote execution for Edge when Java 8 client is used

v4.8.3
======
* Supported CDP versions: 85, 109, 110, 111
* Fix bug preventing adding items to ArrayList for Selenium Manager command

v4.8.2
======
* Supported CDP versions: 85, 109, 110, 111
* [grid] Enabling `detectDrivers` original behaviour.
* Fix NPE regression in 4.8.0 (#11701)
* Implement DriverFinder completely independent of Service classes (#11491)
* [grid] Allow LocalNode to be extended for customisation (#11718)
* InvalidSelectorException extends WebDriverException (#11727)
* Deprecate CDP instance methods in FirefoxDriver
* Adding allowHosts to GeckoDriverService
* [grid] Passing language env var to child containers
* [grid] Removing unknown capability extensions for IE
* [bidi] Ensure removing listeners does not cause an error
* Process Selenium Manager output as JSON (#11663)
* [grid] Support remote downloads in Grid (#11702)
* Adding `remote-allow-origins` for Chrome
* Invoking Selenium Manager only with `--browser
* [grid] Adding `remote-allow-origins` for Chrome stereotypes
* Overloaded constructors to configure connect and read timeouts for WebDriver objects (#11532)

v4.8.1
======
* Supported CDP versions: 85, 108, 109, 110
* Merge capabilities of slot with the new session request capabilities (#11369)
* Keep track of pinned scripts per CDP session (#11598)
* Simplify Augmentation for Basic Auth (#11601)
* Print requested capabilities in SessionNotCreatedException (#11604)
* Simplify Augmentation for Dom Mutation
* Generate a Maven BOM (#11560)
* Synchronize method to get Selenium Manager binary (fix #11620) (#11640)
* Updating Selenium Manager binaries for 4.8.1 release
* File downloads url - Adhere to w3c standards (#11646)

v4.8.0
======
* Supported CDP versions: 85, 107, 108, 109
* Implement Edge and Chrome Driver Services using log level with ChromiumDriverLogLevel enum
* Deprecate Edge Driver Service using log level with String
* Deprecate Chrome Driver Service using log level with ChromeDriverLogLevel enum
* Deprecate setting Chrome Driver Service logging values in Chrome Options
* Close BiDi session on closing the last top-level browsing context
* Add withAllowedListIps() to ChromeDriverService
* Add comment with name of large JS executions (#11038)
* Allow Pointer and Wheel methods to accept Point object (#11477)
* Fix bug where options are not properly merged into capabilities (#11396)
* JDKHttpClient: Fix null pointer bug when responseBody is null (#11450)
* CDP: Ensure child session is created under browser session (#11475)
* Deprecate setHeadless for Chrome and Firefox Options (#11467)
* Grid: Remove translations of non-w3c locators (#11470)
* JDKHttpClient: Handle RQST with no Body [POST/PUT] (#11445)
* Fix bug with decorated webdriver not calling the listeners  (#11438)
* BiDi: Add filter parameter to LogInspector methods
* BiDi: Rename 'onConsoleLog' to 'onConsoleEntry'
* CDP: Fix bug with console events returning modified args (#11435)
* Grid: Accommodate ability to specify sub-paths (#11271)
* Grid: fix bug with pulling image using zero content-length (#11342)

v4.7.2
======
* Grid: Support file downloads on the node (#11277)
* Change chromium service names from whitelisted to allowed (#11409)
* Avoid closing CDP connection in browser implementation since that logic now sits in RemoteWebDriver (Fixes #11401)
* Fix bug where failing Selenium Manager method results in wrong error
* Allow changing chromium driver log timestamp formatting
* Allow ignoring chromedriver build checks using service builders
* Add support for appendLog to msedgedriver service
* Fix msedgedriver log level logic
* Allow setting chromedriver log level from system properties
* Fix chromedriver log level logic
* Remove deprecated Firefox capabilities
* Removing a few bits more of the magic that moves JWP to W3C
* Removing deprecated SUPPORTS_ALERTS and SUPPORTS_SQL_DATABASE caps
* Removing deprecated OVERLAPPING_CHECK_DISABLED cap
* Removing deprecated LOGGING_PREFS cap
* Removing deprecated HAS_TOUCHSCREEN cap
* Removing deprecated HAS_NATIVE_EVENTS cap
* Removing deprecated ENABLE_PROFILING_CAPABILITY cap
* Removing deprecated ACCEPT_SSL_CERTS cap

v4.7.1
======
* Supported CDP versions: 85, 106, 107, 108
* Add close method to JDK 11 client. Ensure close methods for Http client is called. (#11345)
* Don’t specify content length when pulling images (#11343)
* Allow arguments to be passed in Node flag "driver-configuration" (#11367)
* Ensure all states of StartOrDie are handled (#11297)

v4.7.0
======
* Supported CDP versions: 85, 106, 107, 108
* Remove deprecated classes for Rotatable, AppCache, NetworkConnection, LocationContext
* Remove deprecated capabilities- IE_USE_PRE_PROCESS_PROXY, APPLICATION_NAME, ELEMENT_SCROLL_BEHAVIOR
* Fix bug causing sessions to hang when session stops (#11167)
* Support multiple reads of input stream (#11249)
* Fix reading connection header (#11255)
* BiDi: Implement JavascriptLogEntry
* BiDi: Support browsing context in event subscriptions
* BiDi: Fix type of JavascriptLogEntry
* Grid: improved exception handling when no cause is set (#11286)
* Fix following contract of Closeable (#11282)
* Grid: Get TZ from parent container when not passed as cap (#11289)
* BiDi: Add LogInspector
* Grid: do not offload from multiple threads to a single worker (#11260)
* Add support for Selenium Manager to work with IE Driver
* Improve error handling with Selenium Manager (#11300)
* BiDi: Add constructor parameter for commands without a response
* Grid: remove browser filters from makeW3CSafe
* Fix bug for merging MutableCapabilities and Options

v4.6.0
======
* Supported CDP versions: 85, 105, 106, 107
* Updated IllegalArgumentException to NullPointerException for Null Values in Require Class (#11162)
* Fix page ranges issue in PrintOptions (#11172) (#11174)
* Ensure the correct output stream is used (#11175)
* Add initial support for Selenium Manager
* Revert "[java] only allow enabled select lists for Select class"
* [grid] Closing input pipeline when 404 is returned
* JDK Http client - avoid chunking without buffering to memory (#11198)
* Avoiding pulling same netty dependencies for AsyncHttpClient
* [grid] Only check for IEDriver on Windows.


v4.5.3
======
* Supported CDP versions: 85, 104, 105, 106
* Removing check "::1" in PortProber (Fixes #11159)

v4.5.2
======
* Supported CDP versions: 85, 104, 105, 106
* Add support for basic auth in JDK client (Related to #11068)
* [grid] Adjusting PortProber for Docker execution

v4.5.1
======
* Supported CDP versions: 85, 104, 105, 106
* Avoid throwing errors once NetworkInterceptor is closed (Fixes #11032)
* Avoiding hiding "internal" package so that selenium-api exports it (Fixes #11069)
* Close the CDP connection on quit for FF (#11109)
* Removed the broken escape (#11110)
* Use the correct base64 decoder (#11107)
* Reduce noisy logs from CDP version finder and made dialect related log debug level (Related to #11088)
* Respect the last flag for binary data (#11108)
* Check that a port truly is free before using it (#11085)
* Make public constant storing capability name for IE options (#11114)
* [grid] Add BiDi endpoint to returned caps if available, adding `se:bidi`
* Ignoring additional headers in the JDK 11 implementation
* Pick random port outside of well-known ranges of ephemeral ports (#10990)
* [grid] Consume in batches from the new session queue (#10987)
* [grid] Deprecate max-threads flag. Add an alternate flag in the Distributor for new session thread
  pool size. (#10995)
* [grid] Restoring behavior for session creation interval.
* [grid] Add batch size flag for session queue
* Make sure `EventFiringWebElement` implements all `WebElement` methods (#11144)
* [bidi] Make BaseLogEntry.LogLevel enum public (#11147)
* [grid] Removing default value for `max-threads` to avoid noisy warnings due to deprecation

v4.5.0
======
* Supported CDP versions: 85, 104, 105, 106
* Allow event firing decorator to accept a target class (#1694)
* Fix Javadoc for executeAsyncScript method
* [cdp] Add  support for CDP 105 and remove CDP 102
* Make httpclient ClientConfig constructor protected (#10985)
* Throw an error when trying to select a disabled select or option (#10812)
* Add "webdriver.edge.loglevel" system property (#10961)
* Remove deprecated Opera support (#10379)
* [grid] Adding handler for options when using CORS and creating a session
* Add a JDK 11 HTTP client (#10730)
* [grid] Delete a session when a session times out (#10820)
* Set high redirect default value in Netty client
* [grid] Remove unused "grid-mode" flag
* Improve default matcher to enable Appium
* Remove host info for most exceptions, except SessionNotCreatedException (#9792)
* Change message when session is not found in Grid for better exception handling
* Remove IME support
* Remove deprecated ForSeleniumServer caps
* Remove deprecated BrowserType
* Differentiate "Windows 7" and "Windows Vista" in Platform class
* Fix bug preventing websocket connections in Firefox v105 from localhost

v4.4.0
======

* Supported CDP versions: 85, 102, 103, 104
* Fix bug to ensure correct window handle used by CDP (#10811)
* Remove makeW3CSafe from NewSession in Command Payload
* Allow decorating child classes of WebDriver (#10737)
* Throwing an error when user sets `w3c:false` in `goog:chromeOptions`
* Allow a Relay Node to boot and check periodically for the status endpoint.
* Forwarding requests with non-W3C locators (useful for Relay Nodes with Appium)

v4.3.0
======

* Supported CDP versions: 85, 101, 102, 103
* Remove deprecated methods that use capabilities in WebDrivers (#10427)
* Removal of deprecated Actions commands
  Deprecated in (1/7/2017) for selenium-3.1.0 and (10/29/2018) for selenium-3.141.0
* Removing deprecated getPlatform and getVersion
* Removing a few non-W3C ways of matching browsers
* Add support for BiDi log event (#10696)
* Warning when user sets `w3c: true` in `goog:chromeOptions`
* Adding native ARM support for sockets
* Add Firefox profile preferences when retrieving from a file
* Add BiDi augmenter support (#10789)
* [cdp] Add support CDP 103 and remove CDP 100

v4.2.2
======

* Supported CDP versions: 85, 100, 101, 102
* Throwing warnings for non-W3C before creating session (#10741)
* Update ExpectedCondition to extend java util Function (#10695)
* Fixing SafariTechPreview

v4.2.1
======

* Supported CDP versions: 85, 100, 101, 102
* Improving warnings for non W3C capability checks (#10711)
* Adding LOGGING_PREFS to Edge and Chrome options

v4.2.0
======

* Supported CDP versions: 85, 100, 101, 102
* Add wheel input (#10445)
* Adding `--allow-origins` when starting GeckoDriver
* Deactivating automatic retries in the HTTPClient
* Implement separate Origin class for WheelInput (#10636)
* Deprecating IME
* Add javadocs to scroll()
* Add support to create a BiDi session
* [grid] Include JMX monitoring feature in the Grid local distributor (#10674)
* [grid] Fixing Node drain when session expires
* [grid] Add docker device mapping configuration (#10645)
* [grid] Flag to disable CDP if needed (#10661)
* [cdp] Add support Chrome 102 and remove for Chrome 99
* Improve error message for unsuccessfully submitting form
* [grid] Add deprecation notices to Grid logs and Java stdout,
  check https://www.selenium.dev/blog/2022/legacy-protocol-support/
* Deprecating non W3C caps and Augmenters using them,
  check https://www.selenium.dev/blog/2022/legacy-protocol-support/
* Logging warnings when non-W3C caps are being used,
  check https://www.selenium.dev/blog/2022/legacy-protocol-support/
* Removing HTMLRunner, this was a server extracted from the old
  Grid server which was used to run HTML test
  suites exported from the old Selenium IDE
* Fix screen rotate error (#10693)
* Make the action movement methods specify the button number
* Convert RemoteWebElement::getLocation and ::getSize from JWP Standard to W3C Standard (#10700)
* Creating browser name for SAFARI_TECH_PREVIEW

v4.1.4
======

* Supported CDP versions: 85, 99, 100, 101
* [grid] Setting session-timeout as read timeout for http client (#10404)
* Add Windows 11 support to platform enum
* Enabling request retries for session handling (#9528)
* Use class' class loader when looking up `HttpClient` factory. (#10509)
* Fixing search in Java docs (#10415)
* Added fix to intercept PUT request
* [grid] Standalone should also shutdown when it has been drained
* [grid] Draining a Node after X sessions have been created (#9845)
* Fixing options handling for print command
* Fix links in JavaDocs (#10529)
* Introduce common interface for all web storage types (#10528)
* Added PATCH request
* Honoring proxy in ClientConfig (#10531)
* Return friendly names for Windows platforms like Mac does
* Support for sending firefox addon directory as temporary in remote sessions
* [grid] Closing input pipeline when client disconnects

v4.1.3
======

* Supported CDP versions: 85, 97, 98, 99
* [grid] Using DefaultSlotMatcher in DockerSessionFactory
* Removing XpiDriverService and XpiDriverInfo
* Implement event support for pointer device actions (#10198)
* Removing STP from SafariDriverService
* Fix modifier keys scope on Java Actions (#10333)
* Guarding runnables when scheduleAtFixedRate is used
* Acknowledging proxy config set in ClientConfig
* Make driver.close() tolerant to CDP failures (#10346)
* Fix issue "Incompatible types for '-' operation" in the Javascript executor example
* [grid] Refactoring rejectEvent and guarding UUID parsing
* [grid] Querying Node status only once at registration
* Add deprecated warnings to OperaDriver and OperaOptions
* Remove references to invalid errors (#10209)
* Removing deprecated methods from WebDriverWait, HttpMessage, CommandLine and DesiredCapabilities
* Avoid using ServiceLoader while creating FirefoxDriver instance
* [grid] Matching webview2 browser name with EdgeDriverService
* [grid] Pinging relay service to update health-check
* [grid] Adding a configuration flag to set a noVNC port.
* switch ByClassName locator from to "class name" (#10355)
* Ensure DevTools is augmented when using DriverService
* Fixed reading the data from the stream and fixed the size of chunks (#10409)
* [grid] Do not match empty capabilities
* [grid] Node capacity is given by available slots and usage below maxSessions.
* [grid] Grid is ready when Nodes are up and have availability.
* [grid] Improving /readyz return http code.
* Retry filter not used by default
* Add exponential backoff policy to the Retry request filter
* [grid] Preventing XSS attack.



v4.1.2
======

* Supported CDP versions: 85, 95, 96, 97
* Add new desktop cast command for Chromium
* BugFix: Update toJson() method creation for integer type in CdpClientGenerator
* Fix Javadocs FluentWait's sample usage wrt durations
* [grid] Throw ServerBindException when server cannot start due to network issues
* Add support for CDP Chrome 97
* Throw error when using custom client config with local driver
* Adding a builder() to all drivers to generate the correct default options instance
* Use class' class loader when looking up `HttpClient` factory
* Remove max duration value to allow retries during network connection failures
* allow setting a different keyboard or pointer for actions on input devices
* [grid] Guarding how the server reads parameters to keep it stable
* Remove connection timeout setter, a static 10s value is used
* [grid] Getting session requests from the queue faster
* [grid] Reworking how new session requests are processed, querying queue only
  when Grid has availability
* [grid] Fix added missing quotation marks in examples (cli help)
* Replace deprecated OpenTelemetrySdk creation API
* [grid] Improving Node health check execution
* [grid] Adding back support for unix domain sockets
* Allow disabling tracing in RemoteWebDriver
* Replace dynamic proxy with ByteBuddy for WebDriverDecorator
* Log Timestamp flag added

v4.1.1
======

* Supported CDP versions: 85, 94, 95, 96
* Allow custom tracing to integrate with existing OpenTelemetry tracing
* Avoiding NoClassDefFoundError by waiting for completion of already started tasks
* use addon parameter with base64 encoding instead of path parameter
  that requires using file detector and upload
* support installing temporary addon in Firefox
* Remove references to opera_blink in favour of opera
* BugFix: Handle null parameters in TracedCommandExecutor
* BugFix: Following redirects by default in HttpClient
* BugFix: Forwarding CDP/BiDi connections to the container in Dynamic Grid
* BugFix: Do not log screenshots payload in debug mode
* BugFix: Mapping Slot fields properly for json payloads
* BugFix: Configuring relay service via CLI
* BugFix: Adding a "bind-host" flag to start Grid properly when the
  server cannot bind to the host, fixes this for environments like Docker

v4.1.0
======

* Supported CDP versions: 85, 94, 95, 96
* Removed USE_CHROMIUM from EdgeOptions as new Edge is the default
* [grid] Fixed command completion for ZSH when using the Selenium Server
* Pass WebDriver instead of Loggable to allow augmentation of HasLogEvents
* [grid] Using a random port when "-1" is set as port number for the Selenium Server
* Handle Json parsing error such that future messages are not blocked
* [grid] Fix host option
* Changing type of extraInfo from HashMap to ConcurrentHasMap to avoid
  ConcurrentModificationException while reading exception message by parallel threads
* Add retry http request filter for transient errors.
* Fix Javadoc code block formatting
* [grid] Using non-loopback address when default config is used
* Fix classloading error in host identifier
* Split OpenTelemetry command in order to facilitate search by tags

v4.0.0
======

* Supported CDP versions: 85, 93, 94, 95
* Improved "relay" service description in help
* Switch to different JCIP annotations for Apache 2 license
* Deprecated USE_CHROMIUM so we can remove it after 4.0
* Add a --hub flag for the Node

v4.0.0-rc-3
===========

* Supported CDP versions: 85, 93, 94, 95
* Updated java dependencies
* Fixed bug in zsh completions
* Use the IANA port range for selecting random ports if there are
  fewer than 5k ports to choose from

v4.0.0-rc-2
===========

* Supported CDP versions: 85, 93, 94
* Moved NetworkInterceptor to org.openqa.selenium.devtools
* NetworkInterceptor now takes a Filter to allow responses to be
  captured and rewritten.
* Added a "relay" option to better support forwarding sessions to
  something like the Appium server.
* Fixed CDP connection locking when called re-entrantly.
* Remove sessions from Redis backed session map on restart
* Accept "webSocketUrl" as a valid w3c capability name, as it's
  declared in WebDriver Bidi
* Add strongly-typed methods for setting timeouts and other w3c
  capabilities on the base options class.
* Enable live view for Dynamic Grid
* Merged devtools maven artifact into the main remote driver
* Added android capabilities to Chromium and Firefox options.

v4.0.0-rc-1
===========

* Supported CDP versions: 85, 92, 93.
* Only the name and stereotype are mandatory in nodeConfig.
* No longer sets unexpected alert value in Options by default.
* Update IE options class in each language to match the currently
  supported capabilities in the IE Driver.
* Delete existing sessions if the Node is restarted.
* Sessions are now stopped when the Node is gracefully shutdown.
* Fixes file upload for Dynamic Grid
* Add docker max sessions flag. (#9688)
* Close DriverService and DriverCommandExecutor executor on
  quit. (#9666)
* Handle empty inputs for JSON more gracefully.
* Ensure that default healthcheck duration is less than
  the default node timeout duration.
* Better resource utilisation in the Distributor when starting
  sessions.
* Implement ShadowDOM APIs in the Java bindings
* Routing VNC websockets through the Grid

v4.0.0-beta-4
=============

* Rework how the `Distributor` creates sessions to be more
  spec-compliant.
* Rework internal structure of the New Session Queue.
* `DriverCommandExecutor` uses its own `ExecutorService` (#9430)
* Add proxy support to NettyClient (#9434)
* Handle bad gateway response from the server when starting a new
  session (#9444)
* Expose session request metadata from the new session payload
* Implement getDomAttribute method in EventFiringWebDriver (#9394)

v4.0.0-beta-3
=============

* Allow RelativeBy to start with any locator, not just tag name
  (#9273)
* Selenium-created sessions supporting CDP have a `se:cdp` capability,
  pointing to the websocket address for CDP communication, and a
  `se:cdpVersion` which indicates the version of the CDP to use.
* Correctly indicate the Firefox supports CDP v85
* Add support for CDP v90 and v91 and remove support for CDP v86 and
  v87.
* Improving exception when server returns 504 (#9354)
* The node server rewrites cdp endpoints and versions into standard
  `se:cdp*` ones.
* Allowing users to override recommended max sessions in Grid.
* Better platform matching in Grid.
* Use heartbeat to register the Node with the Distributor (#9321)
* Add logging of http exchange contents in debug mode.
* Fix getScreenshotAs: avoid unnecessary conversions (#9308)
* Docker fixes around starting containers with the correct network
  name.
* Wait until Nodes are available before indicating that Grid is ready.
* Purge timed out requests sitting the queue at regular intervals
  (#9283)
* Add null check before returning isDisplayed value (#9299)
* Added "/wd/hub" route to RouterServer for better backwards compat.

v4.0.0-beta-2
=============

* Use `opera` for Blink-based Opera versions
* Updated OpenTelemetry to 1.0.0
* Use standard OpenTelemetry mechanisms for configuring tracing.
* Make better use of `getDomAttribute` in `Select`
* [cdp] Added support for Firefox Nightly
* [cdp] Use `se:cdp` to report CDP endpoint
* [grid] Close resources leaks caused by http client not being
  properly closed.
* [grid] Nodes will auto-detect their platform
* [grid] Make health check interval a configurable option for
  Distributor role (#9272)
* [grid] Correctly propagate startup errors to the client
* [grid] Make session timeout configurable option for Node role

v4.0.0-beta-1
=============

* All `*Options` classes now serialise with w3c-safe keys. This means
  that support for legacy options (eg. `firefox_binary` rather than
  using the setting in `moz:firefoxOptions`) will need to be set
  directly via a call to `setCapability`.
* FirefoxDriver requires geckodriver 0.29.0 or later
* Reworked `RemoteWebDriver.builder` to allow it to work as a primary
  mechanism for creating a new `WebDriver` instance
* DevTools support for Firefox added
* Support multiple CDP versions simultaneously (currently v86-89)
* New commands to Get Timeouts, Print to PDF, Get DOM Attribute, Get
  DOM Property
* Relative locators now return elements by proximity to last search
  term.
* Refreshed Grid UI
* Legacy XPI driver marked as deprecated
* Removed reactor-netty httpclient
* Reworked how custom element locators work. They will try to be
  remoted directly, before using a local implementation if remoting
  fails.
* Allow `CustomLocator` instances to be bound to the server
  automatically.
* Ensured locators are converted to CSS locator consistently.
* Ensure `Capabilities.merge` returns a new `Capabilities` instance
  rather than modifying the existing one.
* Add `--allow-cors` flag to enable CORS support in the server
* Better declare services in our Java Module information
* Removed obsolete browsers from BrowserType
* Implemented the ability to get raw original message without
  additional info from WebDriverException
* Allow max-sessions to be configured per driver on the command line
* Substantially improved javadocs for `WebDriverDecorator`
* Distributor now uses a proper session queue
* `FluentWait` performs waiting on the main thread to ensure
  exceptions are thrown as expected.
* Changing default timeouts for HTTP clients: connect timeout is 10s,
  read timeout is 3 min
* Moving to using immutable data structures where possible. `Point`
  and `Rectangle` now have deprecated setters.
* Added methods to get container logs from the Grid
* Docker now mounts /dev/shm to browser containers.
* Docker instances can now save videos of test runs
* Docker containers now created with `autoRemoval` set to `true`

v4.0.0-alpha-7
==============

* Started to add new Grid UI.
* Add support for BASIC and DIGEST authentication.
* Add listener for DOM mutations.
* Add support for listening out for console log events.
* Experimental support for script pinning.
* Support multiple versions of CDP simultaneously.
* Fix getText atom for unicode character middle of word (#8736)
* Include original stack trace when throwing TimeoutException.
* Removed okhttp implementation of the http client.
* Add experimental "reactor" http client.
* [graphql] Add graphql query to retrieve session information for a
  given session id.
* [grid] Support remoting CDP over the Grid.
* [grid] Record video only when `recordVideo` is sent in `se:options`.
* [grid] Securing 0mq when user provides a certificate.
* [grid] All messages on the 0mq event bus now have a secret.
* [grid] Provide a command line flag for creating SessionFactory
  instances: `--driver-factory`.
* Added a JDBC-backed implementation of the SessionMap.
* [grid] Added a "New Session Queue" component.
* [grid] Added support for draining a Node. Once all sessions are
  complete, the node will shutdown.
* [grid] Added a "One Shot Node" which starts draining once a session.
  is started. This is designed for use in environments which will
  restart nodes as required.
* [grid] Add a `/readyz` endpoint that conforms to k8s expectations
  for an HTTP readiness probe.

v4.0.0-alpha-6
==============

* Ability to proxy CDP commands from the local end through the
  fully-distributed Grid. The end point to connect to is reported via
  "se:options -> cdp"
* Amended Augmenter to mixin `HasDevTools` if needed.
* Very, very basic support for GraphQL
* Ability to configure node on the command line by specifying
  well-known browser names (eg. "-I firefox")
* Ability to set maximum number of concurrent sessions on a node.
* New reactor-based http client implementation. Set the
  `webdriver.http.factory` system property to `reactor` try it out.
* Bumped OpenTelemetry version to 0.4.0
* Selenium Standalone and Hub now also accept requests to `/wd/hub`
* Implementing file uploading for distributed grid (and deleting
  uploaded files when session is closed)
* Fix potential NPE on DeviceRotation. Fixes #8183
* Corrected the documentation for Protected Mode (#8163)
* Fix comments on Java Actions.moveToElement (#6974)
* Grid can be configured using TOML files.
* Fixing sendKeys to handle newline characters properly. Fixes #7886
* Added a `completion` command to generate a zsh autocompletion
  file. This should be saved as `_selenium` on the `fpath`
* New `config` section in the `info` command.

v4.0.0-alpha-5
==============

* Implement "minimize window"
* Add `SameSite` attribute to `Cookie`
* Improve Docker support to use unix domain sockets and the
  DOCKER_HOST env variable.
* Minimum supported Docker protocol is v1.40. This matches the release
  on all platforms at 2020-03-13
* Stop driver server when session is over. Fixes #7989
* Reuse the same HTTP client instead of creating a client per
  session. Fixes #7989
* Sending auth headers to the grid if username and password are
  specified in the base URL. Fixes #8005
* Replace OpenTracing with OpenTelemetry
* Enabling IPv6 in the Grid, fixes #7541
* Add response to RemoteWebDriver's client log level (#7925)
* Add a command to run the message bus as a standalone component
* Make "info help" less misleading

v4.0.0-alpha-4
==============

* Added an "information" command to provide users with better
  information about how to use features in Selenium.
* Rename "friendly" locators to "relative"
* Chrome Debugging Protocol commands now mirror latest CDP spec.
* Strengthen java deps now rules_jvm_external has been updated.
* Update EdgeOptions constructor to use new ms:edgeOptions capability
  name (#7633)
* Add support for creating and removing virtual authenticators (#7760)
* Add support to debug virtual authenticators (#7842)
* Improving error message if a remote side responses with code 405
  Method Not Allowed.
* Better traces via OpenTracing.
* Added Netty-based HTTP client (-Dwebdriver.http.factory=netty)
* Selenium server now uses Netty
* [grid] https between components (#7767)
* [grid] Added file upload endpoint to the new grid
* [grid] Adding ability to discover and start Edge (both
  chromium-based and legacy)
* [grid] Only allow CORS when using a —allow-cors flag
* [docker] Re-enable existing docker functionality for Grid Nodes
* Checking for changes in frozen preferences in XPI-based
  FirefoxDriver only

v4.0.0-alpha-3
==============

* Add "relative" locators. The entry point is through the `RelativeLocator`.
  Usage is like `driver.findElements(withTagName("p").above(lowest));`
* Add chromedriver cast APIs to remote server (#7282)
* `By` is now serializable over JSON.
* Add ApplicationCache, Fetch, Network, Performance, Profiler,
  ResourceTiming, Security and Target CDP domains.
* Fixing Safari initialization code to be able to use Safari Technology
  Preview.
* Ensure that the protocol converter handles the new session responses
  properly.
* Expose devtools APIs from chromium derived drivers.
* Expose presence of devtools support on a role-based interface
* Move to new Grid, deleting the old standalone server and grid implementation.
* Switch to using `HttpHandler` where possible. This will impact projects that
  are extending Selenium Grid.
* Respect "webdriver.firefox.logfile" system property in legacy Firefox driver.
  Fixes #6649
* Back out OpenCensus support: OpenTracing and OpenCensus are merging, so
  settle on one for now.
* Only allow CORS when using a —allow-cors flag in the Grid server
* If you're using the Java Platform Module System, all modules
  associated with the project are generated as "open" modules. This
  will change in a future release.
* The version of Jetty being used is unshadowed.

v4.0.0.0-alpha-2
================

* Add Chromium-based Edge support. This involves adding a new Chromium driver to
  the tree too.
* Extra domains added for CDP: Network, Performance, Security, Target
* Firefox: enable full page screenshots
* Better support for Java 9+ modules
* Start reworking HTTP abstractions. These should better support streaming, and
  so will not require us to hold all requests in memory.

v4.0.0.0-alpha-1
================

* Many deprecated methods and classes deleted.
* Alpha version of new Grid Server, supports "standalone", "hub",
  "node", and completely distributed usage.
* Basic support for using Docker containers with the new Grid Server.
* Basic support for CDP landed via the "DevTools" interface.
* Basic support for OpenTracing landed. Use the "--ext" flag to the
  new Grid Server to provide the classpath to an OpenTracing
  implementation.
* Added support for WebSockets to the HttpClient
* Location of safari driver now configurable using
  "webdriver.safari.driver" system property.
* #6649: Legacy firefox driver respects "webdriver.firefox.logfile"
   system property.
* Added command to open a new window.
* Element screenshotting now possible
* Selenium Server now no longer includes HtmlUnit by default
* New Grid can output logs in single-line json format to stdout
* #6617 Implement equals() and hashCode() in `Select` element wrapper

v3.141.59
=========

* Restored remoteHost support
* [Grid] Adding a test to check that remoteHost is properly read and
  set.
* Fix mime-types of displayed content in help servlet.
* Encourage people to access help over https.
* Implement `WrapsElement` by `Select` element wrapper (#6616)
* Version number is an even better approximation of π.

v3.141.5
========

* Default the number of threads assigned to the server to 200,
  which is what it was in 3.13.0

v3.141.0
========

* Removed HtmlUnit driver and all its dependencies (including HtmlUnit and
  Apache HttpClient) from selenium-server-standalone. This drastically
  reduced the size of selenium server distribution package.
* Hub status should only count reachable proxies. Fixes #6494.
* Deprecated the original Actions API in favour of the W3C approach.
* Correct localisation of platform name (#6491)
* Beta commands in SafariDriver for opening a new window or tab.
* Clean up of internal of `Select` element wrapper (#6501)
* Acknowledge that Mojave is a `Platform` (#6552)
* Deleted many command-line options marked as deprecated some time
  ago.
* Removed Selenium's own deprecated `Duration` and `Clock` classes in
  favour of those provided by the JRE.
* Fixed WebDriverBackedSelenium servlet by registering a session
  finalization listener.
* Installing Firefox extensions in the same form as they provided,
  either as a file or as a directory. With the release of Firefox 62
  Mozilla discontinued support for unpacked sideloaded extensions in
  Release channel. Users must themselves choose proper format to use
  in their tests depending on the browser version they run tests in.
* Prepended command names in https error response reports (#6321)
* Removed the apache-backed httpclient.
* Fixing regression in Grid: if -hubPort was specified through CLI
  params but not -hubHost, the node tried to register to
  http://null:hubPort.
* Fixing regression in Grid by using browserTimeout again to set
  timeouts in the HttpClient.
* Grid: adding image for Safari Technology Preview, fixes #6297
* Grid: Nodes and Hubs can now be started in any order, and
  configuration will be correct Fixes #3064.
* Added a basic ServiceBuilder for Internet Explorer (#6181)
* Version number is a better approximation of π.

v3.14.0
=======

* Move or deprecate internal classes in java client
* Introduce basic JPMS support. This is experimental.
* The browser name of the Safari Tech Preview is not "safari" but
  "Safari Technology Preview". Who knew?
* Deprecated our own `Clock` interface for `java.time.Clock`
* Completely removed the GSON dependency. We now use reflection to try
  and find the class.
* Tiny clean up to try and make Grid a little more performant.
* Added new capabilities for safari driver: automaticInspection and
  automaticProfiling (#6095) This commit is from the "Fix a Bug,
  Become a Committer" workshop held at SeConf India.
* Removed support for geckodriver 0.13. It is time.
* Adding High Sierra to the platform set. Fixes #5969
* Enriching Hub Status to include Node info (#6127)
* Fixing potential Zip Slip Vulnerability, see
  https://snyk.io/research/zip-slip-vulnerability
* Allow temporary installation of FF extension (#1) (#5751)
* Fix windowSize option in Firefox in Javascript (#6075)
* Make ConnectionType serialize as integer (#6176)
* Pass found elements to the EventListener's afterFind method (#6191)
* Add native events under se:ieOptions. (#6183)

v3.13.0
=======

* Introduced our own JSON parser and outputter, allowing GSON to be
  removed from our dependencies.
* Exposing a `RemoteWebDriverBuilder` which can be used to construct
  instances of selenium when talking to servers that speak the w3c
  protocol.
* Fixed loading of Grid hub and node config files.
* Fixed `noProxy` handling in Grid.
* Added bindings for custom ChromeDriver commands
  (GET_NETWORK_CONDITIONS, SET_NETWORK_CONDITIONS and
  DELETE_NETWORK_CONDITIONS) that allows client code to utilize
  built-in throttling functionality. (#3479)
* Minimised data being encoded as JSON when serialising Java objects.
* EventFiringWebDriver now fires events before and after `getText` and
  implements `HasCapabilities`.

v3.12.0
=======

* Added `User-Agent` header to requests from Selenium to give remote
  ends more visibility into distribution of clients.
* Remove GSON from how we coerce JSON to Java types.
* Clean up the internals of Selenium's JSON handling, including
  deprecating places where GSON leaks from our APIs.
* Grid assignes node to a random free port if not specified.
  explicitly. Fixes #5783.
* Addressed concerns about backward compatibility of Grid's `-host`
  parameter.
* Implemented WebStorage in ChromeDriver and FirefoxDriver.
* Documentation clean up in `By`.
* `before/afterGetScreenshotAs` added to to WebDriverEventListener.

v3.11.0
=======

* Implemented `equals` and `hashCode` for `LoggingPreferences`
* Deleted deprecated methods from `*Options` and `MutableCapabilities`
* Converting an object to JSON now doesn't include the object's hash
  code.
* Removed deprecated methods from `RemoteWebDriver`.
* Switching Grid to use OkHttp rather than the Apache HttpClient.
* Internal change to better use Selenium's abstractions for handing
  JSON in Grid.
* Removed deprecated `GridRegistry.getHttpClientFactory` method.
* Removed `Registry.getConfiguration`

v3.10.0
=======

* Deprecate internal Duration in favor of java.time.Duration
* Fix handling of IE capabilities in Grid Nodes. Fixes #5502
* Fix problem where Grid wasn't starting Safari sessions
* Migrate Selenium Grid to reduce exporting GSON and Apache HttpClient
  as much to public APIs.
* Migrate Grid to use Selenium's own abstractions where possible. This
  means that more of it is using OkHttp rather than the Apache
  HttpClient.
* Fix an issue where RemoteProxy instances were causing an exception
  to be thrown if they weren't marked as a ManagedService.
* Deleting ability to run html suites with selenium-server-standalone,
  users are adviced to use htmlrunner

v3.9.1
======

* OkHttp backed instances can now connect to servers requiring
  authorisation. Based on PR #5444 proposed by @valfirst.

v3.9.0
======

* Switched to OkHttp for all HTTP communication. The version used can
  be changed back to the Apache HttpClient by setting the
  `webdriver.http.factory` system property to `apache`.
* Removed passthrough mode for the server.
* Grid: (implementation note) Start migrating servlets used to be
  command handlers.
* Upgraded every dependency to latest versions.
* Added varargs methods to `ExpectedConditions` in order to avoid
  annoying `Arrays.asList`.
* Better logging when new session creation errors.

v3.8.1
======

* Fixed Chrome mutator injecting null binary path into new session payload.
* Added mutator that stips grid-specific capabilities hurting IE driver.
* Fixed SafariOptions construction from plain Capabilities object.

v3.8.0
======

* Dropped support for PhantomJS, it's recommended to use headless Firefox or
  Chrome instead.
* Node skips configurations that does not match current platform, no more IE
  slots on Linux-based nodes.
* Introduced unique ids for node slot configurations. Hub injects UID of the
  matched configuration to the new request payload. Node mutates capabilities
  with matching config UUID only. This allows to have multiple configurations
  for the same browser in node config file.
* Implemented matching of some browser-specific capabilities on Grid hub,
  namely "marionette" for Firefox (default is true) and "technologyPreview"
  for Safari (default is false).
* "technologyPreview" capability is now honored again by SafariDriver.
* Added initial support for managing Grid Hubs and Nodes via JMX
* Removed `Alert.authenticate` and supporting classes
* Better handling of configuring SafariDriver via capabilities.

v3.7.1
======

* Including httpcore in the packaged libs.
* Sending geckodriver logs to stderr by default. The default log level
  is low enough that the log does not look polluted. Geckodriver does
  not allow to separate its own log from the browser logs, so messages
  from the browser log can appear in the log even on the lowest level.
* Avoid sending the shutdown command to driver services that don't
  support it.
* Add support for customizing the Grid Registry.

v3.7.0
======

* Firefox and Chrome binary paths specified in Grid Node configs are
  now honoured.
* W3C spec compliant drivers need not return RGBA values for colours
  defined in CSS.
* Minimise disk usage when starting new remote sessions.
* SafariDriver and legacy FirefoxDriver can now be configured when
  using the remote server through Capabilities. Notably, this allows
  the Safari Technology Preview to be used if it's installed.
* Implemented the ability to configure the firefox log target using
  the driver service builder or a system property. Logs are sent to
  the null output stream by default. Fixes #4136
* Simulate some w3c Actions commands using the old APIs. This allows a
  local end that only speaks the JSON Wire Protocol to use
  "Actions.moveTo" when communicating with a W3C compliant remote
  end. Apparently, people need this.
* More fluent APIs in `*Options` classes.
* Moving some safari config options from `SafariOptions` to the
  `SafariDriverService`.
* In Grid and Remote, force the use of the legacy Firefox driver when
  marionette flag is set.
* The protocol handshake now uses a `CapabilityTransform` to convert
  an JSON Wire Protocol capability to one or more w3c
  capabilities. These are located using the standard Java
  ServiceLoader framework.
* The protocol handshake also uses a `CapabilitiesFilter` that
  extracts keys and values specific to a browser from a JSON Wire
  Protocol capabilities map. Again, these are loaded using the
  `ServiceLoader` framework.
* `requiredCapabilities` are now no longer sent across the wire.
* Fixed handling of unrecognized platform names returned by remote
  end. #4781
* Better error messages from the htmlrunner.
* Migrated from using `DesiredCapabilities` to either
  `MutableCapabilities` or (preferably) `ImmutableCapabilities`.
* Move building of locators to How enum


v3.6.0
======

* Remove direct dependency on HTMLUnit and PhantomJS from Maven
  artifacts.
* All `*Option` classes now extend `MutableCapabilities`
  `new RemoteWebDriver(new ChromeOptions());`
* Deprecating constructors that don't take strongly-typed `*Options`.
* Improved exceptions when a `Wait` times out when using a
  `WrappedWebDriver`.
* Added `Interactive` interface to EventFiringWebDriver. Fixes #4589
* Add options to start Firefox and Chrome in headless modes.


v3.5.3
======

Important note:

* The new standalone server and Grid Node feature a "pass through"
  mode. If you see changes to the Selenium WebDriver "logging" APIs or
  automatic capture of screenshots on error (or if you want the old
  behaviour back) you can do so by executing:

  `java -jar selenium-server-standalone-3.5.3.jar -enablePassThrough false`

* Allow user-provided DriverProviders to override default providers in
  passthrough mode.
* Fixes issue with W3C Actions not being properly filled when multiple
  input sources are used.
* Platform that represent platform families ("WINDOWS", "UNIX", "MAC",
  and "IOS") return `null` from `Platform.getFamily`.
* Handle null return values from chromedriver. Fixes #4555
* Synchronized "platform" and "platformName" capability values. Fixes #4565
* Add iOS `Platform`.
* Fix wrapping of maps with null values. Fixes #3380
* Grid: Add new w3c compatible `status` endpoints for Hub and nodes.
* Grid: Properly parse responses from upstream nodes that are not
  200. Fixes issue where `NoSuchElementException` was mistaken for a
  `NoSuchSessionException`.
* Grid: Handle re-encoding issue when transferring text from the
  endpoint node to the local end.


v3.5.2
======

Important note:

* The new standalone server and Grid Node feature a "pass through"
  mode. If you see changes to the Selenium WebDriver "logging" APIs or
  automatic capture of screenshots on error (or if you want the old
  behaviour back) you can do so by executing:

  `java -jar selenium-server-standalone-3.5.2.jar -enablePassThrough false`

* Avoid encoding numbers as floats rather then longs in JSON payloads.
* New "pass through" mode supports file uploads again.
* Added support for querying running sessions via the
  "/wd/hub/sessions" endpoint
* Fix a NullPointerException when deserializing exceptions from a
  remote webdriver.
* Handle the `macOS` as a valid platform name, as this is used by
  safaridriver.


v3.5.1
======

Important note:

* The new standalone server and Grid Node feature a "pass through"
  mode. If you see changes to the Selenium WebDriver "logging" APIs or
  automatic capture of screenshots on error (or if you want the old
  behaviour back) you can do so by executing:

  `java -jar selenium-server-standalone-3.5.1.jar -enablePassThrough false`

* Bump guava to version 23. This is work around an issue where maven
  will select guava's android variant if using a ranged selector.


v3.5.0
======

Note: Never pushed to maven due to problems resolving guava version.

Important note:

* The new standalone server and Grid Node feature a "pass through"
  mode. If you see changes to the Selenium WebDriver "logging" APIs or
  automatic capture of screenshots on error (or if you want the old
  behaviour back) you can do so by executing:

  `java -jar selenium-server-standalone-3.5.0.jar -enablePassThrough false`

* Bump guava to version 22.
* Add support for a new "pass through" mode. This allows a connection
  from your test's RemoteWebDriver, through the Grid Hub, to a Grid
  Node, and down to a DriverService and thence the browser to use the
  same WebDriver protocol (the Json Wire Protocol or the W3C one) end
  to end without translation. This mode can be disabled by starting
  the standalone server or Grid node with `-enablePassThrough false`
* Pin Guava to version 21+. This fixes problems with lambdas being
  used as ExpectedConditions.
* Start making *Option classes instances of Capabilities. This allows
  the user to do:
  `WebDriver driver = new RemoteWebDriver(new InternetExplorerOptions());`
* Better handling of `getText` when confronted with a Shadow DOM
* Better logging when using an Augmenter fails.
* Make it easier to add new @FindBy annotations.
* Attempt to kill processes before draining input, error, and output
  streams. This should reduce apparent hanging when closing Firefox in
  particular.
* Grid will make use of W3C capabilities in preference to the JSON Wire
  Protocol ones.
* Fixing boolean command line arguments (#3877)

v3.4.0
======

* Geckodriver 0.16 is strongly recommended
* LiFT package is now available as a separate maven dependency.
* Deprecated numerous constructors on RemoteWebDriver that are no
  longer useful.
* `requiredCapabilities` are now being removed. Use
  `desiredCapabilities` instead.
* Legacy Firefox support broken out into a `XpiDriverService`, but
  still relies on the same `webdriver.xpi` as before.
* Better support for W3C endpoints

v3.3.1
======

* Better support for geckodriver v0.15.0. Notably, exceptions returned
  from the remote end are now unwrapped properly.
* Fix a bug with the status page of the standalone server.
* Deprecated `Capabilities.isJavascriptEnabled`


v3.3.0
======

* Support for geckodriver v0.15.0.
* Deprecated seldom used FirefoxDriver constructors.
* Added javadocs to show best way to create a new FirefoxDriver:
  ```
  DesiredCapabilities caps = new FirefoxOptions()
       // For example purposes only
      .setProfile(new FirefoxProfile())
      .addTo(DesiredCapabilities.firefox());
  WebDriver driver = new FirefoxDriver(caps);
  ```
* Stream New Session capabilities to disk before use to avoid eating
  every byte of available memory.
* Beginnings of local-end implementation of the w3c New Session
  capabilities. There's still some work to do.

v3.2.0
======

* Updated Guava to version 21 and started using Java 8 features. Users
  are recommended to update too.
* Fix a problem starting Firefox caused by missing libraries
* Experimental support for the W3C Action endpoints
* Remove deprecated `FluentWait.until(Predicate<?>)` method. This
  should make lambdas work properly with Wait instances now.
* Bump htmlunitdriver version to 2.24
* [Grid] Allow for customisation of TestSlot (#3431)

v3.1.0
======

* Update how the WebDriverException gathers system info. Resolves an
  issue with slow-downs on OS X Sierra.
* Update Wait and FluentWait for Java 8. Requires an update to the
  latest guava version 21.0
* Remove old marionette actions support.
* Selenium server now understands a "-version" flag.
* `WebElement.getText` now returns text from the Shadow DOM.
* Implemented a more straightforward way to specify firefox binary in
  GeckoDriverService builder.
* Firefox can now pick a channel to start from on Windows via
  `FirefoxBinary.Channel`
* ChromeDriver now supports `NetworkConnection` interface.
* htmlrunner bug fixes, in particular around `getValue`, and relative
  paths to the suite file.
* Fixes to make htmlrunner work.
* Removed native events from FirefoxDriver.
* Truncate the string representation of capabilities for display purposes.
* Implemented session storage for w3c codec.
* Change server dependency to htmlunit 2.23.2.
* [Grid] DefaultCapabilityMatcher now considers "browserVersion".
* [Grid] Fix node registration issue for Se2.x nodes with -servlets.
* [Grid] Windows nodes are no longer displayed as "mixedOS".
* [Grid] browser version capability specified on node command line no longer parsed to a Number

v3.0.1
======

* Include ElementScrollBehavior enum in the release.
* Add dependency on HTMLUnit to be included in the standalone server.
* Grid new session requests pass original request through to the node
  without any modifications.
* Fix NPE in htmlrunner when port is not specified.
* FirefoxDriver (legacy) fix to cleanup temp filesystem on quit (#2914 #2908).

v3.0.0
======

IMPORTANT CHANGES

* Firefox is only fully supported at version 47.0.1 or earlier. Support
  for later versions of firefox is provided by geckodriver, which is
  based on the evolving W3C WebDriver spec, and uses the wire protocol
  in that spec, which is liable to change without notice.
* You may wish to choose an ESR release such as 45.4.0esr or earlier.
* Firefox 47.0.0 is not supported at all.

Other major changes:

* Stability fixes in Grid.
* All Grid nodes can now offer help.
* Updated to the latest version of HtmlUnitDriver.
* Re-enabled log gathering for the standalone server.
* Firefox profile is passed to both the legacy FirefoxDriver and
  geckodriver.

v3.0.0-beta4
============

IMPORTANT CHANGES

* Firefox is only fully supported at version 47.0.1 or earlier. Support
  for later versions of firefox is provided by geckodriver, which is
  based on the evolving W3C WebDriver spec, and uses the wire protocol
  in that spec, which is liable to change without notice.
* You may wish to choose an ESR release such as 45.4.0esr or earlier.
* Firefox 47.0.0 is not supported at all.

Other major changes:

* Remove OSS safaridriver in preference for Apple's own SafariDriver
  that ships as part of Safari 10.
* [Grid] -nodeConfig (json) files have a new flatter format (#2789)
* [Grid] Fix #2721, -nodeConfig (json) settings were not always
  applied
* [Grid] Cleanup the api for RegistrationRequest -- will break
  compilation for people moving from 2.x -- removed the ability to
  change the GridNodeConfiguration reference via the
  RegistrationRequest object and removed all other setters
* Include the selenium version in exceptions (again).
* [HTML suite runner] Better flag compatibility with the 2.x
  selenium-server-standalone.
* Fix #2727, combine -jettyThreads and -jettyMaxThreads (#2735)
* [atoms] Cleaning up getAttribute dependencies, reducing size from
  36K to 7K
* Better support for the W3C webdriver wire codec.
* Added ability to use FirefoxOptions when starting firefox.
* Fixed a bug where the firefox profile was not being passed to the
  geckodriver.
* SafariDriver's Technology Preview can be used if installed.

v3.0.0-beta3
============

* The HTML table runner can be downloaded as selenium-html-runner.jar.
* leg-rc jar is no longer bundled into the main selenium jar. Instead,
  it needs to be downloaded separately.
* Removed deprecated SessionNotFoundException in favour of the
  NoSuchSessionException.
* Added a "protocol handshake" on starting a remote webdriver. We now
  log the wire dialect spoken (original as "OSS" and the version
  tracking the W3C spec as "W3C"). This may result in multiple calls
  to the new session endpoint on local end start up.
* Removed command names ending with "*w3c" and instead handle this
  with different codecs.
* Switch to using atoms for 'getAttribute' and 'isDisplayed' when
  communicating with a W3C remote end.

v3.0.0-beta2
============

* maven packaging fixes
* Update GeckoDriver --port argument in all bindings
* System property webdriver.firefox.marionette now forces the server in marionette or legacy firefox driver mode, ignoring any related Desired Capability
* Grid fix NPE's on registration when -browser not specified

v3.0.0-beta1
============

IMPORTANT CHANGES

* Minimum java version is now 8+
* The original RC APIs are only available via the leg-rc package.
* To run exported IDE tests, ensure that the leg-rc package is on the
  classpath.
* Support for Firefox is via Mozilla's geckodriver. You may download
  this from https://github.com/mozilla/geckodriver/releases
* Support for Safari is provided on macOS (Sierra or later) via
  Apple's own safaridriver.
* Support for Edge is provided by MS:
  https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
* Official support for IE requires version 9 or above. Earlier
  versions may work, but are no longer supported as MS has
  end-of-lifed them.

Other major changes:

* New html-table runner backed by WebDriver.
* Unused command line arguments are now no longer parsed.


v2.53.0
=======

FINAL 2.X RELEASE.

No more HtmlUnitDriver... Moved to a subproject https://github.com/SeleniumHQ/htmlunit-driver

Java:
    * Query Selenium Server to retrieve actual running port.  Fixes #1299
    * Upgrading HtmlUnit to 2.20
    * Java: Introducing NoSuchSessionException in the core API
    * Fixing memory leak in TemporaryFileSystem Fixes #1679
    * Fixing rectangle dimension, and adding equals and hashCode
    * Java: Adding a new W3C-compatible string error code
    * Add support to listen "refresh" events. Fixes #1584
    * extended ExpectedConditions with a list of new ones. New logic operators + conditions for css and html attributes
    * Java: Deleting webbit a test server
Grid:
    * cleanup cycle needs to be persisted to allMap, since that's where it's read from in other places. this stuff needs some cleanup...
    * adding grid e2e distribution test
    * fix mixed content issue
    * when sorting nodes for consideration, also take into account last time accessed for a more even distribution across nodes over the lifetime of the grid.
    * Also fix using the RemoteProxy's getResourceUsageInPercent instead of calculating it in the sort.  Fixes #1673
    * make HttpClientFactory private methods protected to allow one to extend / override.

v2.52.0
=======

Firefox:
    * Weakening platform restriction to enable 64-bit support
    * Fixing closed window handling in FF45
    * Implementing a capability that disables overlapping checks - "overlappingCheckDisabled"

WebDriver:
    * Fix deselecting options in <select>, actually throw Exceptions documented
    * handle special case spellcheck attribute Fixes #1605

Grid:
    * Allow forwarded response to be modified by CommandListener

v2.51.0
=======

Firefox:
    * finding another edge case where we need to check -1 from the right and bottom of the element's rect
    * stop gap to help with elementFromPoint not being completely reliable
    * Implementing ability to return non-boolean capabilities
    * Bumping up the max version
    * Fixing scrolling to elements in overflow:hidden blocks. Fixes issue #1527
    * Fixing issue #1509
    * Deleting deprecated constant
    * Deleting unused method FirefoxBinary.createProfile

WebDriver:
    * Fixing httpOnly cookies in HtmlUnit driver
    * Adding close connection support to HttpClient to combat hanging open files Fixes #1080
    * Increasing log buffer max size
    * optimize JsonToBeanConverter In case the input is a JsonNull, return null asap.
    * Add toString() to DefaultElementLocator
    * fix #1575

v2.50.1
=======

    * add a way to add to the list of capabilities to consider to the default capability matcher
    * Grid: Fixing timeout issue again... Why isn't it covered by tests? A rhetorical question...
    * Java: Improving handling of marionette errors
    * Java: Replacing ByteArrayOutputStream with CircularOutputStream to prevent OOM exception. Fixes issue #427
    * Java: Moving CircularOutputStream to another package (it's an internal class so no need to create a copy)
    * fix #1562

v2.50.0
=======

WebDriver:
    * Firefox: fixing sendKeys throwing "cross-process JS call failed " in FF45
    * Firefox: fixing click to multirect elements broken by the previous PR
    * Check element corners and middle for clickability
    * Fix keyCodes for some characters in the FirefoxDriver.
    * Firefox: fixing malformed URL handling. Fixed issue #1248
    * Prevent Firefox from opening a page on a second or later run and/or after some amount of time
    * Fixing executable finder on Windows
    * Fixing HtmlUnit driver to pass recently added tests
    * Firefox: fixing appending to contenteditable elements. Fixes issue 1419
    * correct javascript remote client ui executor to use new promise based execute introduced by 0fa587 Fixes #1521
    * Firefox: Adding an extra check to result wrapper. Fixes issue #1426
    * Changes to simplify the execution of finding elements.
    * Fixing issue #1479. The only reasonable thing we can do for select elements is to disable clickability checking, see https://gist.github.com/p0deje/c549e93fa19bf7aaee49

Grid:
    * Found a better place to convert seconds to milliseconds

v2.49.1
=======

Grid:
    * Fixing timeout issue in the Grid.

WebDriver:
    * Allow GeckoDriverService to be extended.
    * Update tagName test searching for "" to throw

v2.49.0
=======

WebDriver:
    * Add maven coordinate for the Firefox Driver when built using Buck.
    * Remove guava dep on the selenium-apis when built using Buck.
    * on osx for firefox, fallback to checking homebrew install, if the default isn't there
    * Pass Options.ime() through to the wrapped driver.
    * Fixing HTML suite test runner
    * Bump guava to version 19
    * Ensure that the buck-built core library has no third party dependencies.
    * Updating textContent attribute test for IE9
    * Adding appropriate wait to AuthenticatedPageLoadingTest
    * Refactor concrete WebDriverException#getSupportUrl's
    * Fix a NullPointerException in RemoteWebDriver.getCurrentUrl
    * Reduces time wasted in when using a native driver
    * add the useful information about the session / capabilities in the exception when the 'browser may have died'
    * give the cleaner almost double the time to clean up the sessions (a whopping 9 more ms). Hopefully will deflake this test in CI.
    * Adding El Capitan (OS X 10.11) to Platform
    * Updating IE driver to fix clearing of <input type='number'> fields
    * Treat a null response to getCookies as [].
    * Restore a isNativeEventsEnabled check.
    * Updating TestNG.
    * firefox: Throw error when element cannot be clicked
    * Include Windows 10 in the Platform enum.
    * adding selenium server pass throughs for W3C dialect of alert / window / cookie commands.
    * clearing a number input with invalid text, should actually clear it.
    * Add innerHTML attribute support to HtmlUnitDriver
    * Add textContent attribute support to HtmlUnitDriver
    * make RemoteMouse public, akin to RemoteKeyboard. Not sure why it wasn't made public when it was originally moved out of RWD.
    * Use platform-dependant line separator instead of hardcoded '\n'.
    * Safari should only specify MAC as platform in default desired capabilities
    * improve javadoc for FluentWait
    * Changing interface name to be more Java-ish
    * Update GeneratedJsTestServlet to work with test files that use Closure's module syntax.
    * Adding release-v3 crazyfun target
    * should be able to send keys to a content editable div that is initially empty
    * Implementing pure WebDriver grid server (v.3)
    * Making BrowserLauncherFactory non-static, to avoid global configuration, for better testability and configurability (per object, not globally)
    * Server: Moving shared classes to a more appropriate place out of the legacy server namespace
    * Deleting RemoteControlLauncher as it is just a couple of static methods to parse command line options, that should belong to the server.
    * Refactoring GridLauncher: replacing big switch with a map of simple launchers; it's a step toward decomposition of the GridLauncher and dynamic discovery of the elements that can be launched.
    * Refactoring GridLauncher build process
    * Decoupling node registration module (SelfRegisteringRemote) from concrete implementation of the server to be run on the node.
    * Refactoring grid node registration procedure to make server start/stop methods as simple as possible.
    * Breaking another dependency of Grid on RC server
    * Deleting fail-fast check of browser configuration, this breaks another Grid dependency on parts of RC server. The check must be performed in RC server (if ever).
    * Actually fix the Safari BUCK build
    * Monkey-patching W3C-compatible cookie serialization to fix Marionette. A more proper fix would be to change the parameters of a Command from Map to Object.
    * There is no need to create a profile for Marionette
    * removing prebuilt SafariDriver extension, bumping version number to 2.48
    * Fixing tests for JsonToBeanConverter to avoid "error" key collision that has got new semantics in the standard
    * Stop exposing embedded jetty out of SeleniumServer
    * Breaking unwanted grid dependency on parts of RC server
    * Deleting JsonKey, it's a useless abstraction
    * Breaking unwanted grid test dependency on RC server (the removed attribute is not used actually)
    * Fixes #1140, #1334, #1263, #669, #1165, #1132, #1186, #1203, #1214, #1242
            #1241, #1240, #1238, #1237

v2.48.2
=======
WebDriver:
    * Update fix for ChromeDriver to work with Marionette/Wires also.

v2.48.1
=======
WebDriver:
    * Fix #1123, ChromeDriver doesn't start up.

v2.48.0
=======

WebDriver:
    * java: add ExpectedConditions#numberOfWindowsToBe
    * Bump the buck version to the latest version.
    * fix maven build for jetty 9
    * adding pom files for jetty 9 repakced jars and the empty-javadoc jar used to upload to maven central
    * Restoring use of queued thread pool in the hub
    * Deleting commented code
    * Fixing UploadServlet in test environment to conform to servlet-api 3.1
    * Update jetty readme
    * Bump the Jetty version from 7 to 9
    * Updating screenshot code to retain scroll bars in required directions.
    * Updating screenshot code to prevent resizing if window is large enough.
    * Removing superfluous comment that was causing javadoc build error in ci
    * fixing the remaining jdk 8 javadoc errors
    * Make the javadocs for java/server too.
    * fixing java command line options for 'go' MaxPermSize -> MetaspaceSize in java 8
    * updating third party wicked good xpath to e33a3876a6d592b824942751d86ba5f2b08a3dc5 Fixes #1040
    * Removing use of Windows hooks for taking screenshots in IE.
    * Firefox: fixing sendKeys for contentEditable elements, it should append to the existing text.
    * Buck version bumps
    * Update closure-library to 04a8ceefc6972511e669563d47abeca18b28092c
    * Firefox: implementing mouse doubleclick action via nsIDOMWindowUtils
    * Add FluentWait.withMessage with string supplier
    * Firefox: fixing events generated as a result of click on an element that disappears after the click.
    * Firefox: implementing mouse up/down actions via nsIDOMWindowUtils. This makes mouse actions "more native". In particular, if there are overlapping element at the click point, the driver will click the topmost element.
    * Safari: stop embedding the extension in the client libs, it should be downloaded and installed manually.
    * Deleting a couple of redundant casts
    * No need to cast, the variable has required type already
    * Deleting redundant logging to console in tests
    * HtmlUnit: Ignoring one more test
    * Disabling a test if JS is not enabled
    * HtmlUnit: Unignoring a magically working test
    * HtmlUnit: restoring backward compatibility after changes in getCurrentUrl semantics
    * WDBC: restoring backward compatibility after changes in getCurrentUrl semantics
    * Deleting native events from firefox driver
    * Deleting outdated assumes for unsupported Firefox version
    * Resorting tests for moveByOffset action
    * Firefox: don't dispatch keypress event if defaultPrevent() of the keydown event is called because KEY_FLAG_PREVENT_DEFAULT has no effect
    * Moving IE specific test to IE test suite
    * Firefox: throwing proper exception on an attempt to find an element in the deleted frame
    * Firefox: changing getCurrentUrl to return top level browsing context address (to conform to the standard)
    * Firefox: fixing page source for plain text pages
    * Adding information on the reasons to ignore tests
    * fix the client and server classpath
    * Move the servlet-api package for easier automated updates.
    * Renaming the Jetty7AppServer to remove the version number.
    * Fix up failing htmlunitdriver test.
    * Simulating window.getPosition and setPosition operations
    * Simulating switchTo().window by name
    * Fixing test to switch back to the original window after opening a new one.
    * Implementing standard-compliant window operations
    * Implementing standard-compliant getSize, getPosition and getPositionInView
    * Deleting marionette tcp connector
    * remove unused css transform code from location in view
    * use BasicHttpRequest instead of EnclosingRequest
    * htmlunit passes the httponly cookie test
    * fix maven dependency of htmlunit driver on the support package
    * don't replace a platform specified to the add browser method, like the TODO says
    * Simulating submit operation for standard compliant drivers
    * Making sendKeys more backward compatible (because i18n tests)
    * Change buils to builds
    * Unignoring marionette tests passed after sendKeys rework
    * Fixing getSize operation broken by copy-paste from getLocation
    * Reworking sendKeys to send characters one by one, this is standard compliant behavior
    * Making switchTo().window more standard compliant
    * Making getLocation and getSize standard compliant
    * Making timeout setting methods standard compliant
    * Fixing "no such alert" error mapping
    * Making findElement(s) commands standard compliant (except for link text locators)
    * java: fix log string for RemoteTargetLocator#defaultContent
    * Update check to see if we are speaking to a W3C remote end point
    * specificationLevel is defined in http://w3c.github.io/webdriver/webdriver-spec.html#capabilities
    * use exception message.  no method overload exists for log.severe
    * Upgrade HtmlUnit 2.18
    * ReflectionBackendDriverSupplier: two arguments Capabilities
    * HtmlUnitMouse: no need to .focus()
    * Fix HtmlUnitWebElement.getCssValue
    * AMO requires the max version be an actual release version number
    * Correcting IE driver build process to create executables runnable on Windows XP Fixes issue #936.
    * Improve comments and error message on scrolling_test#testScrollingAccountsForScrollbarWidths.
    * Java client side support for launch_app command of chromedriver:
    * Add "additionalCommands" support to DriverCommandExecutor.
    * Use directExecutor().
    * Updating IE driver C++ code to use Visual Studio 2015.

Grid:
    * Run grid tests using Buck.
    * removing '-debug' command line parameter for grid hub, it isn't used anywhere.
    * adding edge icon for grid


v2.47.0
=======

** Java 7 is now requried, but you really should be on 8, since 7 is EOL **


WebDriver:
* Supports native events for Firefox version 31 (immediately previous
  ESR). Native event support has been discontinued for versions of
  Firefox later than 33. Synthetic events tested on Firefox versions 31
  (immediately previous ESR), 38 (immediately previous release and current
  ESR), and 39 (current release).
* Beta Alert.AuthenticateUsing api implementation added, beta testing with IE.
* Added TakesScreenshot to WebElement.
* (provided by Microsoft) Added language bindings for Microsoft Edge browser
* Make it possible for users to override how the Lock is obtained with Firefox.
* (provided by Ahmed Ashour) Added implementation of Alert for HtmlUnit driver.
* (provided by Ahmed Ashour) Fixed findElementByXPath for HtmlUnit driver to
  work for XML pages.
* (provided by Ahmed Ashour) Fixed HtmlUnit driver to allow for manipulating
  elements in SVG documents.
* (provided by Ahmed Ashour) Fixed HtmlUnit driver so that deleteAllCookies
  deletes cookies only for the current domain, matching other implementations.
* (provided by Tamás Buka) Created an overload to
  ExpectedConditions.frameToBeAvailableAndSwitchToIt support to index and
  WebElement so that WebDriverWait can use this mode to switch frames.
* (provided by Joshua Bruning) Allow access to local profiler logs. An
  exception may be thrown if the WebDriver server does not recognize profiler
  logs. In this case, the user should be able to see the local profiler logs.
* (provided by Sergey Tikhomirov) Changed visibility of isDecoratableList
  method of DefaultFieldDecorator to protected for use with custom PageFactory
  implementations.
* Froze javascript.enabled property in Firefox profiles
* FIXED #426: (provided by Anand Jayaram) Default the hub port to 4444, if no
  port was provided.
* FIXED #638: Disabled HTTP Public Key Pinning (HPKP) when the
  webdriver_accept_untrusted_certs capability is set. As of Firefox 39, Firefox
  ignores certificate overrides if the domain's certificate is pinned.
* FIXED #644: (provided by Brett Randall) Modified ErrorHandler to tolerate
  non-Number lineNumber, and also attempts to safely parse a non-Number Object
  if it receives a non-Number. If absent or non-numeric it now continues to
  build the StackTraceElement (instead of aborting that frame) and uses the
  conventional -1 for lineNumber.
* FIXED #658: Disable reading list info panel in Firefox.

Server:
* Added a guard that prevents starting "IE instead of Opera" (or some other
  unwanted browser that obviously does not match the desired capabilities).
  Previously if a new session request is forwarded to a node it results in a
  driver instance creation in any case. For example, let's suppose a user
  starts a node with -browser browserName=opera option, and there is no
  operadriver in the classpath. Then the user requests a new remote driver with
  browserName=opera. The hub forwards the request to the node, and the node
  attempts to find the "best matching" driver provider. As far as opera is not
  available, it can start any other browser. Because "best matching" does not
  imply matching. The new guard prevents this unwanted behavior.

Grid:
* Added support to grid for Microsoft Edge driver
* (provided by Dima Kovalenko) Sort Grid Proxies in order of least busy to
  busiest. This should prevent situation where one node is running multiple
  sessions while several nodes are completely idle.

RC:
* Removed start of Firefox with -silent option to prevent crash in Firefox.

IDE:
* FIXED #570: Add ability to record elements that do not have href attributes.

v2.46.0
=======

Important changes in this release:

* Supports native events for Firefox version 31 (immediately previous
  ESR). Native event support has been discontinued for versions of
  Firefox later than 33. Synthetic events tested on Firefox versions 31
  (immediately previous ESR), 37 (immediately previous release), and 38
  (current release and current ESR).
* Remove all support from both webdriver and RC for Presto-based
  Opera. Blink-based Opera is still supported!
* Added beta Marionette driver (for Firefox OS and recent desktop
  releases).
* Fixing critical selenium server error caused by a user registering a
  driver class compiled with a higher Java version than the server is
  running (eg: server runs with Java 7, but the driver is comopiled to
  target Java 8)
* FirefoxDriver: now supported on OpenBSD (added by minusf@gmail.com)
* HtmlUnitDriver: Updated to HtmlUnit 2.17. Requires Java 7 or above to work.

Other notable changes:

* Added ability to clear file input fields for Firefox.
* Fix bug in Safari where Selenium updated the page under test in some
  circumstances.
* HtmlUnit: do not disable mouse notifications when js is disabled,
  css is also related to this information (only partly implemented in
  HtmlUnit at the moment)
* Updated htmlunitdriver to use htmlunit 2.17
* Upgraded commons-exec from 1.1 to 1.3
* Changed capability name from pageLoadingStrategy to pageLoadStrategy
* FIX: Google Code issue #7749: Add Get/Set network connection
  commands to JsonHttpCommandHandler to be able to use commands in
  selenium grid.
* Allow clients to specify TCP timeouts in the remote webdriver.
* Allow the chrome binary passed in capabilities to have a higher
  priority than node configuration.
* ChromeDriver: Added ability to pass whitelisted-ips option to the
  chromedriver
* Implement lazy loopback detection. This provides ~10x speed
  improvement of selenium server startup.
* Allow loading option descriptions from JSON file instead of
  Properties, allowing the server to manage order of options in the
  help message
* SafariDriver: In SafariDriver's page script, copy window properties
  to goog.global. (provided by juangj@google.com)
* Add a method toList that allows converting CompositeAction to JSON
* FirefoxDriver: Skip the profile cleaning step when launching Firefox
* Implement both integer (legacy) and string (standard) response status
  for the JSON wire protocol
* FirefoxDriver: Disable https://wiki.mozilla.org/Advocacy/heartbeat
  Firefox 37+ feature in browser sessions started by FirefoxDriver.
* FirefoxDriver: Added getters to FirefoxProfile to allow reading
  preset preference values
* PageFactory: Changed default value of how part of @FindBy annotation
  from ID to UNSET, but treat them equivalent to ensure backward
  compatibility
* PageFactory: Provide ability to use custom annotations. (Provided
  by Artem Koshelev)
* Use DaemonExecutor from commons-exec instead of DefaultExecutor.
  Fixes Google Code issue 4734. (Provided by Richard Atkins)
* FirefoxDriver and Java language bindings now handle both legacy and
  W3C specification dialects of element reference serialization in the
  JSON wire protocol.
* FirefoxDriver:  Don't force garbage collection in httpd.js for
  Firefox when connections are closed

v2.45.0
=======

Important changes in this release:

* Native events in Firefox relied on an API that Mozilla no longer
  provides. As such, fall back to synthesized events on recent Firefox
  versions.

Other changes:

* When Selenium is unable to interact with an element, such as the
  case when an element is missing or disabled, this change will output
  exactly how Selenium is attempting to locate the element, such as
  the XPath or id of the element. This greatly speeds up
  troubleshooting issues, as the exception message clearly states what
  element is broken/missing for common problems like an
  ElementNotFoundException.
* improve ByCssSelector#toString
* Remove automatic installation of the SafariDriver in Java.
* Complete Selenium Java Server support for Blink based Opera
* Upgrading PhantomJS driver
* Pull HttpClient implementation details out of HttpCommandExecutor.
* Fix issue 8254: Extensions were incorrectly transferred between
  Windows client and Linux grid node, because ZipEntry had incorrect
  name with '\' as separators.
* Adding capabilities and browser type for Opera Blink, and
  configuring tests to run in Opera Blink
* Adding support for Blink-based Opera to Java binding
* Adding Yosemite platform
* Allowing to set an arbitrary platform capability even if it can't be
  converted to Platform enum. Non-standard platform values can cause
  matching issues on Grid, but they can be usable for third-party Grid
  implementations
* Taking XML namespaces into account when searching by XPath. Checked
  to work in Firefox. Chrome supports namespaces out of the box. Need
  to update IE and Safari drivers to use the updated atom and test
  them carefully.

v2.44.0
=======

  * Updating Native events to support Firefox 24, 31, 32 and 33
  * Update calls to deprecated guava methods.
  * Remove the deprecated DatabaseStorage interface. And callers. Note that the browser implementations may still have an implementation of these interfaces, but nothing in the main project implements it so we should be okay.
  * Bump the version of guava to 18
  * Bringing MarionetteConnection in line with the current marionette state (FF33)
  * Add new tests for some wait conditions Also add the ExpectedConditionsTest to the test suite.
  * Update FindBy annotations description
  * Moving last part of browserlaunchers package from client to server
  * Moving Proxies utility class to server
  * Moving LauncherUtils to the server
  * Moving utility method isScriptFile to the only class where it is needed
  * Deleting tests for removed deprecated classes
  * Moving more RC stuff to the server
  * Moving tests too
  * Moving proxy management stuff to the server, it is used in RC browser launchers only
  * Using asMap as well as toMap to convert an object to Json
  * Using JsonNull.INSTANCE instead of null
  * Removing deprecated classes
  * Log stacktrace. Adds more info on catch to be put into the log instead of just console.  This will help debug issues when one has access to grid hub log but no access to console.
  * Remove unused static import of Ignore.Driver.HTMLUNIT.
  * Remove obsolete ChromeOptions code.
  * trim() HTTP response content because some drivers send back a response containing trailing null bytes, which the GSON parser does not like.
  * If JsonParser.parse() fails to parse a string obtained from a reflective call to a toJson() method, assume it is a primitive string.
        This is the case for, e.g., FirefoxProfile.toJson(), which returns a base64-encoded zip file. That string likely contains at least one '/', which the Gson parser rejects.
  * Fixing SessionId from json converter to better handle the case of null sessionId
  * Fix the Eclipse config. The new gson dependency wasn't added. Now is :) Also switched a call in HtmlUnitWebElement to use guava rather than commons-lang since that's already included in the build configs for both Buck and CrazyFun.
  * Get the Buck build working again.
  * HtmlUnit: add text to the end of input fields. This makes the htmlunit driver work as the other drivers do.
  * HtmlUnit: Fix getAttribute for dynamic properties.
  * Enable Html5CapabilitiesTest for HtmlUnit
  * Fix classpath for running tests in eclipse This allows the htmlunitdriver tests to run in Eclipse.
  * Fixing broken CrossDomainRpcLoader
  * Implementing autoconverion of platform in Capabilities on write
  * Moving from org.json to gson because the license. Fixes issue 7956
  * Revert "Bump the version of webbit to 0.4.15"
  * Optimizing finding multiple elements by id by using CSS selectors if available. Fixes issue 7682
  * Fixing WDBS compatibility with IE5. Fixes issue 7938
  * HtmlUnitDriver: Initial code cleanup.
  * Eclipse classpath fixes for htmlunit.
  * Deflake a test.

v2.43.1
=======

  * Fixing socketlock bug with reusing the same profile multiple times

v2.43.0
=======
WebDriver:

  * Updating Native events to support Firefox 24, 31 and 32
  * Add note on stale element checks and a WebElement represents a DOM element
  * Upgrade third party dependency JavaScript-XPath to 0.1.12
  * Fix example code: "using(-Chrome)DriverExecutable"
  * Make event_firing_test.html pass in Firefox 24 ESR.
  * Fix an error propagation bug when a command fails from bad inputs.
  * Handle the case where a proxied element from PageFactory causes a FluentWait to timeout.
  * Integrating the Microsoft Internet Explorer driver implementation
  * Allow subclasses of HttpCommandExecutor to extend it at runtime.
  * Handle the case where executeScript returns an HTMLDocument.
  * IEDriver crashes in WaitUntilElementFocused() because of null pointer. Fixes issue #7577
  * Deprecate the original RC interface in Selenium.
    As part of Selenium 3.0, we shall be moving the original RC interface to a
    legacy JAR that will be available as a separate download. As the first step
    in this process, the original "Selenium" interface is being marked as
    deprecated.
  * Run FirefoxDriver tests with Buck.
  * Bump timeout for tests since a suite is also a test.
  * Run htmlunit-driver tests with Buck.
  * Run the ignored tests printer with Buck.
  * Get org.openqa.selenium.SmallTests building with Buck.
  * Working around limitations in subpixel precision event handling.

    The bug/limitation where browser supports subpixel precision for elements but not for dispatched events was found in both modern Chrome (http://crbug.com/396380) and Firefox (?) browsers.
    (IE doesn't seem to be affected: before and including IE9 - no subpixel for elements and events; from ie10 - subpixel is supported for both elements and events).

    This test was lucky so far (mostly?) and didn't hit this issue, until Chrome 37 that enabled subpixel text scaling by default.

    This change makes *sure* elements have subpixel coordinates (if only browser supports'em) and then it makes sure this test doesn't fail because of that (while still testing selenium atoms).

    While there, I moved asserts from event handlers into the normal test flow so jsunit can properly attribute assertion failures to specific test methods.
  * Updating prebuilt libs for windows
  * Re-add the rubyzip jar
  * updating prebuilts for linux
  * Updating to gecko 32
  * Log formatter should be able to work with empty keys array. Fixes issue 7357
  * Fixing infinite read from socket. Fixes issue 7814
  * WDBS: safe check for window.localStorage
  * Driver should operate cookies for the current frame, not the topmost one. Fixes issue 7799 in
    Firefox
  * Actually supporting promised Id for webdriver.WebElement.
  * Adding more checks for JS functions removed from IE11. Fixes issue 7803
  * Fixing use of deprecated API in httpclient
  * Fixing use of deprecated API in guava
  * Update Closure library to head and compiler to the latest release
  * Implementing ability to use FirefoxDriver on a machine where localhost is not the first alias for
    127.0.0.1. Fixes issue 3280
  * Handle null and empty paths the same as /
  * fixing maven build, adding reference to jetty-rc-repacked-5
  * adding pom and info on uploading jetty-repacked-5 to maven central
  * Adding checks for JS functions removed from IE11. Fixes issue 7780
  * Deleting what appears to be unused deps.
  * Add more options to the Builder API (every common, settable capability should be covered).
    * Require calling Builder.usingServer(url) to use a remote server. If this is not called, the
     builder will attempt to create a client locally, throwing an error if it can't (e.g. for IE).
    * Add browser specific constructors to simplify creating a client without the Builder.
    Fixes issue 7593
  * Updating json-cpp lib and replacing mongoose web server with civetweb.
  * Safari is flaky. Reducing timeout to fail faster when we're going to fail.
  * Catch driver start-up failures.
  * Add explicit API for configuring log prefs rather than forcing users to rely on
    magic capability strings.
  * Clean up internal Firefox logging API.
  * Use LogLevelMapping to convert JSON wire protocol name to Level instance.
  * Make the jettyMaxThreads parameter actually be effective
  * Fix NullPointerException when File#listFiles() returns null. Fixes issue #1934
  * Making WDBS.start command a no-op if it was instantiated with an already started driver. Fixes issue 3993
  * Handling possible exception in stringification of window.location. Fixes issue 3908
* Modified IE driver server to more closely follow W3C spec

    This commit includes a number of changes designed to bring the IE driver
    into closer alignment with the W3C WebDriver specification. It provides
    no functional changes to the driver, nor does it change any external-
    facing API. The changes are:
     * Changed webdriver::Server to examine the response from the newSession
       command for the session ID rather than a two-stage process. The
       webdriver::Server::DispatchCommand method now calls the
       InitializeSession method directly when processing the newSession
       command.
     * Removed the now-obsolete webdriver::Server::CreateSession method.
     * Added a Serialize/Deserialize method pair on the webdriver::Command
       class (renaming the Populate method to Deserialize).
     * Revamped the serialization of webdriver::Command to use 'name' instead
       of 'command' for the command name.
     * Added a session ID member to the webdriver::Command object.
     * Modified the webdriver::Command object to no longer draw distinction
       between parameters passed in as part of the URL substitution and those
       passed in as part of the JSON payload in the body.
     * Modified webdriver::CommandHandler::ExecuteInternal (and all subclass
       implementations to use a single parameters map instead of the dual
       URL tokens/JSON payload parameters maps used previously.
  * Propagate webdriver_firefox_port preference to FirefoxDriver, was being ignored. Fixes issue 5172
  * Adding a new selenium server option -logLongForm to log more details to the console. Fixes issue 6645
  * Handling possible IllegalStateException while cleaning orphaned and timed out sessions. Fixes issue 6771
  * Setting forwarded content for CommandListener afterCommand handler. Fixes issue 7443
  * Fixing the list of extensions to search for an executable on Windows, and logging process startup
    errors. Fixes issue 7514
  * Setting layout.css.devPixelsPerPx to 1.0 if native events are enabled only. Fixes issue 7445
  * BODY element is always shown/displayed.
    related section in the W3C spec:
    https://dvcs.w3.org/hg/webdriver/raw-file/default/webdriver-spec.html#determining-if-an-element-is-displayed
  * Implementing switchToParentFrame support in atoms
  * Setting HtmlUnit to emulate FF24 by default
  * Updating HtmlUnit to 2.15
  * Stop polluting the log with stacktraces. Fixes issue 7460
  * Returning less specific platform info from firefox driver. Fixes issue 3354
  * Adding driver info into TimeoutException thrown by WebDriverWait. Fixes issue 7429
  * Implementing switchToParentFrame command for IE driver
  * Adding URL endpoint for switchToParentFrame

v2.42.2
=======
WebDriver:

  * errorHandler needs to be instantiated. Fixing NPE with IEDriver Issue #7415

v2.42.1
=======
WebDriver:

  * resorting context endpoints, belong with mobile spec
  * re-added Context endpoints to java client
  * allow custom ErrorHandler for HTTPCommandExecutor
  * fixing toJSON of chrome options where equal options become unequal.

v2.42.0
=======
WebDriver:

  * updating firefox prebuilts, thanks jleyba for fixing the build!
  * Use PRUnichar for Gecko < 29, char16_t otherwise.
  * Updating third_party/py/jython.jar to Jython 2.5.3
  * Removing unused functions
  * Implementing more straightforward way to send keyboard events in synthesized mode. Fixes typing into number inputs and rich text editors (like tinymce)
  * Fixing interactions API in Firefox to be able to move mouse to elements in frames using native events. Fixes issue 7253
  * Removing unused import
  * Refactoring: moving an auxiliary class from the top level to inner class
  * Removing outdated getValue command handler
  * Change ClearElement to be a subclass of WebElementHandler instead of WebDriverHandler
  * Removing outdated (unused) command constants
  * Fixing clicks on invisible elements in HtmlUnitDriver broken by ElementNotVisibleException being a subclass of InvalidElementStateException
  * Click after move with offset should use last mouse position
  * Adding new interface methods to the stubs
  * Preserve wrapped test function's string representation for Mocah's BDD interface.
  * Fixing IE driver to allow JavaScript objects with property names with spaces
  * Ignoring IE6-only test failure for CSS
  * Bump the hmltunit version to 2.14
  * Remove a class of our which replicates HTTP status codes already given meaningful names in the standard JRE.
  * Updating version match for native libs in firefox plugin manifest file
  * Updating native events dll for FF28
  * Implement ability to load driver providers using ServiceLoader. A user can add new providers or override existing ones. To use this ability a user should:
  * Refactoring the process of driver instances creation to use a new DriverProvider interface. DefaultDriverProvider wraps the current logic -- creating instances using reflection. This is a step to implement ability to load additional providers using ServiceLoader that can add new providers or override existing ones.
  * Ruby: Fix for extensions whose install.rdf uses an attribute for em:id (issue 5978)
  * fixes issue for locating newly installed chrome versions
  * Fixing IE driver crash when clicking on link that opens a new window.
  * Properly configure the http client in the presence of user credentials.
  * java json converter chooses Long (Number base class). Fixing RemoteNetworkConnection
  * SUPPORTS_BROWSER_CONNECTION was removed, missed a reference
  * Clean up use deprecated methods & classes.
  * ElementNotVisibleException is a type of InvalidElementStateException.
  * Tweak messaging on SafariDriver client page to better reflect what is happening. Also added a log message pointing users to the toolbar button that opens the driver log page.
  * Remove some no-op calls to deprecated functions.
  * Pull the logic for converting Command/Response pairs to and frame HTTP request/response pairs into a common codec instead of duplicating the logic on the client and server.
  * Change some tests to use Alert#accept() instead of Alert#dismiss() to get rid of alert dialogs. This is a workaround to ChromeDriver issue 764:
  * When running tests against the remote server, ignore two tests that use required capabilities. The remote server only supports desired capabilities on new session requests.
  * Update two tests to work when running with a remote server, where the original js error will be the root exception, but not necessarily the second error in the cause chain.
  * Test if we need to skip cookie tests for lack of a valid domain name before calling a method that asserts we have a valid domain name.
  * Convert HttpRequest/Response to POJOs; handle all conversion to and from HttpServletRequest/Response inside DriverServlet.
  * Every command handler returns ResultType.SUCCESS and those handlers that return an actual value do so through a level of indirection. This commit changes command handlers to just return results directly to the caller, making it possible to delete a lot of unnecessary code.
  * Move static resource serving code into DriverServlet. It is not part of the JSON wire protocol and including it in the command dispatcher complicates planned refactoring and other code cleanup.
  * Mobile - Network Connection implementation for Java and Python.
  * ChromeDriver 2.10.267517 binds to the loopback address instead of 0.0.0.0, so only attempt to connect using the loopback address.
  * Code comment changes for wait()
  * added task name to SCHEDULE_TASK event
  * Eclipse compiler update for Java 8 support
  * Updating naive user agent string checks to account for IE11
  * Adding Windows 8.1 detection to Platform.extractFromSysProperty
  * retry a test failure if there was a 'sauce' issue, like we exceeded the total time a test session is allowed to take.
  * adding Windows 8.1 platform, so we can use it in saucelabs for IE11 testing
  * Remove deprecated functions on webdriver.promise.Promise class * Use templates with webdriver.promise.Promise to improve types   documentation.
  * Loosen input type to webdriver.stacktrace.getStack_ to account for an rare condition in FF 28+ where the Error() constructor returns undefined (not sure what causes it, just know it happens)
  * Add ability to save an abitrary base64 string as a screenshot from a WebDriverJS test running in a browser.
  * When Firefox is configured to accept all SSL certs (which is the default behavior), we need to set a time offset to prevent Firefox from using HSTS (HTTP Strict Transport Security). If we don't do this, Firefox will pre-fetch the certs for sites that should always be accessed over HTTPS and allows Firefox to catch man-in-the-middle attacks. While this is A Good Thing for users, it prevents WebDriver from accepting self-signed certs for these domains (e.g. when they are accessed through a HTTPS proxy).
  * Remove unnecessary dependency on bouncycastle.
  * Making ChromeDriver directly implement the interfaces representing features it implements.
  * Updating build process for Firefox native events components to use gecko 29 SDK
  * Updating buck version to latest OSS release
  * Use addEventListener if possible. Fixes issue 6680
  * Packaging webdriven selenium (emulator) to client-combined jar. Fixes issue 7206
  * Don't use system path separators when computing URL paths.
  * Make Cookie serializable
  * Ignoring a test for HtmlUnitDriver that can't be run due to HtmlUnit restrictions
  * Allowing FindBy, FindBys, FindAll annotations on types
  * Minor cleanup FirefoxBinary.java
  * Adding Firefox native event version support to CHANGELOG
  * Adding version number to the capabilities returned by htmlunitdriver. Fixes issue 7110
  * Implementing augmentation indicator as an annotation
  * Error handling for startSession is handled in the parent class now.
  * Remove deprecated functions.
  * Revert "Fixing Java 8 incompatibility caused by use of old jruby" because it breaks java 7 compatibility :(
  * Fixing Java 8 incompatibility caused by use of old jruby
  * Export logging API from main webdriver module.
  * Setting pixel density to be independent from OS settings. Fixes issue 6112

v2.41.0
=======
WebDriver:
 * Update to support native events for Firefox 28 (removed native event
   support for Firefox 26). Native events are now supported for the
   following Firefox versions:

   17 (immediately previous ESR release)
   24 (current ESR release)
   27 (immediately previous release
   28 (current release)

 * Fixed capabilities to be sent properly encoded. For instance,
   capabilities for mobile have copyright signs.
 * Renamed some commands in the Firefox driver to prepare for Selenium
   3. This essentially means that we're mirroring the names of the
   commands in the function names within the driver. Also implemented
   handling a Selenium 3 style "sessionId" in a Command received by a
   Selenium 2 server.
 * Implemented support for switching context as described here:
   http://code.google.com/p/selenium/source/browse/spec-draft.md?repo=mobile#133.
   This feature will be used by mobile WebDriver users to switch
   between different contexts like the native or the webview UI element
   tree. The feature is end to end tested with latest Selendroid
   snapshot version (6a126ab). In the langauge bindings, this is
   implemented as a role-based interface. Subclasses of RemoteWEbDriver
   that need this should extend TargetLocator and use covariant return
   types to keep everything happy and sweet.
 * Removed InternetExplorerDriver constructor that accepts
   WindowsProxyManager as a parameter. Proxy management moved to
   IEDriverServer and WindowsProxyManager is used for RC only now.
 * Removed use of VK_ENTER since its been removed from Firefox. PUA
   code uses VK_RETURN now like Mozilla Tools.
 * Added switch to parent frame command to the wire protocol and API.
 * Added httpOnly flag to Cookie JSON object.
 * (on behalf of Tobias Lidskog): Added property for silencing
   chromedriver. The Java property "webdriver.chrome.silentOutput" is
   now used to set the default value for silent mode in chromedriver
   using the ChromeDriverService class. This is analogous to the
   existing system property for controlling verbose mode.
 * (on behalf of Yi Zeng): Updated download link to googleapis.com
 * Reduced the visibility of a deprecated class in the htmlunit driver.
 * Removed deprecated FirefoxProfile.setProxyPreferences method.
 * Removed deprecated ChromeOptions.setExperimentalOptions
 * FIXED: 4843: (on behalf of Jonatan Kronqvist): Regard all modifier
   keys in SingleKeyAction. An earlier commit added META, but COMMAND
   and LEFT_* were left out as they were misinterpreted as aliases,
   which they aren't (they onlyuse the enum definition to get the same
   character code of the keys).
 * FIXED: 5331: Added javadoc to JavascriptExecutor executeAsyncScript
   about the default timeout. Also added some extra information on
   troubleshooting common issues.
 * FIXED: 7014: Fixed parameters parsing.
 * FIXED: 7033: Fixed javadoc.

WebDriverJS:
 * FIXED: 7105: Properly bind "this" for beforeEach/it/afterEach in
   mocha integration.

Grid:
 * Modified to ignore exceptions during the clean-up process if failing
   to start a RemoteWebDriver instance.
 * FIXED: 6770: Setting a timeout when Jetty has low resources to
   prevent hub from hanging.
 * FIXED: 6771: If a session times out and the browser was never
   started, it should still be cleaned up on the hub side.
   BeforeRelease should then be a no-op and not throw.
 * FIXED: 6772: Added a configuration parameter to set the number of
   threads Jetty uses. Default is -1, which implements the current
   behavior (255 threads from Jetty's default settings)
 * FIXED 6773: Consuming the request in all cases to properly release
   resources.
 * FIXED: 6811: Clean up immediately if starting a driver or session
   errors in RemoteWebDriver.
 * FIXED: 6878: Actually pass the response body to CommandListener
   implementations, per the interface contract.
 * FIXED: 7047: Updated a grid timeout property that seems to have been
   overlooked in a previous cleanup.

RC:
 * Added lost quotes in JSON format (RC).
 * Removed old version of Selenium RC emulation and leaving the new one
   in place.

v2.40.0
=======
WebDriver:
 * Update to support native events for Firefox 27 (removed native event
   support for Firefox 25).
 * Removed the iPhone driver. Also leaving the atoms available, so that
   appium and iosdriver can use them.
 * Deleted the client side of the AndroidDriver. Note that the atoms
   are still left in place so that Selendroid can still be compiled.
 * Make the RemoteWebDriver implement TakesScreenshot. There's only one
   driver that doesn't implement the interface (the HtmUnitDriver) and
   this is the most common cause for using the Augmenter, which isn't
   very discoverable.
 * Imported PhantomJSDriver 1.1.0, removing 1.0.4 (previous version).
 * Implemented augmentation of previously augmented instances
 * Fixed JdkAugmenter's inability to add interfaces that are already implemented
 * Removed org.openqa.selenium.net.INetAddress, an unnecessary abstraction
   around java.net.InetAddress.
 * (on behalf of Tobias Lidskog) Add ability to send --silent flag to
   chromedriver.
   when building an inverted predicate.
 * Implemented part of advanced user interactions using injected atoms
 * Fixed HtmlUnitDriver to handle timeout exception on refresh.
 * Implemented page load timeouts in Firefox without stopping page
   loading.
 * Implemented pageLoadingStrategy capability in Firefox.
 * Migrated the WebDriverBackedSelenium to
   com.thoughtworks.selenium.webdriven. This also leaves behind a
   deprecated implementation of each of the key interfaces to ease
   migration for users.
 * Implemented proper error code for the case of invalid css selector
   empty class name, and compound class name in atoms.
 * Implemented alert and confirmation handling in WDBS (Java)
 * Throw a more descriptive error when typing in certain types of input
   elements in Chrome. Starting with Chrome 33, certain types of input
   elements do not support the selection API (in fact, they throw when
   you try to access the property). This prevents us from fully
   simulating typing in the atoms.
 * FIXED: 2397: (on behalf of TommyBeadle) Fixed exception handling
 * FIXED: 3991: Add Keys.chord(Iterable<CharSequence>) as a utility
   method.
 * FIXED: 4606: Stop web page loading after timeout.
 * FIXED: 4843: (on behalf of Jonatan Kronqvist) Keys.META is now
   regarded as modifier key in SingleKeyAction. Keys.META, Keys.COMMAND,
   Keys.LEFT_ALT, Keys.LEFT_CONTROL and Keys.LEFT_SHIFT are now also
   regarded as modifier keys in SingleKeyAction (because of their
   aliases).
 * FIXED: 5397: Disabled validation of cookies loaded from the browser.
   If the browser could parse the cookie we are to be able to provide
   this information to the user even if the cookie is inalid.
 * FIXED: 5859: Implemented keyDownNative, keyUpNative and
   keyPressNative in WDBS. These commands are implemented via Actions.
 * FIXED: 6512: When the host is unknown, make the HtmlUnitDriver
   return an error page.
 * FIXED: 6657: Make the LoggingPreferences implement Serializable.
 * FIXED: 6681: Preventing augmentation of subclasses of RemoteWebDriver. Fixes
 * FIXED: 6830: (on behalf of GeorgeKlinich) Urlencoding result
   returned by server implementation of WebDriverBackedSelenium.
 * FIXED: 6834: Creating sesion cookie if expiry is not set. Fixes issue 6834
 * FIXED: 6947: Script timeout should get reset even when async
   callback is called synchronously.

WebDriverJS:
 * For consistency with Closure's new promise API, use thenCatch()
   and thenFinally() instead of addCallback(), addErrback(), et al.
 * ResultType.EXCEPTION and ResultType.ERROR are handled the exact same way,
   so remove one of them and simplify some code.
 * Treat promise.fulfill/reject as no-ops instead of throwing if the
   promise has already been resolved.
 * Added some utility functions to simplify working with arrays of
   promises.
 * FIXED: 6826: Add support for custom locators in webdriverjs.

Grid:
 * FIXED: 4589: Restrict the host where grid hub is listening if -host
   option is specified.
 * FIXED: 6445: Shorten string representation of capabilities in the
   hub log and grid console.

RC:
 * Deprecated browser launchers for dead versions of firefox.

v2.39.0
=======
WebDriver:
 * Update to support native events for Firefox 26.
 * Removed server side of iPhone driver.
 * Removed server-side of AndroidDriver and deprecating client side.

WebDriverJS:
 * FIXED: 6686: Changed Deferred#cancel() to silently no-op if the
   deferred has already been resolved.

v2.38.0
=======
WebDriver:
  * Update to support native events for Firefox 25.
  * Updated httpclient and httpcore maven dependencies
  * When moving the mouse relative to an element hidden in a parent's
    overflow region, that element must first be scrolled into view
    before the mouse move can be completed.
  * Removed WindowsProxyManager from InternetExplorerDriver, proxy
    management is implemented in IEDriverServer now.
  * The logging level for the FirefoxDriver's native components can now
    be set from the command line with the SELENIUM_LOG_LEVEL
    environment variable. Valid values are ERROR, WARN, INFO, DEBUG,
    and TRACE. If the value is not set, or an unrecognized value is
    specified, the log level will be set to FATAL (which was the
    previous behavior).
  * Implemented ability to return Date object from executeScript
    (Firefox only).
  * Fixed Firefox returning the actual state of nativeEvents.
  * Made it possible to switch the webdriver.xpi from the command line
    using a system property.
  * Removed hardcoded chromedriver version
  * SafariDriver WebElement#getTagName() should return a lowercase
    string.
  * If ChromeDriver fails to start, suppress any exceptions from the
    subsequent "clean-up" quit() so the error from start is not lost.
  * Added an alternate, and Android-friendly, implementation of the
    Augmenter that uses JDK interface proxies instead of cglib. This
    new implementation is available as org.openqa.remote.JdkAugmenter;
    the default Augmenter implementation still relies on cglib.
  * Prevented an infinite loop when computing overflow state when the
    documentElement has fixed position.
  * Improveed logging for UnixProcess#destroy().
  * If an error is thrown while typing a key sequence, return that
    error to the client. Prior to this change, the driver would
    effectively hang.
  * Do not attempt to generate a key event if the target element is no
    longer attached to the DOM. nsIPressShell (which is used to
    dispatch events) will throw a generic NS_UNEXPECTED_ERROR if we
    fail to make this check.
  * FIXED: 3107: (On behalf of Ross Patterson) Preventing possible NPE.
  * FIXED: 4501: (On behalf of Robert Ambrus) Introduced a system
    property org.openqa.jetty.SocketListener.bufferSize that allows to
    set the size of the buffer Jetty uses for network communications.
  * FIXED: 4698: Added missing expected conditions.
  * FIXED: 5295: User defined element properties should be retrievable
    with getAttribute.
  * FIXED: 5900: Revamped the SafariDriver's internal networking.
  * FIXED: 6294: Implemented ability to switch to a frame by id or name
    in WDBS.
  * FIXED: 6358: Disabled Content Security Policy in Firefox.
  * FIXED: 6414: Fixed the way EventFiringWebDriver unwraps the
    underlying driver.
  * FIXED: 6431: Catch an exception thrown if the chrome executable is
    not found and stop chromedriver before propagating it.
  * FIXED: 6445: Shortened Firefox profile textual representation in
    capabilities.
  * FIXED: 6473: Implemented ability to pass --verbose option to
    chromedriver.

WebDriver JS:
  * Always annotate errors for rejected promises
  * FIXED: 6284: Omit x/y offsets from the mouseMove command instead of
    defaulting to (0,0).
  * FIXED: 6471: Correctly document the contract on
    WebElement#getAttribute
  * FIXED: 6612: On Unix, use the default IANA ephemeral port range if
    unable to retrieve the current system's range.
  * FIXED: 6617: Checking for Error.captureStackTrace is sufficient to
    determine if an environment supports stack traces. This avoids
    unnecessarily triggering debuggers configured to halt when an error
    is thrown.
  * FIXED: 6627: Safely rebuild chrome.Options from a partial JSON spec.

Grid:
  * FIXED: 6357: Added PhantomJS icon to the grid console.
  * FIXED: 6392: Removed misleading log messages.

RC:
  * FIXED: 1666: Fixed typo in RegExp.test function name.
  * FIXED: 1758: Ignoring closed windows when collecting attributes
    from all windows (RC).
  * FIXED: 2508: Fixed screenshot size calculation for quirks mode (RC)
  * FIXED: 2845: Moved storedVars from test case level to test suite
    level.
  * FIXED: 3185: Fixed JSON converter (RC).
  * FIXED: 3270: Fixed switch to window by var= locator (RC).
  * FIXED: 5103: Fixed screenshooter in Firefox and Selenium RC,
    limiting the size of the screenshot to pevent failures.
  * FIXED: 6496: Enabled .htm and .xhtml extensions for test suites.

v2.37.0
=======
  * Fix Firefox native event support on Linux for 23 & 24.

v2.36.0
=======
WebDriver:
  * Updated Firefox native event components to support Firefox 24.
  * Updated HtmlUnit to 2.13.
  * Updated HttpClient to 4.3.
  * Updated version of Guava to 15.
  * Updated version of wgxpath.
  * Return an empty string instead of "null" when the browserName and
    version capabilities are not set.
  * Stop propagation of the webdriver-evaluate custom event when
    executing user supplied JavaScript. Without this change, the event
    handler will trigger twice for async scripts, causing the driver to
    attempt to evaluate the user script twice, leading to unpredictable
    behavior.
  * Added a new pause action to the interactions API.
  * Improved support for using the HTML5 APIs through the remote
    server by augmenting the session driver before attempting to
    access HTML5 capabilities.  If the driver does not support the
    requested feature, throw an UnsupportedCommandException instead of
    a ClassCastException.
  * Implemented elementScrollBehavior capability in FirefoxDriver.
  * Fixed getLocation to work on scrolled pages.
  * Fixed autoscrolling for elements located in frames.
  * Fixed drag-n-drop for elements in frames in Firefox with native
    events
  * Implemented SOCKS proxy support for FirefoxDriver
  * Fixed support for SVG documents in the atoms.
  * Fixed computing an element's container dimensions to account for
    the scrollbar size when scrolling
  * FIXED: 2670: Made subclasses of By serializable.
  * FIXED: 6200: Pass command line arguments to the Selenium server
    instead of to the JVM.
  * FIXED: 6293: Added more informative error message.
  * FIXED: 6346: Allow args to passed to the JVM using the jvmArgs
    option.

Grid:
  * Added ability to fetch slotCounts from /grid/api/hub. The resource
    looks like this:

        { "slotCounts": { "total": 20, "free": 8 } }

  * Added ability to fetch newSessionRequestCount from the
    /grid/api/hub resource.


v2.35.0
=======
WebDriver:
  * Updated Firefox native event components to support Firefox 23.
  * Removing deprecated interactions interfaces (Keyboard, Mouse,
    TouchScreen).
  * Updated operadriver to 1.4.
  * Introduced ie.setProxyByServer capability to select how IE browser
    proxy will be set up, either by old Java code using Windows
    registry or inside IEDriverServer using WinINet methods. This
    capability is marked as deprecated and will be removed in future
    versions. In the future, IE proxy settings will be set up only by
    IEDriverServer. Current default value of ie.setProxyByServer is
    false so Windows registry will be used for IE proxy setup.
  * Guarded around IE returning an empty object for the active element.
  * FIXED: 6055: Fixing "invalid xpath" issue, actually invalid NS
    resolver.

WebDriver JS:
  * FIXED: 6079: The parent process should not wait for spawned driver
    service processes (chromedriver, phantomjs, etc.)

v2.34.0
=======

WebDriver:
  * Updated Firefox native event components to support Firefox 22.
  * Update synthesized mouse implementation. Mouse moves are
    implemented using nsIDOMWindowUtils.
  * Finding libX11.so.6 in a slightly more intelligent way: Check that
    dlopen actually succeeds, if not found in one of the fixed paths,
    look in the LD_LIBRARY_PATH.
  * Added ExpectedConditions to check for the visibility of all
    WebElements in a List
  * Updated the wgxpath library.
  * Updated our copy of the Closure compiler and library to the most
    recent versions.
  * Updated the atoms library, including support for MS pointer events
    and refinements to element visibility tests.
  * Close all open connections when stopping the SafariDriver server.
  * Fall back to a loopback address if the current machine does not
    have an external IP address (as will be the case when there is no
    internet connection).
  * Remove sizzle dependency from the firefox driver. We only needed
    this for versions of firefox prior to 3.5, which we no longer
    support.
  * Fixed Select.escapeQuotes method.
  * Added SafariOptions and support for custom Safari extensions.
  * Moved Mouse, Keyboard and TouchScreen to the interactions package
    where they belong. This has the benefit of also making our build
    files simpler once we delete the original versions which have been
    deprecated.
  * Deprecated the HasTouchScreen interface.
  * Fixed condition in Select.select_by_index method to fix case when
    selection is performed by index on a multiple select element.
  * Implemented an alpha version of a Marionette (WebDriver implemented
    natively in Firefox) driver.
  * Deprecated IPhoneDriver.
  * Added support for the HTML5 "hidden" attribute. If an element, or
    ancestor, has hidden attribute make, it is not shown.
  * FIXED: 2285: Allow setting default logLevel for standalone-server.
  * FIXED: 5609: Adding the ability to redirect firefox process output
    to file.
  * FIXED: 5669: Add Driver#remote_status for the Ruby remote driver.
  * FIXED: 5715: Adding toString method for the event firing
    webelement.

WebDriver JS:
  * When capturing console output, guard against user scripts that
    redefine the console global.
  * Improved logging in the test client.
  * Use goog.labs.testing.assertThat for the assertThat library.
  * Improved stack trace handling
  * Defined a webdriver.Capabilities class for webdriverjs.
  * Added native ChromeDriver support to WebDriverJs.
  * Mark discarded tasks as cancelled to prevent hanging on
    asynchronously scheduled callbacks.
  * Include the webdriverjs tests in the built npm package. Updated
    the README with instructions for running the tests using npm.
  * Add native PhantomJS support to webdriverjs.

Grid:
  * Update grid for change in behavior of WebDriver's new session
    command.
  * Fixed handling of JSON conversion errors at node.
  * FIXED: 5942: Fix hang of hub when node machine is not available.

RC:
  * Fixed RC tests failing in Firefox beta builds. This has been fixed
    in two ways:

    * Rely on the automation atoms where possible.
    * Obtain the document and window from the element the event is
      firing from.

    In the course of fixing this, all but one usage of "triggerEvent"
    was replaced. Because of this, the method has been inlined to the last
    call site.
  * FIXED: 1646: UTF-8 encoded user-extensions.js support.


v2.33.0
=======

WebDriver:
  * getText() ignores elements in the <head>
  * Bundled OperaDriver version bumped to 1.3.
  * Added a FindAll annotation for the PageFactory to use.
  * Added a toString() implementation to Color.
  * Deleted the Selenium-backed WebDriver.
  * FIXED: 2218: IE >=9 versions triggerMouseEvent like other
    browsers.
  * FIXED: 2610: Implementing ability to specify path to the chrome
    executable in the node configuration file using chrome_binary
    capability.
  * FIXED: 2685: Increasing port range for Firefox to chose from when
    starting.
  * FIXED: 4790: Improvements made to Firefox startup in highly
    concurrent environments.
  * FIXED: 5045: Added support for fetching logs from SafariDriver.
  * FIXED: 5652: Adding unhandled alert text to the exception message.
  * Added LogType.PERFORMANCE, supported in chromedriver2 0.9+.

WebDriver JS:
  * FIXED: 5511: Implement
    driver.manage().timeouts().pageLoadTimeout(ms) for WebDriverJs.
  * FIXED: 5632: It's now possible to create a new session with
    WebDriverJs when running in a browser.
  * Add a WebDriverJs client to the SafariDriver's logging window so
    it's possible to use WebDriver from the devtools REPL on that
    page.

Grid:

  * Making "beta" console the default one, it's time to get out of
    beta status
  * Old console is now available at /grid/old/console/
  * Addressed memory leaks caused by per-session logging.
  * FIXED: 3001: Making Selenium the default protocol if a node was
    started with "-role rc" option.

RC:
  * FIXED: 3636: selenium.fireEvent works with the webdriver-backed
     selenium and IE.

v2.32.0
=======

WebDriver:
  This release supports Firefox verions: 10esr, 17esr, 19, 20

  * Let WindowsUtils.killPID() kill the whole process tree
  * Implementing support for implicit "submit" button type in
    HtmlUnitDriver.
  * bug fix for python hang with 302 response
  * Adding better support for SVG within Firefox. Has better scrolling
    to element and allows JavaScript execution
  * Fixing case of "no active element" for HtmlUnitDriver
  * WindowsUtils.kill() fix on Windows 8
  * Updating HtmlUnit to 2.12 (and cssparser to 0.9.9)
  * Fixing illegal negative timeout values for HtmlUnitDriver, zero
    means infinite wait
  * Implementing pageLoadTimeout in HtmlUnitDriver
  * Allow users to specify a custom location for Safari's data
    directory using the "safari.dataDir" capability.
  * Fix for using DesiredCapabilities with WebDriverBackedSelenium
  * PhantomJS Driver bindings updated to 1.0.3
  * Minimize the number of third party libraries used by the very
    heart of the remote webdriver server.
  * fix issue where server was appending '?null' to all forwarded
    requests
  * Issues fixed: 5293, 4902, 5283, 5278

v2.31.0
=======
  (summary not created, check version history logs)

v2.30.0
=======

WebDriver:
  * Fixing a bug introduced by a change in how we get already logged
    messages from the console service in firefox. This allows us to
    function with firefox 19
  * FIXED: 1181: Improved loopback detection
  * FIXED: 1627: Implementing ability to use auto proxy in
    HtmlUnitDriver.
  * FIXED: 3652: moveToElement with offset should consider 0 as a
    valid value, not as "undefined".
  * FIXED: 3868: Better ephemeral port range selection.
  * FIXED: 4107: Added prebuilt version of the SafariDriver extension
    to the client jar.
  * FIXED: 4821: WebDriverBackedSelenium works when added to project
    via maven.
  * FIXED: 4940, 5075: Added iceweasel to list of firefox variants.
  * FIXED: 5022: Text node with overflow:hidden and height/width 0 to
    not be visible since we cant see them.
  * FIXED: 5030: Only send files to upload, not directories.
  * FIXED: 5079: FluentWait.until(Predicate) method does not propagate
    predicate message.
  * FIXED: 5109: We should show elements visible if there is a pixel
    visible.
  * Semi-private change: Changes in the Coordinate class.

JS:
  * Update WebDriverJS to support parallel flows.  This change renames
   several low-level classes and functions in the promise module:

      promise.Application                                 -> promise.ControlFlow
        #schedule(string, function)                       ->   #execute(function, [string])
        #scheduleTimeout(string, number)                  ->   #timeout(number, [string])
        #scheduleWait(string, function, number, [string]) ->   #wait(function, number, [string])

    The old schedule* functions are still present, but will print a
    warning message if called. They will be removed in 2.31.

RC:
  * Added ability to use relative path to an -htmlSuite file.
  * FIXED: 3498: Proxy based browsers are back to normal on HTTPS
  * FIXED: 5113: Implementing GET requests support for RC protocol.


v2.29.0
=======

WebDriver:
  * Firefox 18 support.
  * IEDriver supports "requireWindowFocus" desired capability. When
    using this and native events, the IE driver will demand focus and
    user interactions will use SendInput() for simulating user
    interactions. Note that this will mean you MUST NOT use the
    machine running IE for anything else as the tests are running.
  * Use the "webdriver.remote.shorten_log_messages" system property to
    reduce the verboseness of ouput from executeScript and
    executeAsyncScript when using the RemoteWebDriver.
  * Switching HtmlUnitDriver default from FIREFOX_3_6 to FIREFOX_10
  * SafariDriverExtension should restore Safari's previous settings on
    shutdown.
  * Bundled version of PhantomJSDriver bumped to 1.0.1
  * Updated the version of guava-libraries used to 14.
  * Updated HtmlUnit to 2.11
  * Deprecated XPathLookupException in favour of
    InvalidSelectorException
  * FIXED: 3602: Changing IE view port calculations to allow for
    always-present vertical scroll bar, and to test for horizontal
    scroll bar and adjust as required by page content.
  * FIXED: 4576: self registering proxy now check for user specified
    proxy id.
  * FIXED: 5010: icons in chrome newtab now correctly identified as
    being shown.

RC:
  * FIXED: 4818: Make sure that each generated SSL cert has a unique
    ID associated with it.

Project:
  * Moved to git. Most obvious in revision number in our exceptions.


v2.28.0
=======

WebDriver:
  * "null" can now be passed to executeScript
  * .Net: Corrected FileUtilities.FindFile() to correctly return the
    current directory if the specified file is located there.
  * .Net: Introduces the Updating the CustomFinderType property to the
    .NET FindsByAttribute. This allows use of custom By subclasses in
    the PageFactory. The custom finder must be a subclass of By, and
    it must expose a public constructor that takes a string argument.
  * SafariDriver: better attempts to catch native dialogs from user
    defined onbeforeunload handlers.
  * Updating HtmlUnit to 2.11
  * Added the PhantomJS bindings to the release. You'll still need to
    download PhantomJS itself separately.

RC:
  * Implemented getAllWindowNames in WebDriverBackedSelenium
  * Implemented openWindow in WebDriverBackedSelenium to allow opening
    relative URLs


v2.27.0
=======

WebDriver:
  * Added support for native events for Firefox 17.
  * Added support for ghostdriver (PhantomJS)
  * Adding new capability "enableElementCacheCleanup" to the IE
    driver. When set to true, the IE driver will clean the
    known-element cache of invalid elements after every page
    load. This is intended to keep memory usage down and improve
    performance. However, it is an intrusive change, so this
    capability is provided temporarily to allow disabling this
    behavior if problems arise. The default of this new capability is
    "true", meaning this behavior is turned on by default.
  * Added shift key handling to the synthetic keyboard actions.
  * Modifying scroll behavior in IE driver SendKeysCommandHandler to
    call Element::GetLocationOnceScrolledIntoView() instead of calling
    the DOM scrollIntoView() function. Should result in less page
    scrolling during test runs.
  * Checking if CSS transforms on elements, or their parents, are
    hiding them and therefore returning they arent visible.
  * Add not, refreshed, invisibilityOfElementWithText to
    ExpectedConditions.
  * Added support for new IE10 pointer events.
  * FIXED: 1543: Allowing equal sign in a cookie value.
  * FIXED: 2103, 3508: Modified to no longer hang on alerts triggered
    by onchange of <select> elements or by onsubmit of <form>
    elements.
  * FIXED: 2035: Returning a simple result (null) after opening a new
    window instead of the window object (that can't be serialized to
    JSON).
  * FIXED: 2353: Only call blur() for IE if the element is not the
    <body> element.
  * FIXED: 3043: Better error message reporting when browser launch
    fails.
  * FIXED: 4490: Checking script evaluation result to prevent null
    reference exception.
  * FIXED: 4736: Added all of the extended colour keywords to the
    Colors enum in support of
    http://www.w3.org/wiki/CSS3/Color/Extended_color_keywords.
  * FIXED: 4800: Fixed calculation of coordinates for elements in
    frames/iframes where the element is scrolled out of view within
    the frame.

Grid:
  * FIXED: 3818: Generating session identifiers with UUID to prevent duplication.

RC:
  * FIXED: 4668: Fixing ability to open relative URLs in WDBS.
  * FIXED: 4273: Added getCssCount to the list of the methods
    supported by WebDriverBackedSelenium.
  * FIXED: 4055: WDBS implementation of getValue for radio buttons now
    reflects behaviour of RC.
  * FIXED: 4784: Processing locators before use in getCssCount and
    getXpathCount.


v2.26.0
=======
WebDriver:
  * Updated OperaDriver to 0.15.
  * Added transparency support to the Color class.
  * Increased lock time a bit for the FirefoxDriver to make tests more
    stable on Windows.
  * Added the enablePersistenHover capability to allow the user to specify
    whether to use the persistent hover thread in the IE driver. Defaults
    to true for IE.
  * Added support for native events for Firefox 15 and 16.
  * Removed deprecation from ChromeDriver constructors that take a Capabilities
    object. Also added a method to set experimental options in ChromeOptions
    which may be used to set options that aren't exposed through the ChromeOptions
    API.
  * Fixed SafariDriver to allow calling .quit() consecutively without error.
  * Modified FirefoxDriver to use atoms to switch between frames.
  * FIXED: 4535: Hover still does not work perfectly in IE.
  * FIXED: 4676: Unable to fire javascript events into SVG's.
  * FIXED: 4320: Impossible to IE run tests in parallel via TestNG.
  * FIXED: 4309: 'Could not convert Native argument arg 0' error with Firefox.
  * FIXED: 4593: Alert.accept() Cancels the Resend Alert/Dialog Box.
  * FIXED: 4321: Upgrade HtmlUnitDriver to HtmlUnit 2.10.
  * FIXED: 4639: Webdriver 2.25 fails to quit on Windows.
  * FIXED: 3774: New SafariDriver sessions do not come with a clean profile.
  * FIXED: 4375: Executing javascript hangs Firefox.
  * FIXED: 4203: Java SafariDriver has limited websocket frame size.
  * FIXED: 4165: WebDriver fails on a machine with no IP address.
  * FIXED: 3969: SafariDriver should auto-dismiss alerts.

WebDriverJS:
  * FIXED: 4648: findElement errros not helpful.
  * FIXED: 4687: webserverjs cannot find module in node.js.
  * FIXED: 4649: Wrong Content-Length calculation in webdriverjs.
  * FIXED: 4425: Webdriver.js regression: webdriver.By.* selectors defect when
    using Node.js.

Grid:
  * FIXED: 4433: NPE at grid launch if invalid servlet class name is specified.
  * FIXED: 4526: elenium node stop responding when there are 2 or more tests
    waiting for a specific node.
  * FIXED: 2549: "-role hub" doesn't allow Firefox to starts.

v2.25.0
=======
WebDriver:
  * Added API for dealing with BASIC and DIGEST authentication
    dialogs. Currently not implemented in any drivers.
  * Warn users that the IE driver will no longer use the DLL in the
    next release.
  * Deprecated browser specific WebElement subclasses.
  * Added support for "requiredCapabilities" to the remote webdrivers
    and implemented basic support for these in the firefox
    driver. Failure to fulfull a required capability will cause a
    SessionNotCreatedException to be thrown.
  * Added the ability to determine how unhandled alerts should be
    handled. This is handled by the "unexpectedAlertBehaviour"
    capability, which can be one of "accept", "dismiss" or
    "ignore". Java code should use the UnexpectedAlertBehaviour
    enum. This is only implemented in Firefox for now.
  * Allow native events to be configured in Firefox and
    (experimentally) in IE using the "nativeEvents" capability.
  * Updated supported versions of Firefox to 17.
  * Firefox driver will enumerate through client rects until finding
    one with non-zero dimensions when clicking.
  * Better support for hovering on linux.
  * Safari driver will dismiss open alerts to prevent tests from
    hanging.
  * Better handling of overflow edge cases when determining element
    visibility.
  * Point users in the right direction when Safari fails to load a
    file:// URL.
  * Allowed to use IEDriverServer logging abilities in Java binding.
  * Avoid an issue where a call to submit could hang the firefox
    driver.
  * FluentWait will now handle any Throwable, not just
    RuntimeExceptions.
  * FIXED: 3897: Allow windows to be resized from a frame.

WebDriverJS:
  * Better stack traces from test code.
  * Update webdriver.atoms.element.type to recognize
    webdriver.Key.SEPARATOR

RC:
  * Better emulation provided by the WebDriver-backed Selenium when
    using IE, particularly when emulating firing of events.

Grid:
  * FIXED: 3230: Implementing /lifecycle-manager?action=shutdown
    command for the Grid Hub to ensure backward compatibility with
    Grid1 behaviour.

Selenium Server:
  * Reworked SSL certificate generation code when proxying HTTPS
    connections to use non-deprecated APIs in BouncyCastle.

v2.24.1
=======
WebDriver:
  * Work has started on a basic performance profiler.
  * Java bindings: The Color class now supports more color conversions.
  * Failure to click on an element in the IE Driver will yield a more meaningful
    error.
  * FIXED: 3268: setting a cookie without one of the optional values (secure)
    null pointers through remote webdriver
  * FIXED: 1584: bot.dom.getVisibleText does not properly handle display:run-in
    or display:table.
  * FIXED: 4071: IE: JVM/IEDriverServer Crash when the current window is closed
    without switching to another window.
  * FIXED: 3683: WebDriver (selenium server) does not use user specified proxy PAC file for IE.
  * FIXED: 4070: Dot-net bindings: == oprerator fails if first argument is null.
  * FIXED: 4064: Selenium2 crash on IE8 when S_FALSE is returned from get_Document.
  * FIXED: 3945: The SafariDriver hangs if an iframe is deleted while it is selected.
  * FIXED: 3892: WebdriverJS: Need support mouse events
  * FIXED: 3198: Cannot take screenshot from IPhoneDriver in Java

v2.23.1
=======

Selenium RC:
  * Support for Firefox 13 on windows with RC api

v2.23.0
=======

WebDriver:
  * Firefox 13 support
  * CSS Selectors now allow compound selectors
  * SafariDriver is (still) in Beta, annotated accordingly in Java
  * FIXED: 3785: Implicit waits for Safari driver
  * FIXED: 1225: Get text is handled appropriately for self-closing tags.

v2.22.0
=======

Project:
  * Code grant from Google acknowledged in our copyright
    headers. Thanks, Google!

WebDriver:
  * JRE dependency upped to Java 6.
  * IE driver now uses the IEDriverServer. You may need to download
    this. Set the "useLegacyInternalServer" to boolean true if you
    need the old behaviour.
  * Standardized colour values returned from getCssValue are
    normalized to RGBA.
  * IE can use synthesized events if the capability
    "enableNativeEvents" is set to false. This is experimental and not
    expected to work properly.
  * Native events added for Firefox 12.
  * Native events retained for Firefox 10, 11, and 3.x
  * Selenium-backed WebDriver can now return WebElements from
    executeScript.
  * With WebElement.getAttribute() a boolean attribute will return
    "null" if not present on an element.
  * A NoSuchWindowException will be thrown if the currently selected
    window is closed and another command is sent.
  * SafariDriver improved: frame switching, snapshot taking and JS
    executing added.
  * SafariDriver: changed message protocol. The 2.22.0 SafariDriver will
    not be backwards compatible with Selenium 2.21.
  * FIXED: 185: Appending screenshots to remote exceptions is now
    optional. Controlled via the "webdriver.remote.quietExceptions"
    capability.
  * FIXED: 1089: Style attributes are no longer lower-cased by default.
  * FIXED: 1934: Firefox cleans up temporary directories more effectively.
  * FIXED: 3647: WebElement.sendKeys now works in Firefox on XHTML pages.
  * FIXED: 3758: Maximize windows from inside a frame works as expected.
  * FIXED: 3825: Alerts from a nested iframe are now handled properly.

Grid:

  * Fixing Firefox profile extraction if a grid node started from a
    network location (UNC path)

Atoms:
  * bot.actions.type now works as expected in Firefox 12.
  * Introduced better mouse and keyboard abstractions


v2.21.0
=======

WebDriver:
  * Safaridriver has now been added !
  * Issue 3489, maximize the browser window
  * Significant stability improvements in firefoxdriver.
  * Issue 3357 log-path for chromedriver
  * IE driver issue 3360
  * Android driver issue 3504
  * Firefox issue 3559, max-connections-per-server
  * Issue 3520
  * Issue 2826
  * Native events support for Firefox 11
  * Dropped native events support for Firefoxes 4-9

Grid:
  * Significant changes in the timeout strategy0 between hub, nodes and browser.
    See http://code.google.com/p/selenium/wiki/Grid2 section on timeouts.
    Compatibility note: It is recommended to at least update the nodes
    to 2.21. Upgrading only the hub will effectively disable the
    browser-death timeout and is *not* recommended.
  * Improved error messages on console
  * Content length issue solved, Issue 2362
  * Issues 3328,3366
  * Improvements in thread dumps in both hub and node,
    possible to corrolate the two.
  * Added hub api to query parameters

Server:
  * -browserTimeout <timeoutInSeconds> added to
    differentiate between browser hang and client gone (which is
    -timeout <timeout>)
    - System property -Dselenium.server.timeout removed, use -timeout instead.
    See http://code.google.com/p/selenium/wiki/RemoteWebDriverServer
    for further details.
    * Issue 3577


v2.20.0
=======

WebDriver:
  * RemoteWebDriver.setLogLevel is no longer a static method.
  * Introduce a timeout for page loads. This needs to be used in
    conjunction with the unstable page load detection.
  * Adding alertIsPresent ExpectedCondition.
  * Turning off password saving in the Android driver.
  * FIXED: 3391: scroll containing elements, not just windows.
  * FIXED: 2211: Allow the http client factory to discover the proxy
    for traffic between the http command executor and the webdriver
    server via the normal system properties.

WebDriverJS:
  * Refactored the WebDriverJs promise manager to use a proper tree to
    track scheduled tasks.
  * In webdriver.Builder, default to http://localhost:4444/wd/hub if a
    server URL is not specified.

Grid:
  * JDK 1.6.1_31 recommended for maximum stability
  * The HUB is now upgraded to run with Jetty 7.6.1.
  * Making the id for proxy final, and allowing it to be specified
    from the registration request. If the id isn't in the request, the
    remote host is used as an id, as it was before.
  * FIXED: 3096: Memory leak in selenium hub.

RC:
  * More work on SSL certs. Should work cleanly in Firefox now.
  * FIXED: 1982: Clear an input element in such a way as to avoid
    firing any events when emulating typing in selenium
    emulation. Fixes issue 1982.

Atoms:
  * Submit a form when the enter button is pressed in its input
    element.
  * Add a "mouse pixel scroll" event to the atoms events module.
  * Adding a public "mouseOver" action and a little internal
    refactoring around the mouseOver functionality.


v2.19.0
=======

WebDriver:
  * Server-side implementation of the webdriver-backed selenium.
  * "sendKeys" works in the webdriver-backed selenium when using
    safari.
  * Implement local/session storage for iOS driver.
  * Exceptions now thrown when an alert occurs during script
    execution.
  * Native events implemented for Firefox 10.
  * Renamed the experimental "fast" page loaded strategy "unstable"
    and disable queuing of commands when it's enabled.
  * Corrections to javadocs.
  * Disabled native events for Firefox 8 as it's deprecated by
    Mozilla.

RC:
  * Update cybervillains certificate (thanks to Ivan De Marino and
    Mark Watson @ Neustar)
  * Default to using the native xpath engine in selenium-backed
    webdriver instances.
  * Correctly fire events when outside a firefox extension

WebDriverJS:
  * Return a promise from webdriver.WebDriver.prototype.quit() so
    users may register callbacks.
  * Small tweaks so WebDriverJs works as expected in IE7/8.

Known Issues:
  * Holding down a modifier key and clicking with Firefox 10 on
    Windows does not work reliably when using native events.


v2.18.0
========

WebDriver:
  * FIXED: 3169: Getting value attribute on option elements.
  * Alert handling in Firefox and IE: Throwing UnhandledAlertException
    if an alert is present during an operation. The unhandled alert is
    also dismissed to mitigate repeat exceptions.
  * Better handling of getText invocations on SVG elements.
  * FIXED: 3253: Clicking stopped working on Firefox 4.
  * Android Driver now supports Flash, Geolocation.
  * FIXED: 1371: iPhone Driver now supports frame switching.

RC:
  * FIXED: 2958: Selenium RC now closes IE HTA when the tests finish.

WebDriverJs:
  * Fixes around findElements.

v2.17.0
========

WebDriver:
  * Removed deprecated methods
  * FIXED: 3152: iWebDriver will auto-play HTML5 video
  * Fixed issue with permissions on windows caused by wrapping
  * FIXED: 3154, 3144: Issues launching Firefox 9 due to modal dialog
  * Adding warning to android apk when used with an incompatible
    android version (issue 3142)
  * FIXED: 3167: Sending empty keys to a text field no longer throws
  * FIXED: 3173: Using ChromeOptions no longer causes stack exhaustion
  * FIXED: 3169: getAttribute("value") falls back to the text of
    option tags, if no value attribute is specified
  * Updated operadriver to version 0.9

Maven:

  * NOTE: We have removed our dependency on the operadriver from our
    pom, because it creates a circular dependency.  To use the
    operadriver, add the following dependency to your own pom.xml
    file:

    <dependency>
      <groupId>com.opera</groupId>
      <artifactId>operadriver</artifactId>
      <version>0.9</version>
    </dependency>

RC:
  * Bumped firefox support up to Firefox 12

Grid:
  * FIXED: 3161: Thread safety issues

Known issues:
  * Some issues around scrolling (3075, 3045, 3034)

v2.16.1
=======

RC:
  * FIXED: 3148: Allow IE to be launched.

v2.16.0
=======

WebDriver:
  * Native events enabled for Firefox 9
  * The FirefoxDriver now enables apps to use offline storage by
    default.
  * ChromeDriver allows setting the chrome driver's environment more
    easily.
  * RemoteWebElement implementations now guarantee that the ID used to
    identify them. This allows "hashCode" and "equals" to be local
    operations in Java.
  * The PageFactory will now no longer decorate List<WebElement>
    fields unless annotated with a @FindBy.
  * By default, clicks will now be in the middle of elements.
  * RemoteWebDriver will use uncacheable GET requests to communicate
    with the remote webdriver server.
  * HtmlUnitDriver defaults to emulating Firefox 3.6.
  * FIXED: 2985: Calling quit() on the IE Driver in a shutdown hook
    will no longer kill the JVM.
  * FIXED: 2893: You can now pass a Map to executeScript when using
    Firefox.
  * FIXED: 1395, 2747, 2869, 2431: Upgraded version of CocoaHTTPServer
    to the latest and greatest.

WebDriverJS:
  * Test failures are now annotated with the task history.
  * JSONP support dropped in favour of CORS. For those browsers where
    CORS is not fully implemented, added a "/xdrpc" (cross-domain rpc)
    end-point.
  * Change the promise.Application event loop to run at a set interval
    instead of trying to explicitly trigger it at the appropriate
    times. This makes debugging much simpler.
  * WebDriverJS hub front-end now renders correctly in IE.

Grid:
  * It's now a beautiful butterfly.

RC:
  * IE HTA mode will now close the final window.
  * All windows are now opened as "resizable". This means that they
    should always open in new windows rather than tabs in IE.
  * *chrome mode can type into file input elements on Firefox 8+
  * WebDriverCommandProcessor has all constructors depending on the
    (deprecated) SuppliesWebDriver class marked as deprecated. Will be
    deleted in the next release.

Automation Atoms:
  * Bug fixes and updates
  * Included a touchscreen abstraction


v2.15.0
=======
Project:
  * Code donation from Google.

WebDriver:
  * Now supports up to and including Firefox 11.
  * Changed order of FirefoxProfile initialization attempts on a
    remote host: 1) try to load from capabilities, 2) try to load
    locally if webdriver.firefox.profile is specified, 3) create an
    empty profile.
  * Added the beginning of infrastructure for gathering logs from
    webdriver tests.
  * Added an UnreachableBrowserException.
  * Additional work on the WebDriver JS console.
  * Implicit waits now change how long we wait for alerts. This
    functionality will change in 2.16
  * FIXED: 2700: The infamous scrolling issue.
  * FIXED: 2816: ClassCastException when calling switchTo().alert().

Grid:
  * Grid now distinguishs between CLIENT_GONE and
    FORWARDING_TO_NODE_FAILED.
  * FIXED: issue where older RCs could not connect to a newer hub.

RC:
  * Selenium-backed WebDriver now uses atoms for typing.

Automation Atoms:
  * Significantly reworked input device abstractions.

Known Issues:
  * HTA mode for Selenium RC (*iexplore) leaves a browser window open.


v2.14.0
=======
WebDriver:
  * Deleted all deprecated methods in the Java API.
  * Client code cleaned to work with Java 5. Server code needs Java 6.
  * Added a front-end for executing WebDriverJS scripts. Point a
    browser at http://localhost:4444/wd/hub.
  * Can now query an Android driver for supported capabilities.
  * Updated JSON framework used in the iOS driver.
  * Fixed issue with scrolling on small viewports with native events
    in Firefox.
  * FIXED: 2889: FluentWait supports adding a custom message to
    timeout exception.
  * FIXED 2798: When implicit waits are enabled in the FirefoxDriver,
    stale element reference errors when searching for child elements
    are now handled properly
  * FIXED 2917: Preventing endless recursion in hashCode.

Server:
  * Memory leak fixed

Grid:
  * New beta console added.
  * Grid nodes were leaking even more memory that regular server
    nodes.
  * Fixed a scenario that used to lead to "session = null" errors.
  * Now support iOS nodes.

Known issues:
  * Continuing problems with element out of bounds exception being
    thrown.


v2.13.0
=======
Dependency change:
  * Selenium/webdriver java dependencies now use apache commons-exec
    (http://commons.apache.org/exec/) version 1.1. If you are using manual
    dependency management you will need to add this to your project.
    If you resolve via maven central (maven, ivy, gradle), this will
    be handled automatically.
WebDriver:
  * Recovering from null window references in the Firefox driver (#1438)
  * Make native events work correctly on Linux with the Python bindings (#2633)
  * Improved finding Firefox on Windows in the C# bindings (2818)
  * Screenshots in Python are now working (2829)
  * Exporting webdriver.promise from the Javascript API (2839)
  * Permission denied accessing some elements using the Firefox driver (2863)
  * Fixed typing into content editable elements with Firefox (2.12 regression)
  * Firefox is started in the forgeground on OS X. Focus / blur events now have
    higher chance of firing correctly on OS X.
  * Deprecated methods were removed from the FirefoxDriver and FirefoxProfile
    classes (saveScreenshot, enableNativeEvents, alwaysLoadNoFocusLib).
  * The amount of time a test can remain hanging is now capped (to 3 hours).

Grid:
  * Gracefully handle registration of old nodes in a new grid hub (#2738).
  * Releasing all the resources when a proxy is removed from the hub (#2768).

Known issues:
  * Synthesized mouse events are inaccurate (Affects Firefox driver users
    on OS X) (2281)
  * Invalid move target out of bounds exception thrown.2700
  * Dragged elements end up in the wrong location, with the Firefox driver,
    when scrolling is required (typically with small viewport) (2877)

v2.12.0
=======

RC
  * Disabled web security checks for Chrome by default.
  * Actually reenabling *safariproxy.

WebDriver
  * Firefox 8 support enabled
  * Added @Beta annotation. Any method marked with this may be deleted
    or changed without notification.
  * Added @Beta Window control for Firefox in Ruby and Java. This
    allows resizing and moving.
  * Renamed FirefoxProfile.enableNativeEvents() to
    FirefoxProfile.areNativeEventsEnabled(). Deprecated original
    method. Will be removed in 2.13.
  * Renamed FirefoxProfile.alwaysLoadNoFocusLib() to
    FirefoxProfile.shouldLoadNoFocusLib(). Deprecated original
    method. Will be removed in 2.13.
  * Better reporting of page size when attempting to move out of bounds.
  * More informative error message when a remote webdriver client
    fails to connect to the browser.
  * PageFactory now only decorates WebElement lists.
  * Calling WebElement.clear on a disabled or readOnly element will
    throw an InvalidElementStateException.
  * WebDriver.getWindowHandle will throw a NoSuchWindowException if
    the window is closed.
  * FIXED: 1498: HtmlUnit no longer finds containing element when
    searching by CSS.

Grid
  * Made Grid orphan check only apply to Se1 clients.

Atoms
  * Implemented clear action for contentEditable elements.


v2.11.0
=======

RC:
  * Safari proxy added back to the supported browser.


v2.10.0
======

Grid:
  * Stability and reliability fixes.
  * A single node can now process both selenium 1.0 and selenium webdriver requests.  Old proxies deprecated.
  * FIXED: 2617: Removing unnecessary logging.
  * FIXED: 2650, 2400: Unregister dead nodes.

WebDriver:
  * FIXED: 2700: Don't throw MoveTargetOutOfBoundsError where we shouldn't.
  * FIXED: 2301: Allow commas in CSS selectors.
  * FIXED: 2099: Occasional XPath lookup errors.
  * FIXED: 1771: Don't scroll unnecessarily.
  * FIXED: 2674: Don't incorrectly decorate List<WebElement>s which don't have @FindBy annotations.

Javascript:
  * Added jsapi, including node integration.  More details to come.

General:
  * Updated version of guava used to 10.0.1.

v2.9.0
======

Project:
  * ThoughtWorks code grant to the Software Freedom Conservancy complete.

WebDriver:
  * Support for Ice Cream Sandwich in the AndroidDriver
  * CSS Selector support enabled for Android
  * Remote webdriver server log now contains '[HTML source]' instead of full
    source.
  * Better respect for preformatted text in WebElement.getText()
  * Adding better error message when failing to connect to the FirefoxDriver.
  * Reduced scrolling during tests for IE and Firefox.
  * Preserve the state of modified keys when using native events on Linux.
  * Support for experimental page load detection in firefox. Set the
    "webdriver.load.strategy" to "fast" in the FirefoxProfile to enable less
    conservative page loading detection at the risk of greater test
    instability.
  * FIXED: 2031: Shielding backslashes when writing preferences to a file.
    There is an issue with Firefox: it drops \n and \r when it moves user
    preferences to prefs.js. This patch is a workaround.
  * FIXED: 2223: Clicks on labels are now propagated to the referenced element.
  * FIXED: 2646: PortProber no longer attempts to divide by zero.
  * FIXED: 2675: Better detection of where to click on links.

RC:
  * FIXED: 569: Making assert and verify methods NPE-safe.


v2.8.0
======

WebDriver
  * FIXED: 1967,1934: Temporary directories no longer fill up disk.
  * FIXED: 2295,1899: Better handling of select/option tags in HtmlUnit
  * Disabled elements won't be cleared any more
  * FIXED: 2531: Allow setting frozen firefox profile preferences to their frozen values.
  * FIXED: 2509: Fixing error=24 too many open files bug
  * Added setFileDetector to RemoteWebDriver to allow files to be uploaded to the remote server
  * Faster error reporting if chromedriver isn't executable
  * FIXED: Occasional ClassCastExceptions
  * FIXED: Proxy configuration NullPointerException problem
  * FIXED: 1326: Allow parallel execution of FirefoxDriver on Linux with native events
  * FIXED: 384: Fixed native FirefoxDriver crash on some 64-bit linux systems
  * FIXED: 417: Allow @FindBy annotations to be put on List<WebElement> as well as just WebElement fields
  * Added native event support for Firefox 7
  * Added constructor to ChromeDriver that lets you specify the ChromeDriverService as well as the DesiredCapabilities
  * FIXED: By.linkText now always trims leading and trailing whitespace
  * FIXED: Issues with doubleClick in Firefox

RC
  * FIXED: 1934: -singleWindow works for *iexplore
  * Selenium Server params work with RC Grid configuration
  * Adding support for Firefox 8

v2.7.0
======

WebDriver
  * FIXED: 2487: FirefoxDriver no longer types in the URL bar.
  * FIXED: Issues to do with not clicking on elements out of view when using
    native events.
  * FIXED: 2456: Double click and get no longer hangs Firefox.
  * Improved emulation of Selenium RC when using Opera in the
    WebDriverBackedSelenium.
  * FIXED: 2421: Chrome returns doubles instead of ints because it supports
    sub-pixel rendering.

RC
  * FIXED: #2413: "Missing space between browser name and custom path in error
    message"
  * FIXED: 2390, 2477: Make -h a synonym for -help

Automation Atoms
  * Allow bot.dom.getInViewLocation to scroll a specified location into view.


v2.6.0
======

WebDriver
  * Better handling of the case where emphemeral sockets are exhausted.
  * More widespread use of the InvalidSelectorError in Chrome and Remote.
  * When using native events, prevent firefox from scrolling if an element is
    already in the view.
  * Improvements in the mouse emulation (movement, click, double click, context
    click)
  * Bumped included version of OperaDriver to 0.7.1.
  * Attempt to address issue #1443 (the infamous "getWindow() == null" problem)
  * Added timing information to WebDriver exceptions resulting from command
    invocations in the remote driver.
  * Added an ExpectedConditions class with common ExpectedCondition
    implementations.
  * Better usage of sockets in the remote webdriver

RC
  * WebDriver-backed Seleniums will now clear text fields before typing.

Grid
  * Significantly improved thread safety.
  * Improved information on the index page of the hub.

Automation Atoms
  * bot.inject.executeScript* handles function arguments better.
  * Add atom to get the frame index of a frame element (bot.frame.getFrameIndex)
  * Added emulation of touch devices and events
  * Use DOM Events level 2 and 3 for events IE if available


v2.5.0
======

WebDriver
  * Firefox 7 support without Native Events
  * Implementing scrolling past the viewport for Firefox
  * FIXED: 1020: Clicking on a link over multiple lines in Firefox
  * Minor cleanups of code

Grid
  * FIXED: Thread Safety Issues



v2.4.0
======

WebDriver:
  * Firefox 6 support.
  * Change in the wire protocol to bring alert checking inline with the
    semantics of other commands.
  * Improved text handling: non-breaking spaces are now returned as spaces, even
    in the middle of an existing body of text.
  * Minor fixes for detecting whether elements are visible.
  * Added handling of lists and maps in EventFiringWebDriver.executeScript().
  * FIXED: 2158: Fixing HtmlUnit select element getAttribute behaviour for
    "multiple" attribute.
  * Better handling of cookies in the remote webdriver (particularly Chrome)
  * FIXED: Thread safety issues.
  * Added clear app cache to the wire protocol.


Selenium:
  * Firefox 8 support.


v2.3.0
======

WebDriver:
  * Better detection of clickable areas in Firefox.
  * Alert handling works in Chrome.
  * Merge of Google-contributed code into the underlying Atoms.
  * FIXED: Internet Explorer crashes when an element has empty text and getText called.
  * FIXED: IBM JDK throws different exception when unable to bind to a socket.


v2.2.0
======

Selenium RC:
  * Avoiding double quoting the "method" when captured network traffic is
    returned via XML.

WebDriver:
  * relatedTarget now set on appropriate events (mouseover, mouseout)
  * Multiply wrapped WebElements now unwrapped properly when using the remote
    webdriver
  * RemoteWebElement will reuse an ID if the element has been looked up before.
  * Better warnings for emulated Selenium methods "allowNativeXpath" and
    "useXpathLibrary"
  * More consistent errors when an xpath expression returns something that is
    not a WebElement (indicated via the InvalidSelectorException.

Grid:
  * Adding support for a "host" variable in the config files.
  * Additional logging


v2.1.0
======

WebDriver:
  * Round to 0 if something looks like it's off the edge of the screen when
    calculating distances. Fixes issue 1776.
  * Deleting the deprecated TimeoutException inner class and replacing with the
    top-level one

Grid:
  * Properly form the HTML output for console display.
  * Track when a session has become orphaned.  I.e., when the client sends no
    commands after the initial session creation.  This almost always indicates
    the client is no longer connected and the session is unusable immediately.
