= About the project

The Geb home page can be found at link:https://groovy.apache.org/geb/[https://groovy.apache.org/geb/].

== API reference

The API reference can be found link:api/index.html[here].

== Support &amp; development


Support for Geb is offered on the following forums:

[cols="1"]
|===
| Forum
| The `geb-users@groovy.apache.org` mailing list: https://lists.apache.org/list.html?geb-users%40groovy.apache.org[Browse] mailto:geb-users-subscribe@groovy.apache.org[Subscribe] mailto:geb-users-unsubscribe@groovy.apache.org[Unsubscribe]
| The https://github.com/apache/groovy-geb/discussions[Geb GitHub Discussions]
| The `#geb` channel on the https://www.groovycommunity.com[Groovy Slack workspace]
|===

Ideas and new features for Geb can be discussed on
the `geb-dev@groovy.apache.org` mailing list:
https://lists.apache.org/list.html?geb-dev%40groovy.apache.org[Browse]
mailto:geb-dev-subscribe@groovy.apache.org[Subscribe]
mailto:geb-dev-unsubscribe@groovy.apache.org[Unsubscribe]

== Credits

=== Committers

* Luke Daley
* Marcin Erdmann

=== Contributors

* github-profile:robfletcher[Robert Fletcher]
* link:https://pniederw.wordpress.com/[Peter Niederwieser]
* github-profile:chris-prior[Chris Prior]
* github-profile:zolotov[Alexander Zolotov] - TestNG Integration
* github-profile:c089[Christoph Neuroth] - Various fixes and patches
* github-profile:antony[Antony Jones] - Various fixes and patches, doc improvements
* github-profile:hennr[Jan-Hendrik Peters] - Doc improvements
* link:https://fbflex.wordpress.com/[Tomás Lin] - Doc improvements
* github-profile:measlyweasel[Jason Cahoon] - Bug fix around text matchers
* link:https://refaktor.blogspot.com/[Tomasz Kalkosiński] - Doc improvements
* github-profile:richdouglasevans[Rich Douglas Evans] - Doc improvements
* github-profile:idurkan[Ian Durkan] - Doc improvements
* github-profile:ColinHarrington[Colin Harrington] - Doc improvements
* github-profile:bherrmann7[Bob Herrmann] - Doc improvements
* github-profile:walterg2[George T Walters II] - Page option support for `withWindow()`
* github-profile:craigatk[Craig Atkinson] - Doc improvements
* github-profile:andyjduncan[Andy Duncan] - Fail fast when unexpected pages are encountered
* github-profile:johnrengelman[John Engelman] - Grails integration improvements
* github-profile:legart[Michael Legart] - Grails integration improvements
* github-profile:graemerocher[Graeme Rocher] - Grails integration improvements
* github-profile:craigatk[Craig Atkinson] - Bug fix around unexpected pages, fix for [issueh:422[]]
* github-profile:kgeis[Ken Geis] - Doc improvements
* github-profile:kellyrob99[Kelly Robinson] - Additional configuration parameters for SauceLabs
* github-profile:tygerpatch[Todd Gerspacher] - Doc improvements, Cleaned up settings.gradle
* github-profile:davidmc24[David M. Carr] - BrowserStack integration
* github-profile:tomdcc[Tom Dunstan] - Cucumber integration and related documentation
* github-profile:brian428[Brian Kotek] - Doc improvements
* github-profile:david-w-millar[David W Millar] - Doc improvements
* github-profile:alincode[Ai-Lin Liou] - Doc improvements
* github-profile:menonvarun[Varun Menon] - Selenium By selector support and related documentation, Support navigating to page instances in addition to classes
* github-profile:adjohnson916[Anders D. Johnson] - Doc improvements
* github-profile:azusa[Hiroyuki Ohnaka] - Doc improvements
* github-profile:bodiam[Erik Pragt] - Initial migration of the manual to AsciiDoctor
* github-profile:vijaybolleypally[Vijay Bolleypally] - Various fixes
* github-profile:pierre-hilt[Pierre Hilt] - `hasNot()` filtering
* github-profile:PoohSunny[Yotaro Takahashi] - Doc improvements
* github-profile:jochenberger[Jochen Berger] - Better error reporting when trying to set a nonexistent select option
* github-profile:matankatz[Matan Katz] - Support for setting the `forcelocal` flag for BrowserStack tunnel
* github-profile:victorparmar[Victor Parmar] - Add configuration option for including cause string representation in message of `WaitTimeoutException`
* github-profile:berardino[Berardino la Torre] - Fix incorrect delegation of waitFor() methods
* github-profile:madmas[Markus Schlichting] - Doc fixes
* github-profile:ahitrin[Andrey Hitrin] - Improvement to character replacing in report file names
* github-profile:leo-13[Leo Fedorov] - Support for `reportOnTestFailureOnly` config option for Spock integration
* github-profile:chrisbyrneham[Chris Byrneham] - Ability to specify proxy location and credentials to use with BrowserStack tunnel
* github-profile:anshbansal[Aseem Bansal] - Doc improvements
* github-profile:topr[Tomasz Przybysz] - Unwrapping module to its declared type
* github-profile:thecodesmith[Brian Stewart] - Doc improvements
* github-profile:JacobAae[Jacob Aae Mikkelsen] - Various fixes and improvements
* github-profile:pradtke[Patrick Radtke] - Doc improvements
* github-profile:leonard84[Leonard Brünings] - Fix for unexpected pages only being checked after at check fails for the expected page, added new composite text matchers
* github-profile:mahileeb[Lee Butts] - Improved error message when trying to select null on a single-select select element
* github-profile:rickirunge[Ricki Runge] - Ignore case of tag names passed as part of css selectors to `Navigator.filter()`
* github-profile:jdmuriel[Jesús L. D. Muriel] - Doc fixes
* github-profile:joschi[Jochen Schalanda] - Doc
* github-profile:mkutz[Michael Kutz] - Addition of `{number-input-api}`, `{range-input-api}`, `{url-input-api}`, `{password-input-api}`, `{color-input-api}`, `{datetime-local-input-api}`, `{time-input-api}`, `{month-input-api}` and `{week-input-api}`
* github-profile:kriegaex[Alexander Kriegisch] - Doc fixes
* github-profile:topperfalkon[Harley Faggetter] - Doc fixes
* github-profile:ArpitLT[Arpit Gupta] - Integration with LambdaTest
* github-profile:JLLeitschuh[Jonathan Leitschuh] - Configure execution of Gradle Wrapper Validation GitHub Action on the project
* github-profile:jrodalo[José Luis Rodríguez Alonso] - Website improvements
* github-profile:sclassen[Stephan Classen] - Doc improvements
* github-profile:pbielicki[Przemysław Bielicki] - Removal of deprecations from the build
* github-profile:arixmkii[Arthur Sengileyev] - Dependency updates
* github-profile:Vampire[Björn Kautler] - Various improvements
* github-profile:AlexeyAkentyev[Alexey Akentyev] - Fix handling of skipped and aborted tests in `OnFailureReporter`

