From b969061eea71d6b8a6c712d8a12fcebd1c4d51e0 Mon Sep 17 00:00:00 2001 From: ulisses Date: Sun, 3 May 2026 21:57:22 -0300 Subject: [PATCH] feature complete --- .../waitforjsload/PageLoadHelper.java | 69 +++++++++++++++ .../waitforjsload/WaitForJsLoadLiveTest.java | 83 +++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 testing-modules/selenium-3/src/main/java/com/baeldung/selenium/waitforjsload/PageLoadHelper.java create mode 100644 testing-modules/selenium-3/src/test/java/com/baeldung/selenium/waitforjsload/WaitForJsLoadLiveTest.java diff --git a/testing-modules/selenium-3/src/main/java/com/baeldung/selenium/waitforjsload/PageLoadHelper.java b/testing-modules/selenium-3/src/main/java/com/baeldung/selenium/waitforjsload/PageLoadHelper.java new file mode 100644 index 000000000000..aca75d556c03 --- /dev/null +++ b/testing-modules/selenium-3/src/main/java/com/baeldung/selenium/waitforjsload/PageLoadHelper.java @@ -0,0 +1,69 @@ +package com.baeldung.selenium.waitforjsload; + +import java.time.Duration; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +public class PageLoadHelper { + + private final WebDriverWait wait; + + public PageLoadHelper(WebDriver driver, Duration timeout) { + this.wait = new WebDriverWait(driver, timeout); + } + + public void waitForDocumentReady() { + wait.until(driver -> { + JavascriptExecutor js = (JavascriptExecutor) driver; + return js.executeScript("return document.readyState") + .equals("complete"); + }); + } + + public void waitForJQueryToStart() { + wait.until(driver -> { + JavascriptExecutor js = (JavascriptExecutor) driver; + return (Boolean) js.executeScript( + "return (typeof jQuery === 'undefined') || (jQuery.active > 0)"); + }); + } + + public void waitForJQueryToFinish() { + wait.until(driver -> { + JavascriptExecutor js = (JavascriptExecutor) driver; + return (Boolean) js.executeScript( + "return (typeof jQuery === 'undefined') || (jQuery.active === 0)"); + }); + } + + public void waitForElementToBeClickable(By locator) { + wait.until(ExpectedConditions.elementToBeClickable(locator)); + } + + public Boolean waitForModernAngularAppStable() { + return wait.until(driver -> { + JavascriptExecutor js = (JavascriptExecutor) driver; + String script = """ + return (typeof getAllAngularTestabilities === 'undefined' || + getAllAngularTestabilities().every(t => t.isStable())) + """; + return (Boolean) js.executeScript(script); + }); + } + + public void waitForJsAppReady() { + waitForDocumentReady(); + + wait.until(driver -> { + JavascriptExecutor js = (JavascriptExecutor) driver; + return (Boolean) js.executeScript( + """ + return (typeof window.appReady === 'undefined') || (window.appReady === true) + """); + }); + } +} diff --git a/testing-modules/selenium-3/src/test/java/com/baeldung/selenium/waitforjsload/WaitForJsLoadLiveTest.java b/testing-modules/selenium-3/src/test/java/com/baeldung/selenium/waitforjsload/WaitForJsLoadLiveTest.java new file mode 100644 index 000000000000..32d0dafeb1a1 --- /dev/null +++ b/testing-modules/selenium-3/src/test/java/com/baeldung/selenium/waitforjsload/WaitForJsLoadLiveTest.java @@ -0,0 +1,83 @@ +package com.baeldung.selenium.waitforjsload; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.time.Duration; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.github.bonigarcia.wdm.WebDriverManager; + +class WaitForJsLoadLiveTest { + + private static final String PAGE_URL = "https://www.baeldung.com/contact"; + private static final Logger log = LoggerFactory.getLogger(WaitForJsLoadLiveTest.class); + + private WebDriver driver; + private PageLoadHelper pageLoadHelper; + private static final Duration TIMEOUT = Duration.ofSeconds(10); + + @BeforeEach + void setUp() { + WebDriverManager manager = WebDriverManager.chromedriver(); + driver = manager.create(); + + log.info("Driver Path: {}", manager.getDownloadedDriverPath()); + log.info("Driver Version: {}", manager.getDownloadedDriverVersion()); + pageLoadHelper = new PageLoadHelper(driver, TIMEOUT); + } + + @AfterEach + void tearDown() { + driver.quit(); + } + + @Test + void whenWaitForDocumentReady_thenStateIsComplete() { + driver.get(PAGE_URL); + pageLoadHelper.waitForDocumentReady(); + + JavascriptExecutor js = (JavascriptExecutor) driver; + String readyState = (String) js.executeScript( + "return document.readyState"); + assertEquals("complete", readyState); + } + + @Test + void whenWaitForJQuery_thenNoActiveRequests() { + driver.get(PAGE_URL); + pageLoadHelper.waitForJQueryToStart(); + pageLoadHelper.waitForJQueryToFinish(); + + JavascriptExecutor js = (JavascriptExecutor) driver; + Boolean jQueryIsDone = (Boolean) js.executeScript( + "return (typeof jQuery === 'undefined') || (jQuery.active === 0)"); + assertTrue(jQueryIsDone); + } + + @Test + void whenWaitForElementClickable_thenClickable() { + driver.get(PAGE_URL); + pageLoadHelper.waitForElementToBeClickable( + By.tagName("button")); + + assertTrue(driver.findElement(By.tagName("button")) + .isDisplayed()); + } + + @Test + void whenWaitForAngularAppStable_thenStable() { + driver.get(PAGE_URL); + Boolean stable = pageLoadHelper.waitForModernAngularAppStable(); + + assertEquals(true, stable); + } +}