v4.44.0
======
* Support CDP versions: v146, v147, v148
* deprecate the 'native' methods inside the HttpClient interface (#17340)
* [grid] Accept legacy session-closed event payloads (#17343)
* specify nullability in package `org.openqa.selenium.remote` (#17325)
* fix NPE when response status is null (#17348)
* fix NoSuchElementException for custom By locators (#17287)
* fix some nullability warnings (#17362)
* remove field `ChromiumDriver.capabilities` (#17363)
* [grid] Add Distributor Redis-backed implementation as built-in support (#17396)
* [grid] Fix latent bugs in WebSocket proxy (#17429)

v4.43.0
======
* Support CDP versions: v145, v146, v147

v4.42.0
======
* Support CDP versions: v144, v145, v146
* fix "or" condition (#17135)
* Improve screenshot error message (#17120)
* Catch exception on .contentAsString with binary content (#17139)
* [grid] Router bypass WebSocket data path via transparent TCP tunnel (#17146)
* Guard against NPE in Platform.extractFromSysProperty (#17151)
* Deduplicate Unicode PUA mappings in Keys; make OPTION an alias of ALT and deprecate FN (#17147)
* remove `@Nullable` from return value for `ExpectedConditions` that never return null (#17149)
* Fluent setters in few classes like `PrintOptions` etc. (#17148)
* Enhance ScriptKey.toString() and mask script content in UnpinnedScriptKey (#17159)
* specify nullability in packages `org.openqa.selenium.chrom*` (#17152)
* Nullability for browsers (#17167)
* Keys: enforce CharSequence contract in charAt() (#17166)
* [BiDi] implement `speculation` module (#17130)
* specify nullability in `org.openqa.selenium.grid.*` packages (#17173)
* make the signature change in `ExecuteMethod` backward compatible (#17183)
* specify nullability in package `org.openqa.selenium.devtools` (#17185)
* [grid] Router WebSocket handle dropped close frames, idle disconnects, high-latency proxying (#17197)
* specify nullability in package `org.openqa.selenium.docker` (#17191)
* [grid] Align Router-Node read timeout with session pageLoad capability (#17211)
* specify nullability in other java packages (#17194)
* Fix saving docker logs to a file (#17218)
* Fix duplicate field name handling in InstanceCoercer#getFieldWriters (#17187)
* [grid] Dynamic Grid Docker configure container stop-grace-period (#17222)
* Add field names to JsonException "Duplicate JSON field name..." (#17225)
* [build] Fix RBE tests (#17233)
* [bazel] Update to Bazel 9 (#16757)
* [grid] Fix VNC caps not propagated for sessions without browserName (#17235)
* [grid] Add NodeCommandInterceptor for pluggable command interception via --ext (#17242)
* fix loading "isDisplayed.js" and other resources in OSGI environment (#17257)

v4.41.0
======
* Support CDP versions: v143, v144, v145
* Improve error message for died grid (#16938)
* fix JSON parsing of numbers with exponent (#16961)
* SE_DEBUG warns only when overriding user settings (#17009)
* mark `wait.until` as non-nullable (#17007)
* restore BiDi constructor without timeout parameter (#17014)
* [grid] Preventing potential deadlock in Distributor (#17022)
* Report exactly which JSON value was incorrect (#17003)
* [Java] JSpecify annotations for `LoadableComponent` , `SlowLoadableComponent` (#16798)
* parse all JSON numbers the same way (#17038)
* [grid] Add session event API for server-side event bus integration (#17015)
* specify nullability in package `org.openqa.selenium.bidi.browser` (#17036)
* [BiDi] implement `emulation.setScreenSettingsOverride` (#17028)
* specify nullability in package `org.openqa.selenium.bidi.browsingcontext` (#17040)
* Nullability annotations in package `org.openqa.selenium.bidi.emulation` (#17055)
* specify nullability in package `org.openqa.selenium.bidi.module` (#17058)
* specify nullability in package `org.openqa.selenium.bidi.log` (#17059)
* [grid] Revert default standalone config (#17060)
* specify nullability in package `org.openqa.selenium.bidi.network` (#17061)
* specify nullability in package `org.openqa.selenium.bidi.script` (#17062)
* Nullability in all BiDi packages (#17064)
* Remove unneeded protection from BiDi Connection constructor (#17067)
* [grid] Dynamic Grid standalone support passing basic auth credential (#17072)
* [grid] Restore stereotype capabilities merging in RelaySessionFactory (#17097)
* [grid] Support Dynamic Grid in Kubernetes cluster (#17092)
* [grid] Fix Distributor thread exhaustion in node health-check cycle (#17104)
* [grid] Fix WebSocket connection counter leaks in ProxyNodeWebsockets (#17106)
* [grid] Distributor retry session when RemoteNode executor shutting down (#17109)

v4.40.0
======
* [BiDi] implement `emulation.setScreenOrientationOverride` (#16705)
* #16720 avoid failing because of temporary Chrome internal files (#16722)
* Create target directories before copying file (#16739)
* Avoid sleep in tests (#16713)
* [refactor] call WebDriverException constructor instead of using reflection (#16763)
* [refactor] replace JUnit assertions by AssertJ (#16765)
* Fix bug in FileHandler: it always failed on MacOS (#16771)
* #16753 workaround for JDK bug JDK-8228970 (#16793)
* [BiDi] implement `emulation.setNetworkConditions` (#16794)
* [refactor] replace most of Guava collections by Java built-in collections (#16776)
* Be more tolerant to remote responses (#16797)
* several packages marks jspecify nullmarked (#16802)
* fix NPE in FirefoxOptions (#16833)
* Mark obsolete variables deprecated in DriverCommand and W3CHttpCommandCodec  (#16013)
* remove usages of Guava collections (sets and maps) (#16835)
* simplify several statements with isEmpty function call (#16836)
* JSpecify annotations for `org.openqa.selenium.json` (#16799)
* use SE_DEBUG to enable debugging (#16816)
* Allow downloading files from old Grid server (#16839)
* Speed up tests, improve test logging and build script (#16843)
* [Java] check wildcard imports as part of the build (#16846)
* rework downloading files from Grid (#16844)
* configurable timeout for BiDi commands (#16796)
* Unify error message format for all Expected Conditions & add tests (#16831)
* Fix flaky tests (#16862)
* fixes for running on windows (#16852)
* add readable `toString()` to `org.openqa.selenium.remote.Browser` (#16873)
* restore ClientConfig constructor used by Appium (for backward compatibility) (#16874)
* deprecate unused logging implementation (#16889)
* remove Apache Commons dependency (#16865)
* SE_DEBUG dumps all log output to stderr (#16900)
* Use ClientConfig provided by user instead of the default one (#16882)
* [grid] Improve Node handling concurrent sessions creation (#16913)
* Change BiDi "internalId" type from Long to String (#16918)
* create fewer objects while parsing JSON (#16926)
* preserve original file's modification time when uploading to Grid (#16935)
* [grid] Improve race conditions in Grid session distribution (#16939)

v4.39.0
======
* Add CDP for Chrome 143 and remove 140
* [BiDi] implement `browsingContext.downloadEnd` event (#16347)
* [BiDi] implement `emulation.setTimezoneOverride` (#16530)
* [grid] Minimum Docker API 1.44 for Docker Engine v29+ in Dynamic Grid (#16591)
* Show file modification time (#16589)
* [grid] Improve Docker client for Dynamic Grid (#16596)
* [grid] Improve browser container labels and naming in Dynamic Grid (#16599)
* [BiDi] emulation: allow passing null to GeolocationOverride (#16594)
* [grid] Update container label `compose.oneoff` in Dynamic Grid (#16613)
* [grid] Dynamic Grid group dynamic containers in compose stack (#16620)
* [BiDi] implement `emulation.setScriptingEnabled` (#16631)
* Avoid logging debug logs with INFO level (either in RUN or DEBUG mode) (#16584)
* Add JSpecify nullable annotations to exception classes (#16026)
* annotate with `@NullMarked` the whole package `org.openqa.selenium.net` (#16494)
* [bidi]: add BiDi method `BrowsingContext.setViewport(null, null)` to reset the mobile emulation mode (#16524)
* Replace Maven dependency references with artifact() for org.jspecify.jspecify (#16635)
* 16612 download large files (#16627)
* #16573 unwrap double-wrapped webdriver (#16575)

v4.38.0
======
* Add CDP for Chrome 142 and remove 139
* JSpecify annotations for `ExecuteMethod` (#16464)
* JSpecify annotations for `org.openqa.selenium.federatedcredent… (#16461)
* JSpecify annotations for `org.openqa.selenium.interactions` (#16462)
* JSpecify annotations for `org.openqa.selenium.net` (#16463)
* JSpecify annotations for `Credential` and `MBean` (#16481)
* JSpecify annotations for `ScriptKey` and `UnpinnedScriptKey` (#16483)
* JSpecify annotations for `FileDetector` (#16482)
* JSpecify annotations for `ExpectedCondition` (#16489)
* JSpecify annotations for `Response` `SessionId` `HttpSessionId` (#16490)
* [java][bidi]: add test for onHistoryUpdated event (#16293)

v4.37.0
======
* Add CDP for Chrome 141 and remove 138
* Linux ARM "os.arch" system property is "aarch64" (#16381)
* Rescuing the remote cause for session creation errors (#16418)
* feat: Add native Java 11 HTTP client methods to HttpClient interface (#16412)
* refactor(remote/command): Merge overload's business logic (#14469)
* make augmentation of HasBiDi/HasDevTools lazy-loaded (#16338)
* [grid] Add event bus heartbeat to prevent steal connection (#16444)
* JSpecify annotations for `org.openqa.selenium.grid.jmx` (#16431)
* JSpecify annotations for `org.openqa.selenium.bidi.permissions` (#16430)

v4.36.0
======
* Add CDP for Chrome 140 and remove 137
* [grid] close the HttpClient after the session is gone
* extend the scope of the properties of the HttpCommandExecutor class (#16186)
* [grid] Improve readTimeout in handle session between Router and Node (#16163)
* Unifying select class (#16220)
* Add hooks around getScreenshotAs in WebDriverListener #16232 (#16233)
* [grid] Simplify node status response handling in Router
* Refactored selectByContainsVisibleText and selectByVisibleText methods to remove code duplication (#16257)
* [bidi]: add `DownloadInfo` class and test for `onDownloadWillBegin` (#16267)
* [grid] update to netty 4.2.4 (#16194)
* Fix links to exception documentation on website (#16305)
* Fix concurrency issue in Selenium Manager (#16315)
* Fix falsy Spotbugs warning about not closed resource (#16318)
* [grid] Fix regression Distributor rejecting requests when nodes have supported caps but no free slots (#16327)
* Feat 14291/add jspecify annotations to exception classes pt4 (#16028)
* [grid] UI Light/Dark Mode Toggle (#16364)

v4.35.0
======
* Add CDP for Chrome 139 and remove 136
* Remove deprecated AppCacheStatus enum from the HTML5 package (#15973)
* Removing deprecated FirefoxBinary.java and Executable.java
* Removing deprecated `beforeSetScriptTimeout` and `afterSetScriptTimeout`
* Removing deprecated SessionStorage commands from ChromiumDriver
* Removing deprecated SessionStorage commands from FirefoxDriver
* Removing deprecated SessionStorage class AddWebStorage.java
* Removing deprecated WebStorage related classes.
* Feat 14291/jspecify nullable annotation edge driver service (#15972)
* Removing deprecated LocationContext related classes.
* Fix Unicode value for OPTION key in Keys enum (#15966)
* Removing old stream collectors required by Java 8 (#15523)
* Use static Patterns for regex-matching (#15499)
* Point made as immutable (#15511)
* Feat 14291/jspecify nullable annotation chrome driver såervice (#15998)
* Add @Nullable annotations to Firefox and Gecko driver service  (#15999)
* Add JSpecify nullable annotations to SafariDriverService parameters (#16000)
* Add @Nullable annotations to InternetExplorerDriverService parameters (#16001)
* use generics for AbstractFindByBuilder to avoid excessive casting (#15526)
* JSpecify annotations for By locators (#14372)
* JSpecify annotations for capabilities (#14397)
* Fix various typos in comments (#16022)
* release underlying HttpClient resources #15710
* CDP generate getters to ArrayType #16050
* Fix 15634/ensure driver closed java (#16038)
* [grid] Migrate from Guava's CacheBuilder to Caffeine (#15547)
* [grid] Fix race condition and improve logging in LocalSessionMap (#15370)
* [BiDi] implement emulation (#16070)
* add `default` as a value for SameSite (#16129)
* Normalising handling of Shadow Dom elements. (#16149)
* [grid] Restructuring classes have stateful data and improve Node health checks in LocalDistributor (#16151)
* add `websocket-port` test and `--connect-existing` check (#15462)
* [grid] Reduce redundant logs of find slots and retry queue requests by the Distributor (#16155)

v4.34.0
======
* Add CDP for Chrome 138 and remove 135
* Removing deprecated BrowsingContext constructor.
* [grid] Silent fail on invalid log level (#15796)
* Removing deprecated OsProcess class.
* Removing deprecated CommandLine class.
* Removing deprecated ContextAware interface.
* Fixing `getCredential` for VirtualAuthenticator
* Caching the size/length in loops to slightly improve performance (#15852)
* [feature] add method RemoteWebDriver.isDownloadsEnabled() (#15868)
* [refactor] use constant `CapabilityType.ENABLE_DOWNLOADS` instead of hard-coded value `se:downloadsEnabled` (#15867)
* [bidi] Add new fields of BrowsingContextInfo
* [bidi]Add method to get browsing context tree with root
* [grid] Add GreedySlotSelector as a built-in slot-selector option (#15897)
* deprecate FtpProxy (#15907)
* [BiDi] implement browsingContext.historyUpdated (#15901)
* [refactor] Remove Empty Space in CommandPayload (#15934)
* [FEAT] Add macOS-specific keys (OPTION, FN) to Keys enum for improved… (#15910)
* [BiDi] implement web extensions (#15660)
* Made ``JsonToWebElementConverter`` methods/fields protected (#15885)
* [grid] Session can be deleted via Grid UI (#15808)
* Use Environment variable to set driver location (#15653)

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.