== History

This page lists the more important changes between versions of Geb.

=== 8.0.0

8.0.0 marks Geb's first release as a subproject of Apache Groovy.

==== 💥 Breaking changes
* Changed the Maven group coordinate to `org.apache.groovy.geb` from `org.gebish`. [issue:226[]]

==== ⚙️ Dependencies
* Upgrade Groovy to 4.0.26. [issue:264[]]
* commit:bc6b4224[] Bump gradle to 8.13 (build dependency)
* commit:3141b7a8[] Bump node-gradle plugin to 7.1.0 (build dependency)
* commit:7cd34423[] Bump com.gradle.plugin-publish to 1.3.1 (build dependency)
* commit:e8b4a36c[] Bump guava to 33.4.0-jre
* commit:a02db74a[] Bump JUnit/JUnit Platform to 5.12.0/1.12.0
* commit:518088aa[] Bump system-lambda to 1.2.1
* commit:d4419a94[] Bump jsoup to 1.19.1
* commit:315a6387[] Bump jodd-lagarto to 6.0.6
* commit:ec8d1130[] Bump testng to 7.5.1
* commit:083c0703[] Bump Selenium to 4.27.0, Selenium TestContainer to 1.20.3
* commit:14e67b53[] Bump CodeNarc to 3.6.0-groovy-4.0 (build dependency)
* commit:519b6d10[] Bump ThreeTen-Extra lib to 1.8.0
* commit:2e687bba[] Update Selenium to 4.25.0


=== 7.0

==== 🚀 New features
* Add support for selecting elements by visibility when creating a `Navigator`. [issueh:675[]]
* Add a convenience method for creating dynamic navigators based on a `Supplier<Iterable<WebElement>>`. [issueh:674[]]

==== 🐛 Fixes
* Correctly handle skipped and aborted tests in `OnFailureReporter`. [issueh:676[]]

==== 💥 Breaking changes
* Update Groovy to 4.0.5 and Spock to 2.3-groovy-4.0. [issueh:668[]]

=== 6.0

==== 🚀 New features

* Add an option to `waitFor()` to not throw `WaitTimeoutException` when the wait times out. [issueh:644[]]
* Cloud browser plugins are published to Gradle Plugin Portal. [issueh:647[]]

==== 🐛 Fixes
* Fix a bug causing reports generated from within `cleanupSpec()` to not end up in the report group directory for the spec. [issueh:661[]]
* Update LambdaTest tunnel to v3. [issueh:662[]]
* Correctly expose all API dependencies for geb-junit4 and geb-testng modules to consumers.. [issueh:666[]]

==== 💪 Improvements
* Add parallel execution support for JUnit 5 integration. [issueh:663[]]
* Update Spock to 2.1-groovy-3.0. [issueh:665[]]
* Any `WebDriverException` thrown from web storage clearing after each test in `GebTestManager` is now suppressed. [issueh:649[]]

==== 🔄️ Changes
* Update Gradle logo at the bottom of gebish.org to the current design. [issueh:653[]]

==== 💥 Breaking changes
* Update to Selenium 4. [issueh:664[]]
* Cloud browser plugins are no longer published to Maven Central and should be resolved from Gradle Plugin portal instead. [issueh:648[]]
* Run GebConfig script only once rather than before each test in JUnit and Spock integrations. [issueh:660[]]

=== 5.1

==== 💪 Improvements

* Add support for Spock's parallel execution to `GebSpec` and `GebReportingSpec`. [issueh:645[]]

=== 5.0

==== 🐛 Fixes

* Fix a bug under Groovy 3 which caused PageInstanceNotInitializedException when "`container`" was used as a content element name. [issueh:640[]]

==== 💥 Breaking changes

* The `quitDriverOnBrowserReset` config option now default to true if driver caching is disabled. [issueh:633[]]
* Update Groovy to 3.0.8 and Spock to 2.0-groovy-3.0. [issueh:619[]]
* Don't make non-optional dependencies optional in various modules' POMs. [issueh:638[]]

=== 4.1

==== 🐛 Fixes

* Minor fix to confusing statement in the documentation section about finding and filtering web elements. [issueh:625[]]
* Improve information about IntelliJ IDEA support in the section on IDE authoring assistance in the manual. [issueh:629[]]
* Fix `Browser.go()` not to fail for non-hierarchical, opaque URIs. [issueh:634[]]

==== 🚀 New features

* Add ability to compose multiple text matchers. [issueh:631[]]
* Add configuration option to quit the driver each time the browser instance is reset by `GebTestManager`. [issueh:632[]]

=== 4.0

==== 🐛 Fixes

* Fix failure reporting in Spock fixture methods. [issueh:613[]]
* Fix using constants (static final fields) is content definitions on Groovy 2.5.14. [issueh:627[]]

==== 🚀 New features

* Add integration with JUnit 5. [issueh:539[]]

==== 💪 Improvements

* Introduce `{geb-test-manager-api}` to decrease code duplication between test framework integrations and make it easier for users to add integrations for additional frameworks. [issueh:614[]]
* Improve frame context management when nested withFrame() calls are used. [issueh:612[]]

==== 💥 Breaking changes

* Superclasses providing <<spock-junit-testng, support for various test frameworks>> have been rewritten in a backwards incompatible way to benefit from introduction of `{geb-test-manager-api}`. [issueh:614[]]
* Geb no longer depends on `groovy-all` artifact but instead depends on `groovy`, `groovy-templates` and `groovy-macro` artifacts from `org.codehaus.groovy` group. [issueh:618[]]
* Update to Groovy 2.5.13. [issueh:617[]]
* Removed `geb.PageChangeListener` which was deprecated in favour of `geb.PageEventListener`. [issueh:593[]]
* Update to Gradle 6.7 and build the cloud browser Gradle plugin against it. [issueh:622[]]
* Rename tunnel id to tunnel name in the Gradle plugin for LambdaTest integration. [issueh:606[]]

