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)
 	}
 }