WebDriver wait for JQuery to finish

11,908

Solution 1

You could just add a check to see if jQuery is defined first so that it won't throw the exception:

public void waitForJQuery(WebDriver driver) {
    (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver d) {
            JavascriptExecutor js = (JavascriptExecutor) d;
            return (Boolean) js.executeScript("return !!window.jQuery && window.jQuery.active == 0");
        }
    });
}

Solution 2

This is how I finally got it to work (with some print output for debugging).

Adapted from here:

http://pastebin.com/3uMWQ5L0

    private static void waitForPageLoad(WebDriver driver) {
    System.out.println("Wating for ready state complete");
    (new WebDriverWait(driver, 5)).until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver d) {
            JavascriptExecutor js = (JavascriptExecutor) d;
            String readyState = js.executeScript("return document.readyState").toString();
            System.out.println("Ready State: " + readyState);
            return (Boolean) readyState.equals("complete");
        }
    });
}

Debug Output:

Wating for ready state complete
Ready State: interactive
Ready State: interactive
Ready State: complete

For JQuery just replace "return document.readyState" with "return !!window.jQuery && window.jQuery.active == 0" and then change the return statement to return (Boolean) readyState.equals("true");

Here the JQuery code Without the Debug info (less confusing I hope).

    private static void waitForJQuery(PhantomJSDriver driver) {
    (new WebDriverWait(driver, 5)).until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver d) {
            JavascriptExecutor js = (JavascriptExecutor) d;
            return (Boolean) js.executeScript("return !!window.jQuery && window.jQuery.active == 0");
        }
    });
}
Share:
11,908

Related videos on Youtube

nzsquall
Author by

nzsquall

My mind is made up, do not confuse me with the facts

Updated on June 04, 2022

Comments

  • nzsquall
    nzsquall almost 2 years

    I am using WebDriver in Java and I have a customized method to wait for DOM events (by JQuery):

     public void waitForJQuery(WebDriver driver) {
    (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver d) {
        JavascriptExecutor js = (JavascriptExecutor) d;
        return (Boolean) js.executeScript("return jQuery.active == 0");
        }
    });
    }
    

    When this method is hit by the test and error are thrown as:

    org.openqa.selenium.WebDriverException: jQuery is not defined
    Build info: version: '2.37.0', revision: 'a7c61cb', time: '2013-10-18 17:14:00'
    System info: host: 'WMWIN70089', ip: '10.68.44.231', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0'
    Driver info: driver.version: unknown
    Command duration or timeout: 190 milliseconds
    Build info: version: '2.37.0', revision: 'a7c61cb', time: '2013-10-18 17:15:02'
    System info: host: 'LMWIN70038', ip: '10.86.44.35', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_17'
    Session ID: 2cf19cb9-edcd-463e-b77e-0121eb05e246
    Driver info: org.openqa.selenium.remote.RemoteWebDriver
    Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, webdriver.remote.sessionid=2cf19cb9-edcd-463e-b77e-0121eb05e246, version=25.0.1, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, browserConnectionEnabled=true, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=true, takesScreenshot=true}]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
        at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:463)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.openqa.selenium.remote.Augmenter$CompoundHandler.intercept(Augmenter.java:280)
        at org.openqa.selenium.remote.RemoteWebDriver$$EnhancerByCGLIB$$13369d6d.executeScript(<generated>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:101)
        at com.sun.proxy.$Proxy10.executeScript(Unknown Source)
        at org.openqa.selenium.support.events.EventFiringWebDriver.executeScript(EventFiringWebDriver.java:209)
        at driver.core.web.core.WebDriverMaster$2.apply(WebDriverMaster.java:186)
        at driver.core.web.core.WebDriverMaster$2.apply(WebDriverMaster.java:1)
        at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208)
        at driver.core.web.core.WebDriverMaster.waitForJQuery(WebDriverMaster.java:183)
        at driver.services.web.ib4b.template.CreateTemplateDetails.searchItemBy(CreateTemplateDetails.java:364)
        at driver.services.web.csu.regression.testSearchAndSort.testSearchByAllFields(testSearchAndSort.java:59)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
        at org.junit.rules.RunRules.evaluate(RunRules.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    

    Can you please help me solve this issue?

    Thanks.

    • Anuragh27crony
      Anuragh27crony over 10 years
      can u try "$.active" instead of "jQuery.active"...and check if it works And to make it work...i think below should be defined: jQuery.ajaxPrefilter(function( options ) { options.global = true; });
    • Illia
      Illia over 10 years
      This question may also be relevant.
    • Furious Duck
      Furious Duck over 10 years
      @Anuragh27crony, I would say $$.active, and no other manipulations needed.
    • nzsquall
      nzsquall over 10 years
      $$.active appears to work, thanks.
    • Dingredient
      Dingredient over 9 years
      @Alexander Petrovich, you should add your solution as an answer.