=== 3.4.1

==== 🐛 Fixes

* Fix `Browser.setNetworkLatency()` on newer versions of Chrome. [issueh:620[]]

=== 3.4

==== 🚀 New features

* Add support for adding multiple test tasks per browser type to cloud browser gradle plugins. [issueh:597[]]

==== 🐛 Fixes

* Fix an overflow for large `int` timeouts in `geb.Wait` causing `Browser.pause()` to fail and return instantly. [issueh:605[]]
* Update the message searched for in BrowserStack tunnel process output before considering it successfully as started after output changes in the latest version. [issueh:607[]]
* Update the message searched for in LambdaTest tunnel process output before considering it successfully as started after output changes in the latest version. [issueh:608[]]
* Fix detection of 64 bit architecture in Gradle tasks downloading BrowserStack and LambdaTest tunnel binaries. [issueh:610[]]

==== 💪 Improvements

* Make BrowserStack and LambdaTest tunnel ready messages configurable. [issueh:611[]]

=== 3.3

==== 🚀 New features

* Add ability to disable implicit assertions in particular waitFor block. [issueh:578[]]
* Add support to provide more information for UnexpectedPageException. [issueh:596[]]
* Add integration with LambdaTest. [issueh:603[]]
* Add a way to react when an unexpected page is encountered. [issueh:598[]]
* Add support for setting network throttling via setNetworkConditions Chrome command. [issueh:602[]]

==== 🐛 Fixes

* `BindingUpdater` is not forwarding methods from `geb.textmatching.TextMatchingSupport` onto the `Browser` instance. [issueh:601[]]

==== 💪 Improvements

* Improve integration between cloud browser gradle plugins and driver factories. [issueh:579[]]
* Switch cloud driver factories to use https urls. [issueh:599[]]
* Pass SauceLabs credentials via capabilities and not the url. [issueh:600[]]

=== 3.2

==== 🐛 Fixes

* Unexpected pages are now only checked after checking that none of the pages passed to `Browser.page()` methods taking a list match. [issueh:595[]]
* Fix global atCheckWaiting in combination with to:[...] leading to potentially long delays. [issueh:594[]]
* Fix a MissingMethodException when `Browser.withFrame(Navigator, Class<P>, Closure<T>)` is called. [issueh:591[]]
* Support accessing `Browser` instance from module base definitions. [issueh:582[]]
* Fix `withConfirm()` to work when accepting the dialog closes the window. [issueh:568[]]

=== 3.1

==== 🚀 New features

* Add a way to listen for navigator events. [issueh:585[]]
* Add a way to listen for page switching and at checking events. [issueh:590[]]

==== 🐛 Fixes

* Add `Actions` methods added in WebDriver 3.x to `InteractDelegate` and expose the backing `Actions` instance. [issueh:587[]]
* Fix incorrect javadoc for `Configuration.isCacheDriverPerThread()`. [issueh:592[]]

=== 3.0.1

==== 🐛 Fixes

* Set the correct type of dependency on `groovy-all` in poms published for Geb artifacts. [issueh:586[]]

=== 3.0

==== 🐛 Fixes

* Use `Number` instead of `Double` for waitFor calls. [issueh:570[]]
* Make `RadioButtons` module extendable. [issueh:562[]]
* Fix selector optimisation when attributes map contains `GString` values. [issueh:564[]]
* Do not swallow the cause when instantiating `UnableToLoadException`. [issueh:572[]]

==== 🚀 New features

* <<dynamic-navigators,Dynamic navigators>>. [issueh:557[]]
* Support specifying data center specific hostname when using SauceLabsDriverFactory. [issueh:573[]]
* Allow specifying custom commandline switches for BrowserStack local tunnel command in geb-browserstack Gradle plugin. [issueh:573[]]

==== 💥 Breaking changes

* `geb.navigator.EmptyNavigator` class has been removed. [issueh:557[]]
* Signature of the method in `geb.navigator.factory.InnerNavigatorFactory` has been changed. [issueh:557[]]
* Multiple methods have been moved up from `geb.navigator.Locator` to `geb.navigator.BasicLocator`. [issueh:557[]]
* `geb.navigator.NonEmptyNavigator` has been renamed to `geb.navigator.DefaultNavigator`. [issueh:557[]]
* JUnit 3 support has been retired. [issueh:532[]]
* Update to Groovy 2.5.6. [issueh:534[]]
* Support for Groovy 2.3 has been removed. [issueh:560[]]
* Reports are now by default only taken only on test failure and not after every test. [issueh:527[]]
* Proxy settings for BrowserStackLocal, tunnel identifier and forcing all traffic through local machine are now configured in a different block when using geb-browserstack Gradle plugin. [issueh:573[]]
* Update to Spock 1.3, drop support for Spock 1.0. [issueh:581[]]

=== 2.3.1

==== 🐛 Fixes

* Fix setting value by text on multi select elements when the text within option tag contains trailing or leading spaces. [issueh:563[]]

=== 2.3

==== 🚀 New features

* Added form control modules for url, password and number inputs. [issueh:548[]]
* Added form control module for color inputs. [issueh:549[]]
* Added form control module for datetime-local inputs. [issueh:550[]]
* Added form control module for time inputs. [issueh:554[]]
* Added form control module for month inputs. [issueh:552[]]
* Added form control module for range inputs. [issueh:551[]]
* Added form control module for week inputs. [issueh:553[]]
* Added `focused()` method on `Navigable` which obtains a `Navigator` wrapping the active (focused) `WebElement`. [issueh:546[]]
* Ability to require at checkers to be defined even for pages that are implicitly at checked. [issueh:541[]]

==== 🐛 Fixes

* Compatibility with latest Sauce Connect. [issueh:559[]]

==== 💪 Improvements

* Add an at() method to geb.Page which always throws MissingMethodException. [issueh:543[]]
* Improve signatures of methods in FrameSupport that take page objects to provide autocompletion inside of the closure passed as the last argument. [issueh:540[]]
* Resolve properties and methods in the closure passed to withNewWindow() and withWindow() against the browser. [issueh:545[]]

=== 2.2

==== 🚀 New features

