You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by jd...@apache.org on 2026/07/07 17:54:11 UTC
(grails-core) 10/11: Handle slow page transitions
This is an automated email from the ASF dual-hosted git repository.
jdaugherty pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit eb3ff43ec4811c85c2f12245e46a7f723289e483
Author: James Daugherty <jd...@jdresources.net>
AuthorDate: Tue Jul 7 07:36:52 2026 -0400
Handle slow page transitions
(cherry picked from commit 19ac8b275713a063f417ffb1001148680b8022ae)
---
.../ui/common/src/testFixtures/groovy/page/CreatePage.groovy | 3 +--
.../ui/common/src/testFixtures/groovy/page/EditPage.groovy | 5 +++--
.../common/src/testFixtures/groovy/page/LifecyclePage.groovy | 12 +++++++++++-
.../ui/common/src/testFixtures/groovy/page/SearchPage.groovy | 3 +--
.../groovy/page/register/ForgotPasswordPage.groovy | 5 +----
.../testFixtures/groovy/page/register/RegisterPage.groovy | 5 +----
.../groovy/page/register/ResetPasswordPage.groovy | 10 ++--------
.../groovy/page/register/SecurityQuestionsPage.groovy | 5 +----
8 files changed, 21 insertions(+), 27 deletions(-)
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/CreatePage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/CreatePage.groovy
index 3bde87d745..059d1461f6 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/CreatePage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/CreatePage.groovy
@@ -32,7 +32,6 @@ abstract class CreatePage extends LifecyclePage {
}
<T extends LifecyclePage> T submitCreate(Class<T> expectedPageType) {
- submitBtn.click()
- waitForPage(expectedPageType)
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
}
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/EditPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/EditPage.groovy
index 6b2f677bf1..63972763d4 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/EditPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/EditPage.groovy
@@ -28,12 +28,13 @@ abstract class EditPage extends LifecyclePage {
}
def <T extends LifecyclePage> T submitDelete(Class<T> expectedPageType) {
+ def oldElement = submitBtn.firstElement()
js.exec('document.forms.deleteForm.submit()')
+ waitForStale(oldElement)
waitForPage(expectedPageType)
}
<T extends LifecyclePage> T submitEdit(Class<T> expectedPageType) {
- submitBtn.click()
- waitForPage(expectedPageType)
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
}
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/LifecyclePage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/LifecyclePage.groovy
index 11d5756b3a..be242e9521 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/LifecyclePage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/LifecyclePage.groovy
@@ -19,6 +19,7 @@
package page
import org.openqa.selenium.StaleElementReferenceException
+import org.openqa.selenium.WebElement
import geb.Page
import geb.navigator.Navigator
@@ -51,8 +52,12 @@ class LifecyclePage extends Page {
* {@code browser.at()} would otherwise pass against the outgoing document.
*/
protected void clickAndWaitForNavigation(Navigator button) {
- def oldElement = button.firstElement()
+ WebElement oldElement = button.firstElement()
button.click()
+ waitForStale(oldElement)
+ }
+
+ protected void waitForStale(WebElement oldElement) {
waitFor {
try {
oldElement.enabled
@@ -63,4 +68,9 @@ class LifecyclePage extends Page {
}
}
}
+
+ protected <T extends LifecyclePage> T clickAndWaitForPage(Navigator button, Class<T> expectedPageType) {
+ clickAndWaitForNavigation(button)
+ waitForPage(expectedPageType)
+ }
}
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/SearchPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/SearchPage.groovy
index 58576511b2..4da2d16d75 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/SearchPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/SearchPage.groovy
@@ -59,7 +59,6 @@ abstract class SearchPage extends LifecyclePage {
}
<T extends SearchPage> T submit(Class<T> expectedPageType) {
- submitBtn.click()
- waitForPage(expectedPageType)
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
}
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ForgotPasswordPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ForgotPasswordPage.groovy
index 189d95c669..122e63e343 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ForgotPasswordPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ForgotPasswordPage.groovy
@@ -33,9 +33,6 @@ class ForgotPasswordPage extends LifecyclePage {
def <T extends LifecyclePage> T submitForgotPassword(String username = null, Class<T> expectedPageType) {
if (username != null) this.username.text = username
- submitBtn.click()
- T page = browser.at(expectedPageType)
- waitFor { page.loaded }
- page
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
}
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/RegisterPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/RegisterPage.groovy
index 2c4bf65593..b57c648c3b 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/RegisterPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/RegisterPage.groovy
@@ -38,10 +38,7 @@ class RegisterPage extends LifecyclePage {
def <T extends LifecyclePage> T submitRegister(Form formData = null, Class<T> expectedPageType) {
formData?.applyTo(this)
- submitBtn.click()
- T page = browser.at(expectedPageType)
- waitFor { page.loaded }
- page
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
@Immutable
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ResetPasswordPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ResetPasswordPage.groovy
index 8bb23bde66..8fca17409e 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ResetPasswordPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/ResetPasswordPage.groovy
@@ -47,17 +47,11 @@ class ResetPasswordPage extends LifecyclePage {
formData.applyTo(this)
true
}
- clickAndWaitForNavigation(submitBtn)
- T page = browser.at(expectedPageType)
- waitFor { page.loaded }
- page
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
def <T extends LifecyclePage> T submitResetPassword(Class<T> expectedPageType) {
- clickAndWaitForNavigation(submitBtn)
- T page = browser.at(expectedPageType)
- waitFor { page.loaded }
- page
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
@Immutable
diff --git a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/SecurityQuestionsPage.groovy b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/SecurityQuestionsPage.groovy
index d70819d105..ecbba5e0c8 100644
--- a/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/SecurityQuestionsPage.groovy
+++ b/grails-test-examples/spring-security/ui/common/src/testFixtures/groovy/page/register/SecurityQuestionsPage.groovy
@@ -36,9 +36,6 @@ class SecurityQuestionsPage extends LifecyclePage {
def <T extends LifecyclePage> T submitAnswer(String answer1, String answer2, Class<T> expectedPageType) {
if (answer1) question1.text = answer1
if (answer2) question2.text = answer2
- submitBtn.click()
- T page = browser.at(expectedPageType)
- waitFor { page.loaded }
- page
+ clickAndWaitForPage(submitBtn, expectedPageType)
}
}