v4.33.0
======
* Add CDP for Chrome 137 and remove 134
* Removing deprecated items in Require.java (#15711)
* Removing RemoteStatus as it was deprecated. (#15712)
* Fix spotbugs issues
* fix autoclose casting
* Use immutable values for return values
* Deprecating methods that use FirefoxBinary as well.
* Removing deprecated NATIVE_EVENTS field
* Removing deprecated SlowLoadableComponent constructor
* Removing deprecated implicitlyWait timeout
* Removing unused IME_ACTIVATE_ENGINE.
* Removing deprecated `setScriptTimeout` and `pageLoadTimeout`. (#15764)
* Reverting deprecation notice for `getAttribute`.
* [grid] UI Sessions capability fields to display as additional columns (#15759)
* [grid] UI Overview is able to see live preview per Node (#15777)

v4.32.0
======
* Add CDP for Chrome 136 and remove 133
* [grid] Dynamic Grid can enforce platform for node browser images
* [grid] Ignored options when they are prefixed, safari specif as well (#15574)
* [grid] Remove `browserName` capability from stereotype and SlotMatcher when using Relay Node to test a mobile application (#15537)
* [bidi]: add browsingContext event `onNavigationCommitted` (#15560)
* Set remote active protocol to BiDi for Firefox (#15224)
* Add header while creating websocket (#15655)

v4.31.0
======
* Add CDP for Chrome 135 and remove 132
* handle `getNamedCookie` and `deleteNamedCookie` for empty strings (#15092)
* [bidi] Prefer returning immutable versions of values when serialising to JSON
* [grid] remove more firefox devtools leftovers SeleniumHQ (#15323)
* Add nullness for AppCacheStatus, Credential, and Either (#15119)
* Add nullness for interactions (#15118)
* [grid] Expose register status via Node status response (#15448)

v4.30.0
======
* Add CDP for Chrome 134 and remove 131
* [grid] remove firefox devtools leftovers #15323
* [grid] remove indirection in cache structures
* [grid] remove not reachable code
* [grid] Add traces for event stop session in Node (#15348)
* [grid] Allow longer startup time through docker (#15345)
* remove usage of deprecated SemanticAttributes class #15384
* [cdp] add support for 134 and remove 131
* [cdp] remove support for v85 since no longer required by Firefox
* [bidi] Add Permissions Module commands (#15294)

v4.29.0
======
* Add CDP for Chrome 133 and remove 130
* [java] Ensure purging dead nodes service interval is configurable (#15175)
* [java] Ensure Selenium logging options are respected if java logging properties are not set (#15197)
* [java] Do not enable CDP deprecation warning if BiDi enabled (#15170)
* [java] Remove Firefox CDP (#15200)
* [java] Close the HttpClient if possible
* [java] Avoid augmenting CDP for Firefox (#15271)
* [java] Remove deprecated non-w3c compliant NetworkConnection interface (#15270)
* [java] Avoid downloading not needed browsers #15261
* [java] Fix return type and docstring for `getDownloadableFiles` (#15293)
* [java] Refine logger initialization with correct class literal (#15289)
* [java][bidi] Implement getClientWindows method (#14869)
* [grid] Add default sessionTimeout to NodeStatus to increase backward compatibility (#15229)
* [grid] Node flag `register-shutdown-on-failure` (#15297)

v4.28.1
======
* [java]: Add Locale.ROOT to avoid port formatting issues for all drivers (#15121)
* [java][bidi]: implement bidi setCacheBehavior (#15130)
* [java] Enhance PageSize class to support for predefined and custom Paper Sizes (#15052)
* [grid]: Grid UI could not open session live view (#15132)

v4.28.0
======
* Add CDP for Chrome 132 and remove 129
* [java]: encapsulate `additionalCommands` with getter method (#14816)
* [java] read complete output of selenium manager #14820
* [java] Enhance Null Check in Exception Handling (#14810)
* [java]Replace lambdas with method references (#14857)
* [java] include the exit code to the error message of a failed driver startup
* [grid] decrement the connection per session counter on close #14842 (#14854)
* [java]: Improved span name for `TracedCommandExecutor` (#14902)
* [java] use Local.ENGLISH for lower / upper case transformations #14916
* [java] setter for flag JsonInput.readPerformed (#14921)
* [grid] Distributor listen and handle the NodeRestartedEvent (#14938)
* [grid] delay the newsessionqueue response (#14764)
* [java] Fix FedCM command definition and tests (#14070)
* [grid] Improve SlotMatcher and SlotSelector on request browserVersion (#14914)
* [grid] Using the correct variable in throw
* [java] for loop enhance and using of standard java 11 method writeString for tests (#14889)
* [java] reuse the classes created by the WebDriverDecorator #14789 (#14793)
* [java] Added a check for intentionally existing loggers (#14754)
* [grid] use a single event listener for the event-bus health check
* [java] JSpecify annotations for immutable models and enums (#14395)
* [java] JSpecify annotations for wrappers (#14396)
* [grid] rework the retry of http requests #14917 (#14924)
* [grid] added missing locks related to health checks
* [grid] removed a misleading lock from the grid model
* [grid] ensure the current session count is correct
* [grid] ensure --drain-after-session-count is respected with a lot of sessions in the queue (#14987)
* [grid] retry if no node does support the Capabilities (#14986)
* [grid] stop the health check of a restarted node
* [grid]: platformName is empty should be considered as enum ANY instead of WINDOWS (#15036)
* [java] rawtypes javac warning fix for AbstractDriverOptions (#15048)
* [java]: allow setting custom timeout for DevTools (#14931)
* [grid] Dynamic Grid is able to trigger video record in browser node (#15047)
* [java] Nullness annotations for Cookie and Platform (#15062)
* [java] Replace anonymous types with lambdas (#15043)
* Allow sending DevTools command with custom timeout. (#15059)
* [java] Add nullness for Require (#15084)
* [java] Add nullness for net (#15083)
* [java] Add nullness for virtualauthenticator (#15082)
* [java] Add nullness for exceptions (#15081)
* [java] Add nullness for interactions (#15095)
* [java][js][py] Add straight relative-by locators (#14482)
* [java] Add nullness for Proxy and print (#15094)

v4.27.0
======
* Add CDP for Chrome 131 and remove 128
* Add Firefox CDP deprecation warnings
* Throw Error When Using Unsupported Linux ARM (#14616)
* Enhance error message for NoSuchElementException and return unmodifiable set for pinned scripts (#14707)
* Fix SpotBugs bugs in the Selenium manager (#14608)
* Allow to cancel a pending http request
* Case insensitive header names in http requests (#14095)
* Consume the input of the connection
* Deleted the deprecated FormEncodedData (#14688)
* Add method to select options containing the provided text (#14426)
* Remove toml parser warning (#14711)
* Simplify reading http headers
* Mark WebElement.getAttribute deprecated (#14666)
* Search windows by name without recursion (#14782)
* [bidi] Add network request handler APIs (#14424)
* [bidi] Fix the mode "closed" for a node
* [grid] TomlConfig: migrate TOML library to tomlj/tomlj (#14470)
* [grid] Avoid starting a session which will be disposed after start
* [grid] Cancel pending request on client timeout
* [grid] Check session ownership once
* [grid] Detect a client timeout while session creation #14743
* [grid] Prevent NPE in handling request with unsupported http method
* [grid] Retry creating a session in a distributed grid
* [grid] Shutdown the server backend on stop
* [grid] Speed up the server shutdown
* [grid] Stop a stale session more graceful
* [grid] Stop polling events on close

v4.26.0
======
* Add CDP for Chrome 130 and remove 127
* Add PAC proxy url to arguments for Selenium Manager (#14506)
* Prevent closing the stdin, stdout, stderr streams (#14569)
* Increasing of properties scope for better Appium compatibility (#14183)
* Fix decoding of line endings (#14539)
* Fix SpotBugs findings in `ChromiumDriver` and `PortProber` (#14589)
* Fix `v*Network.java` conditions (#14585)
* [grid] Enable the httpclient to perform async requests (#14409)
* [grid] Limit the number of websocket connections per session (#14410)
* [grid] Improvement for Node handling (#14628)
* [grid] Add node sessionTimeout to Grid status (#14582)
* [grid] Capability se:vncEnabled value based on list of vnc-env-var (#14584)
* [grid] UI Sessions list view sort Duration in ascending by default (#14599)
* [grid] UI Liveview disconnect noVNC websocket when closing dialog (#14598)
* [grid] UI Overview is able to sort Nodes capabilities (#14571)

v4.25.0
======
* Add CDP for Chrome 129 and remove 126
* replace `fedcm` links with new ones (#14478)
* toml: warn about upcoming change enforcing string to have quotes (#14491)
* Escape cookie values when required for tests (#14486)

v4.24.0
======
* Add "se" prefixed capabilities to session response (#14323)
* Ensure all prefixed caps in request are added in response
* [bidi] return the id of the listener added
* [grid] shutdown the websocket on unexpected failures
* Add JSpecify annotations to WebElement and SearchContext (#14291)
* Add JSpecify annotations for WebDriver and 3 other interfaces (#14371)
* Implement getAttributes() method of MBean, and update Number-based MBean attributes to return Number objects instead of Strings (#14153)
* [grid] shutdown the client related to a websocket
* [grid] release the upstream websocket
* [grid] close the httpclient after connecting the websocket failed
* [bidi] Add execute script high-level API (#14330)
* [ci] Use a tag to figure out what we might want to release (#14378)
* Add CDP for Chrome 128 and remove 125

v4.23.1
======
* [bidi] Add dom mutation handler support (#14304)
* [grid] Exclude status DRAINING when distributor getting available nodes (#14282)
* [bidi] Add script pinning methods (#14305)
* Allow setting JDKHttpClient connectionTimeout, readTimeout, version via system property (#14306)
* remove package org.openqa.selenium.grid.session.remote (#14295)
* close the HttClient in case starting the session fails
* Adding system property to disable tracing `webdriver.remote.enableTracing`
* wait for the close response #14280
* [bidi] Add authentication handlers (#14334)
* [grid] ensure the local_sessionmap.remove event is raised (#14337)
* [bidi] Add filter auth handler (#14349)

v4.23.0
======
* Use Files.notExists to check files #14088
* Setting proxy in SM only when it is needed.
* Remove `LocateNodeParameters.Builder`, deprecated since 4.20
* Remove usage of deprecated methods in Require.java
* Delete tests referencing deprecated methods in Require.java
* [bidi] Remove the method that converts node value to RemoteWebElement
* [bidi] Ensure the listeners returns an id (#14215)
* [bidi] Fix the adding and the removing listener
* [bidi] Ensure empty values are removed from the call back map
* [bidi] Avoid creating new instances of log entry event
* [bidi] Add source type to log entry (#14244)
* Revert workaround for old netty http client (addendum to #12843) (#14134)
* [grid] Remove 'browserName' capability from stereotype when using RelaySession (#14247)
* Merge android specific parameters in chrome options (#14217)
* Add custom duration for Actions constructor (#14085)
* Consistent UTF-8 Encoding and Code Enhancements (#14218)
* [grid] Set session-request-timeout as client readTimeout in RemoteNewSessionQueue (#14272)
* [bidi]Add high-level logging APIs (#14225)
* Add CDP for Chrome 127 and remove 124


v4.22.0
======

* [grid] Log unsuccessful attempts to create a session
* [grid] Prevent UrlChecker leaking threads on timeout
* Add convenience for enabling BiDi (#14029)
* Eliminate assumption of mutable list argument in SeleniumManager.getBinaryPaths() (#14036)
* Add 'toJson' method to Rectangle class to produce expected serialization (#14038)
* Let TracedCommandExecutor delegate NeedsLocalLogs calls
* Add preference to enable CDP in Firefox by default (#14091)
* [grid] Video file name set independently in dynamic grid via se:videoName (#14148)
* Add CDP for Chrome 126 and remove 123
* EdgeOptions.useWebView to return "this" (#14157)
* Various minor performance improvements and code cleanup (#14054)
* Use java.nio to check files (#14088)

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.