* Make it more convenient to wait on something while reloading the page. [issueh:499[]]
* Added `waitCondition` content template option. [issueh:342[]]
* Added ability to disable use of tunnels in Gradle plugins for BrowserStack and SauceLabs. [issueh:384[]]
* Added `pause()` method to `Browser` class as an alternative to setting breakpoints when debugging. [issueh:247[]]
* Added ability to access names of content defined using the DSL at runtime. [issueh:369[]]
* Added ability to configure default values of content DSL template options. [issueh:369[]]
* Added ability to configure default values of options passed to `withWindow()` and `withNewWindow()`. [issueh:406[]]
* Added origin information to `TemplateDerivedPageContent` and `PageContentContainer`. [issueh:446[]]
* Added improved web storage support including management in test integrations. [issueh:472[]]

==== 🐛 Fixes
* Fix translation of attribute map to css selector when finding elements for attribute value that is a GString. [issueh:525[]]
* Fix documentation around calling value() on unchecked checkboxes. [issueh:520[]]
* Make additional capabilities passed to cloud driver factory's `create()` method override the capabilities that are hardcoded for a particular cloud driver provider. [issueh:372[]]
* Fixed `getCheckedLabel()` on `RadioButtons` module to return label text instead of `null` when a checked radio button is wrapped by a label without a `for` attribute. [issueh:530[]]
* Fix links to manual sections that had non-unique ids. [issueh:535[]]

==== 💪 Improvements

* Support calling `GebReportingSpec#report(String)` from fixture methods. [issueh:518[]]
* Add method for performing assertions as part of an at check. [issueh:405[]]
* Document how to configure proxy to be used by the direct download API. [issueh:371[]]
* Enable taking reports for all windows if multiple are open. [issueh:401[]]
* Describe what constitutes a good at checker in the manual. [issueh:512[]]
* Document how to restart the browser mid-test. [issueh:473[]]

=== 2.1

==== 🚀 New features

* Added a form control module for search input. [issueh:495[]]
* Added a form control module for date input. [issueh:496[]]
* Added `FramesSourceReporter` which allows to report on the source content of each top level frame of the browser's current page. [issueh:448[]]
* Added form control modules for email and tel inputs. [issueh:498[]]

==== 🐛 Fixes

* Fix reporting on failure in JUnit support when `reportOnTestFailureOnly` is set to true [issueh:491[]]

==== 💥 Breaking changes

* Actually remove `FileInput#getFile()` which was supposed to be removed for 2.0 but wasn't. [issueh:503[]]

=== 2.0

==== 🚀 New features

* Allow specifying the expected number of elements a content definition should return. [issueh:149[]]

==== 🐛 Fixes

* Improved error message when trying to select null on a single-select select element. [issueh:477[]]
* Return a list of results instead of `null` from `newWindow()` methods taking a window matching specification closure. [issueh:476[]]
* Ignore case of tag names passed as part of css selectors to `Navigator.filter()` [issueh:482[]]
* Gracefully handle incorrectly encoded URIs returned from `WebDriver.getCurrentUrl()` when navigating to urls. [issueh:492[]]

==== 💪 Improvements

* Change signatures of methods from `FrameSupport` to be more strongly typed. [issueh:470[]]

==== 💥 Breaking changes

* Use Java 8 to compile the project. [issueh:502[]]
* Remove `FileInput#getFile()`. [issueh:503[]]
* Build using WebDriver 3.6.0. [issueh:504[]]
* Calling `click()` on empty navigators results in a `UnsupportedOperationException`. [issueh:501[]]
* Build using Spock 1.1. [issueh:505[]]
* Unchecked checkboxes return `null` as value for consistency with other input types. [issueh:465[]]

=== 1.1.1

==== 🐛 Fixes

* Do not double encode query parameters when building urls for arguments passed to `go()`, `to()` and `via()`. [issueh:469[]]

=== 1.1

==== 🐛 Fixes

* Delegate to `browser` instead of the module from blocks passed to `withFrame()` in module classes. [issueh:461[]]
* Fix implicit assertions in "`at checkers`" to not return `null` if the last call is to a void method. [issueh:462[]]

==== 💪 Improvements

* Support for selecting Edge as the browser using name in configuration. [issueh:425[]]
* Support for using url fragment identifiers when navigating to pages. [issueh:463[]]
* Unexpected pages are only checked after at check fails for the expected page. [issueh:450[]]
* Support equality checking between all core implementations of `Navigator`, based on comparing collections of web elements wrapped by them. [issueh:459[]]
* Support using label text to select checkboxes and using collections as value to select multiple checkboxes when dealing a number of checkboxes with the same name. [issueh:460[]]

==== 🕸 Deprecations

* Grails 2.x plugin has been discontinued. [issueh:456[]]

=== 1.0

==== 🐛 Fixes
* Fix the direct field operator shortcut (`@`) for accessing element attributes to work on classes extending `Module`. [issueh:438[]]
* Fix reporting on failure only in `GebReportingSpec` to work with Spock 1.1. [issueh:445[]]

==== 💪 Improvements

* Add ability to unwrap modules returned from content dsl to their original type. [issueh:434[]]
* Add support for using attribute css selectors with navigator filtering methods like `filter()`, `not()`, `closest()`, etc. [issueh:437[]]

==== 💥 Breaking changes
* `geb.testng.GebTest` and `geb.testng.GebReportingTest` which were deprecated in 0.13.0 have been removed.
* `isDisabled()`, `isEnabled()`, `isReadOnly()` and `isEditable()` methods of `Navigator` which were deprecated in 0.12.0 have been removed.
* Loosely typed `module()` and `moduleList()` methods of the content DSL which were deprecated in 0.12.0 have been removed.

=== 0.13.1

==== 🐛 Fixes

* Fix a MissingMethodException thrown from `Navigator.value()` when using Groovy versions < 2.4.0. [issueh:422[]]
* Don't unnecessarily synchronize methods of `CachingDirverFactory.ThreadLocalCache`. [issueh:421[]]
* Ensure `ConfigSlurper.parse(Script, URL)` is called in a thread safe way from `ConfigurationLoader`. [issueh:423[]]

=== 0.13.0

==== 🚀 New features

* `reportOnTestFailureOnly` config option is now also effective in Spock and JUnit4 integrations. [issueh:92[]]
* `isFocused()` method has been added to the `Navigator` class. [issueh:208[]]
* `InvalidPageContent` exception is thrown when a content is defined with a name that will result in that content being not accessible. [issueh:109[]] [issueh:122[]]
* Ability to specify proxy location and credentials to use with BrowserStack tunnel. [issueh:419[]]

==== 🐛 Fixes

* Fix a bug that caused reports for all but the last executed test class in TestNG integration to be wiped out. [issueh:407[]]
* Fix a bug preventing using module as a base of another module. [issueh:411[]]
* Restore `browser` property of `Module`. [issueh:416[]]
* Handle setting values of form elements that cause page change or reload when their value changes. [issueh:155[]]

==== 💪 Improvements

* Non-ASCII word characters are not longer replaced in report file names. [issueh:399[]]
* Change TestNG support to be based on traits. [issueh:412[]]
* Add `Navigator.moduleList()` methods as an alternative to the deprecated `moduleList()` methods available in the content DSL. [issueh:402[]]
* Add support for using Geb with Selendroid and other Selenium based frameworks for testing non-web applications. [issueh:320[]]
* Improve documentation for `Browser.clearCookies()` around what exactly is cleared, add a helper method for removing cookies across multiple domains. [issueh:159[]]
* Don't depend on UndefinedAtCheckerException for flow control. [issueh:368[]]
* Document that `Navigator.text()` returns the text of the element only if it's visible. [issueh:403[]]
* Make implementation of `interact()` less dynamic. [issueh:190[]]
* Improve documentation for `interact()`. [issueh:207[]]
* Don't unnecessarily request tag name and type attribute multiple times when setting text input values. [issueh:417[]]
* Improve usefulness of string representation of content elements. [issueh:274[]]

==== 🕸 Deprecations

* `geb.testng.GebTest` and `geb.testng.GebReportingTest` have been deprecated in favour of `geb.testng.GebTestTrait` and `geb.testng.GebReportingTestTrait` respectively.

==== 💥 Breaking changes

* Geb is now built with Groovy 2.4.5 and Spock 1.0-groovy-2.4.
* The following `Navigator` methods now throw `SingleElementNavigatorOnlyMethodException` when called on a multi element `Navigator`: `hasClass(java.lang.String)`, `is(java.lang.String)`,
`isDisplayed()`, `isDisabled()`, `isEnabled()`, `isReadOnly()`, `isEditable()`, `tag()`, `text()`, `getAttribute(java.lang.String)`, `attr(java.lang.String)`, `classes()`, `value()`, `click()`,
`getHeight()`, `getWidth()`, `getX()`, `getY()`, `css(java.lang.String)`, `isFocused()`. [issueh:284[]]


=== 0.12.2

==== 🐛 Fixes

* Fix incorrect delegation in variant of `waitFor()` that takes timeout and interval. [issueh:395[]]
* Fix NPE on implicitly asserted statements that contain a safely navigated method call on null target. [issueh:398[]]

=== 0.12.1

==== 🐛 Fixes

* Change implementation of `waitFor()` method delegation so that IntelliJ IDEA does not complain that page and module classes supposedly need to implement it. [issueh:391[]]
* Properly handle class attribute when it's passed to `$()` together with a css selector. [issueh:390[]]

=== 0.12.0

==== 🚀 New features

* Support for finding elements using Webdriver's `{by-api}` selectors. [issueh:348[]]
* Support for navigating to page instances in addition to classes. [issueh:310[]]
* Support for using page instances as `page` option value of window switching methods. [issueh:352[]]
* Support for using page instances together with frame switching methods. [issueh:354[]]
* Support for using page instances with `Navigator.click()` methods. [issueh:355[]]
* Support for using page instances and lists of page instances as `page` option value of content templates. [issueh:356[]]
* New `Navigator.module(Class&lt;? extends Module&gt;)` and `Navigable.module(Class&lt;? extends Module&gt;)`. [issueh:312[]]
* New `Navigable.module(Module)` and `Navigable.module(Module)`. [issueh:311[]]
* Support for using `interact {}` blocks in modules. [issueh:364[]]
* Support page level `atCheckWaiting` configuration. [issueh:287[]]
* `Navigator` elements can now also be filtered using `hasNot()` method. [issueh:370[]]
* Custom implementation of `equals()` and `hashCode()` methods have been added to classes implementing `Navigator`. [issueh:374[]]
* Support setting `forcelocal` flag for BrowserStack tunnel. [issueh:385[]]
* Add configuration option for including cause string representation in message of `WaitTimeoutException`. [issueh:386[]]

==== 💪 Improvements

* Using unrecognized content template parameters result in an `InvalidPageContent` exception to make catching typos in them easier. [issueh:377[]]
* Improve error reporting when no at checkers pass if using multiple candidates for page switching. [issueh:346[]]
* Don't unnecessarily lookup root element for every baseless element lookup using `$()` in context of `Navigable`. [issueh:306[]]
* Attribute based searches are compiled to CSS selectors where possible. [issueh:280[]]
* Attribute based searches using an id, class or name are performed using an appropriate `By` selector where possible. [issueh:333[]]

==== 🐛 Fixes

* Improved message thrown from Navigator.isDisabled() and Navigator.isReadOnly() when navigator does not contain a form element. [issueh:345[]]
* Browser.verifyAtIfPresent() should fail for at checkers returning false when implicit assertions are disabled. [issueh:357[]]
* Provide better error reporting when unexpected pages configuration is not a collection that contains classes which extend `Page`. [issueh:270[]]
* Don't fail when creating a report and driver's screenshot taking method returns null. [issueh:292[]]
* Classes that can define content should not throw custom exceptions from `propertyMissing()`. [issueh:367[]]
* "`At checkers`" of pages passed to `withFrame()` methods are now verified. [issueh:358[]]

==== 💥 Breaking changes

* `Page.toString()` now returns full page class name instead of its simple name.
* `MissingPropertyException` is thrown instead of `UnresolvablePropertyException` when content with a given name is not found on page or module.
* Geb is now built with Groovy 2.3.10 and Spock 1.0-groovy-2.3.

==== 🕸 Deprecations

* `module(Class&lt;? extends Module&gt;, Navigator base)` available in content DSL has been deprecated in favour of `Navigator.module(Class&lt;? extends Module&gt;)` and will be removed in a future
 version of Geb.
* `module(Class&lt;? extends Module&gt;, Map args)` available in content DSL has been deprecated in favour of `Navigable.module(Module)` and will be removed in a future version of Geb.
* `module(Class&lt;? extends Module&gt;, Navigator base, Map args)` available in content DSL has been deprecated in favour of `Navigator.module(Module)` and will be removed in a future version of Geb.
* all variants of `moduleList()` method available in content DSL have been deprecated in favour of using `Navigator.module()` methods together with a `collect()` call and will be removed in a future
version of Geb, see <<repeating-content, chapter on using modules for repeating content>> for examples [issueh:362[]]
* `isDisabled()`, `isEnabled()`, `isReadOnly()` and `isEditable()` methods of `Navigator` have been deprecated and will be removed in a future version of Geb. These methods are now available on the
new <<form-element, `FormElement`>> module class.

==== 🔄️ Changes

* User mailing list has moved to link:https://groups.google.com/d/forum/geb-user[Google Groups].
* The Book of Geb has been migrated to Asciidoctor and the examples have been made executable. [issueh:350[]]

=== 0.10.0

==== 🚀 New features

* New `css()` method on `Navigator` that allows to access CSS properties of elements. [issueh:141[]]
* Added attribute based methods to relative content navigators such as next(), children() etc. [issueh:299[]]
* Added signature that accepts `localIdentifier` to `BrowserStackDriverFactory.create`. [issueh:332[]]
* Added <<content-dsl-to-wait, `toWait`>> content definition option which allows specifying that page transition happens asynchronously. [issueh:134[]]
* Added support for explicitly specifying browser capabilities when using cloud browsers Gradle plugins. [issueh:340[]]
* Added an overloaded `create()` method on cloud driver factories that allow specifying browser capabilities in a map and don't require a string capabilities specification. [issueh:281[]]

==== 🐛 Fixes

* Allow access to module properties from its content block. [issueh:245[]]
* Support setting of elements for WebDriver implementations that return uppercase tag name. [issueh:318[]]
* Use native binaries for running BrowserStack tunnel. [issueh:326[]]
* Update BrowserStack support to use command-line arguments introduced in tunnel version 3.1. [issueh:332[]]
* Fix PermGen memory leak when using groovy script backed configuration. [issueh:335[]]
* Don't fail in `Browser.isAt()` if at check waiting is enabled and it times out. [issueh:337[]]
* The value passed to `aliases` content option in documentation examples should be a String [issueh:338[]]
* Added `$()` method on Navigator with all signatures of `find()`. [issueh:321[]]
* `geb-saucelabs` plugin now uses a native version of SauceConnect. [issueh:341[]]
* Don't modify the predicate map passed to link:api/geb/navigator/BasicLocator.html#find(Map,%20java.lang.String)[`Navigator.find(Map&lt;String, Object&gt;, String)`]. [issueh:339[]]
* Functional tests implemented using JUnit and Geb run twice in Grails 2.3+. [issueh:314[]]
* Mention in the manual where snapshot artifacts can be downloaded from. [issueh:305[]]
* Document that `withNewWindow()` and `withWindow()` switch page back to the original one. [issueh:279[]]
* Fix selectors in documentation for manipulating checkboxes. [issueh:268[]]

==== 🔄️ Changes

* Updated cucumber integration example to use `cucumber-jvm` instead of the now defunct `cuke4duke`. [issueh:324[]]
* Setup CI for all of the example projects. [issueh:188[]]
* Incorporate the example projects into the main build. [issueh:189[]]
* Add a test crawling the site in search for broken links. [issueh:327[]]
* Document the link:https://github.com/apache/groovy-geb/blob/master/RELEASING.md[release process]. [issueh:325[]]

==== 💥 Breaking changes

* Use Groovy 2.3.6 to build Geb. [issueh:330[]]
* Format of browser specification passed to `BrowserStackBrowserFactory.create()` and `SauceLabsBrowserFactory.create()` has changed to be a string in Java properties file format defining the required browser capabilities.
* `sauceConnect` configuration used with `geb-saucelabs` plugin should now point at a version of 'ci-sauce' artifact from 'com.saucelabs' group.

=== 0.9.3

==== 🚀 New features

* Added `baseNavigatorWaiting` setting to prevent intermittent Firefox driver errors when creating base navigator. [issueh:269[]]
* Page content classes including `Module` now implement `Navigator` interface [issueh:181[]]
* Added some tests that guard performance by verifying which WebDriver commands are executed [issueh:302[]]
* Added link:https://www.browserstack.com[BrowserStack] integration [issueh:307[]]
* Added a shortcut to `Browser` for getting current url [issueh:294[]]
* Verify pages at checker when passed as an option to open a new window via `withWindow()` and `withNewWindow()` [issueh:278[]]

==== 🐛 Fixes

* Ignore `atCheckWaiting` setting when checking for unexpected pages. [issueh:267[]]
* Added missing range variants of find/$ methods. [issueh:283[]]
* Migrated `UnableToLoadException` to java. [issueh:263[]]
* Exception thrown when trying to set value on an invalid element (non form control). [issueh:286[]]
* Support for jQuery methods like offset() and position() which return a native Javascript object. [issueh:271[]]
* Finding elements when passing ids with spaces in the predicates map to the $() method. [issueh:308[]]

==== 💥 Breaking changes

* Removed easyb support. [issueh:277[]]
* `MissingMethodException` is now thrown when using shortcut for obtaining a navigator based on a control name and the returned navigator is empty. [issueh:239[]]
* When using SauceLabs integration, the `allSauceTests` task was renamed to`allSauceLabsTests`
* When using SauceLabs integration, the `geb.sauce.browser` system property was renamed to `geb.saucelabs.browser`
* `Module` now implements `Navigator` instead of `Navigable` so `Navigator`'s methods can be called on it without having to first call `$()` to get the module's base `Navigator`.

==== 🔄️ Changes

* Documentation site has been migrated to link:https://ratpack.io[Ratpack]. [issueh:261[]]
* Cross browser tests are now also executed using Safari driver [issueh:276[]]
* Artifact snapshots are uploaded and gebish.org is updated after every successful build in CI [issueh:295[]]
* Added a link:https://travis-ci.org/geb/geb[Travis CI build] that runs tests on submitted pull requests [issueh:309[]]

=== 0.9.2

==== 🚀 New features

* `page` and `close` options can be passed to `withWindow()` calls, see <<already-opened-windows, this manual section>> for more information.
* Unexpected pages can be specified to fail fast when performing "`at`" checks. This feature was contributed at a Hackergarten thanks to Andy Duncan. See <<unexpected-pages, this manual section>> for details. [issueh:70[]]
* Support for running Geb using SauceLabs provided browsers, see <<cloud-browser-testing, this manual section>> for details.
* New `isEnabled()` and `isEditable()` methods on `Navigator`.
* Support for ephemeral port allocation with Grails integration
* Compatibility with Grails 2.3

==== 🐛 Fixes

* Default value of `close` option for `withNewWindow()` is set to `true` as specified in the documentation. [issueh:258[]]

==== 💥 Breaking changes

* `isDisabled()` now throws `UnsupportedOperationException` if called on an `EmptyNavigator` or on a `Navigator` that contains anything else than a button, input, option, select or textarea.
* `isReadOnly()` now throws `UnsupportedOperationException` if called on an `EmptyNavigator` or on a `Navigator` that contains anything else than an input or a textarea.

=== 0.9.1

==== 💥 Breaking changes

* Explicitly calling `at()` with a page object will throw `UndefinedAtCheckerException` instead of silently passing if the page object does not define an at checker.
* Passing a page with no at checker to `click(List&lt;Class&lt;? extends Page&gt;&gt;)` or as one of the pages in `to` template option will throw `UndefinedAtCheckerException`.

==== 🚀 New features

* Support for dealing with self-signed certificates in Download API using `SelfSignedCertificateHelper`. [issueh:150[]]
* Connections created when using Download API can be configured globally using `defaultDownloadConfig` configuration option.
* New `atCheckWaiting` configuration option allowing to implicitly wrap "`at`" checkers in `waitFor` calls. [issueh:253[]]

==== 🐛 Fixes

* `containsWord()` and `iContainsWord()` now return expected results when matching against text that contains spaces [issueh:254[]]
* `has(Map&lt;String, Object&gt; predicates, String selector)` and `has(Map&lt;String, Object&gt; predicates)` were added to Navigator for consistency with `find()` and `filter()` [issueh:256[]]
* Also catch WaitTimeoutException when page verification has failed following a `click()` call [issueh:255[]]
* `not(Map&lt;String, Object&gt; predicates, String selector)` and `not(Map&lt;String, Object&gt; predicates)` were added to Navigator for consistency with `find()` and `filter()` [issueh:257[]]
* Make sure that `NullPointerException` is not thrown for incorrect driver implementations of getting current url without previously driving the browser to a url [issueh:291[]]

=== 0.9.0

==== 🚀 New features

* New `via()` method that behaves the same way as `to()` behaved previously - it sets the page on the browser and does not verify the at checker of that page[issueh:249[]].
* It is now possible to provide your own `{navigator-api}` implementations by specifying a custom link:api/geb/navigator/factory/NavigatorFactory.html[`NavigatorFactory`], see <<navigator-factory, this manual section>> for more information [issueh:96[]].
* New variants of `withFrame()` method that allow to switch into frame context and change the page in one go and also automatically change it back to the original page after the call, see [switching pages and frames at once][switch-frame-and-page] in the manual [issueh:213[]].
* `wait`, `page` and `close` options can be passed to `withNewWindow()` calls, see <<newly-opened-windows, this manual section>> for more information [issueh:167[]].
* Improved message of UnresolvablePropertyException to include a hint about forgetting to import the class [issueh:240[]].
* Improved signature of `Browser.at()` and `Browser.to()` to return the exact type of the page that was asserted to be at / was navigated to.
* link:api/geb/report/ReportingListener.html[`ReportingListener`] objects can be registered to observe reporting (see: <<listening-to-reporting, this manual section>>)

==== 🐛 Fixes

* Fixed an issue where waitFor would throw a WaitTimeoutException even if the last evaluation before timeout returned a truthy value [issueh:215[]].
* Fixed taking screenshots for reporting when the browser is not on a HTML page (e.g. XML file) [issueh:126[]].
* Return the last evaluation value for a `(wait: true, required: false)` content instead of always returning null [issueh:216[]].
* `isAt()` behaves the same as `at()` in regards to updating the browser's page instance to the given page type if its at checker is successful [issueh:227[]].
* Handling of `select` elements has been reworked to be far more efficient [issueh:229[]].
* Modules support accessing base attributes' values using @attributeName notation [issueh:237[]].
* Use of text matchers in module base definitions is supported [issueh:241[]].
* Reading of textareas have been updated so that the current value of the text field is returned, instead of the initial [issueh:174[]].

==== 💥 Breaking changes

* `to(Class&lt;? extends Page&gt;)` method now changes the page on the browser and verifies the at checker of that page in one method call [issueh:1[]], [issueh:249[]]; use `via()` if you need the old behaviour
* `getAttribute(String)` on `Navigator` now returns `null` for boolean attributes that are not present.
* `at()` and `to()` methods on `Browser` now return a page instance if they succeed and `via()` method always returns a page instance [issueh:217[]].
* `withFrame()` calls that don't take a page argument now change the browser page to what it was before the call, after the call [issueh:222[]].
* due to performance improvements duplicate elements are not removed when creating new `Navigator`s anymore; the new `unique()` method on `Navigator` can be used to remove duplicates if needed [issueh:223[]].
* `at(Page)` and `isAt(Page)` methods on `Browser` have been removed as they were inconsistent with the rest of the API [issueh:242[]].
* Navigator's `click(Class&lt;? extends Page&gt;)` and `to:` content option now verify page after switching to the new one to stay consistent with the new behaviour of `to(Class&lt;? extends Page&gt;)` [issueh:250[]].
* Reading an attribute that is not set on a navigator now returns an empty string across all drivers [issueh:251[]].

=== 0.7.2

==== 🐛 Fixes

* Further fixes for Java 7 [issueh:211[]].

=== 0.7.1

==== 🚀 New features

* Geb is now built with Groovy 1.8.6. This was forced to resolve [issueh:194[]].

==== 🐛 Fixes

* `startsWith()`, `contains()` etc. now work for selecting via element text now works for multiline (i.e. `&lt;br/&gt;`) text [issueh:202[]]
* Geb now works with Java 7 [issueh:194[]].

=== 0.7.0

==== 🚀 New features

* Added support for indexes and ranges in `moduleList()` method
* Form control shortcuts now also work on page and module content
* Custom timeout message for `waitFor()` calls
* Navigators can be composed also from content
* Closure expressions passed to `waitFor()` calls are now transformed so that every statement in them is asserted - this provides better reporting on `waitFor()` timeouts.
* `at` closure properties of Page classes are now transformed so that every statement in them is asserted - this provides better reporting on failed at checks
* new `isAt()` method on Browser that behaves like `at()` used to behave before, i.e. does not throw AssertionError but returns `false` if at checking fails
* `withAlert()` and `withConfirm()` now accept a `wait` option and the possible values are the same as for waiting content

==== 💥 Breaking changes

* `click()` now instructs the browser to click *only on the first* element the navigator has matched
* All `click()` method variants return the receiver
* Content definitions with `required: false, wait: true` return `null` and do not throw `WaitTimeoutException` if the timeout expires
* Assignment statements are not allowed anymore in closure expressions passed to `waitFor()` calls
* `at()` now throws AssertionException if at checking fails instead of returning false

=== 0.6.3

==== 🚀 New features

* Compatibility with Spock 0.6

=== 0.6.2

==== 🚀 New features

* New `interact()` function for mouse and keyboard actions which delegates to the WebDriver Actions class
* New `moduleList()` function for repeating content
* New `withFrame()` method for working with frames
* New `withWindow()` and `withNewWindow()` methods for working with multiple windows
* Added `getCurrentWindow()` and `getAvailableWindows()` methods to browser that delegate to the underlying driver instance
* Content aliasing is now possible using `aliases` parameter in content DSL
* If config script is not found a config class will be used if there is any - this is useful if you run test using Geb from IDE
* Drivers are now cached across the whole JVM, which avoids the browser startup cost in some situations
* Added config option to disable quitting of cached browsers on JVM shutdown

==== 💥 Breaking changes

* The `Page.convertToPath()` function is now responsible for adding a prefix slash if required (i.e. it's not added implicitly in `Page.getPageUrl()`) [GEB-139].
* Unchecked checkboxes now report their value as `false` instead of null

=== 0.6.1

==== 🚀 New features

* Compatibility with at least Selenium 2.9.0 (version 0.6.0 of Geb did not work with Selenium 2.5.0 and up)
* Attempting to set a select to a value that it does not contain now throws an exception
* The waiting algorithm is now time based instead of number of retries based, which is better for blocks that are not near instant
* Better support for working with already instantiated pages

==== 💥 Breaking changes

* Using `&lt;select&gt;` elements with Geb now requires an explicit dependency on an extra WebDriver jar (see <<installation-usage, the section on installation for more info>>)
* The `Navigator` `classes()` method now returns a `List` (instead of `Set`) and guarantees that it will be sorted alphabetically

=== 0.6

==== 🚀 New features

* selenium-common is now a 'provided' scoped dependency of Geb
* Radio buttons can be selected with their label text as well as their value attribute.
* Select options can be selected with their text as well as their value attribute.
* `Navigator.getAttribute` returns `null` rather than the empty string when an attribute is not found.
* The `jquery` property on `Navigator` now returns whatever the jQuery method called on it returns.
* All waitFor clauses now treat exceptions raised in the condition as an evaluation failure, instead of propagating the exception
* Content can be defined with `wait: true` to make Geb implicitly wait for it when it is requested
* Screenshots are now taken when reporting for all drivers that implement the `TakesScreenshot` interface (which is nearly all)
* Added `BindingUpdater` class that can manage a groovy script binding for use with Geb
* Added `quit()` and `close()` methods to browser that delegate to the underlying driver instance
* `geb.Browser.drive()` methods now return the used `Browser` instance
* The underlying WebElements of a Navigator are now retrievable
* Added $() methods that take one or more Navigator or WebElement objects and returns a new Navigator composed of these objects
* Added Direct Download API which can be used for directly downloading content (PDFs, CSVs etc.) into your Geb program (not via the browser)
* Introduced new configuration mechanism for more flexible and environment sensitive configuration of Geb (e.g. driver implementation, base url)
* Default wait timeout and retry interval is now configurable, and can now also use user configuration presets (e.g. quick, slow)
* Added a "`build adapter`" mechanism, making it easier for build systems to take control of relevant configuration
* The JUnit 3 integration now includes the test method name in the automatically generated reports
* The reporting support has been rewritten, making it much friendlier to use outside of testing
* Added the TestNG support (contributed by Alexander Zolotov)
* Added the `height`, `width`, `x` and `y` properties to navigator objects and modules

==== 💥 Breaking changes

* Raised minimum Groovy version to 1.7
* All failed waitFor clauses now throw a `geb.waiting.WaitTimeoutException` instead of `AssertionError`
* Upgraded minimum version requirement of WebDriver to 2.0rc1
* The `onLoad()` and `onUnload()` page methods both have changed their return types from `def` to `void`
* The Grails specific testing subclasses have been REMOVED. Use the direct equivalent instead (e.g `geb.spock.GebReportingSpec` instead of `grails.plugin.geb.GebSpec`)
* The Grails plugin no longer depends on the test integration modules, you need to depend on the one you want manually
* The `getBaseUrl()` method from testing subclasses has been removed, use the configuration mechanism
* Inputs with no value now report their value as an empty string instead of `null`
* Select elements that are not multiple select enabled no longer report their value as a 1 element list, but now as the value of the selected element (if no selection, `null` is returned)

=== 0.5.1

* Fixed problem with incorrectly compiled specs and the geb grails module

=== 0.5

==== 🚀 New features

* Navigator objects now implement the Groovy truth (empty == false, non empty == true)
* Introduced "`js`" short notation
* Added "`easyb`" support (`geb-easyb`) and Grails support
* Page change listening support through `geb.PageChangeListener`
* `waitFor()` methods added, making dealing with dynamic pages easier
* Support for `alert()` and `confirm()` dialogs
* Added jQuery integration
* Reporting integration classes (e.g. GebReportingSpec) now save a screenshot if using the FirefoxDriver
* Added `displayed` property to navigator objects for determining visibility
* Added `find` as an alias for `$` (e.g. `find(&quot;div.section&quot;)`)
* Browser objects now implement the `page(List&lt;Class&gt;)` method that sets the page to the first type whose at-checker matches the page
* The click() methods that take one or more page classes are now available on `Navigator` objects
* Added page lifecycle methods `onLoad()`/`onUnload()`

==== 💥 Breaking changes

* Exceptions raised in `drive()` blocks are no longer wrapped with `DriveException`
* the `at(Class pageClass)` method no longer requires the existing page instance to be of that class (page will be updated if the given type matches)

=== 0.4

*Initial Public Release*

:numbered:
