【问题标题】:org.openqa.selenium.WebDriverException: ReferenceError: jQuery is not definedorg.openqa.selenium.WebDriverException: ReferenceError: jQuery is not defined
【发布时间】:2013-06-20 08:35:50
【问题描述】:

您好,我正在尝试使用 Webdriver 为 firefox 配置文件编写自主测试,我在创建 Driver 对象时启用了等于 true 的 javascript。

在某些视图中,jquery 响应较晚,因此我尝试在 webdriver 代码中进行一次检查以等待 JQuery 处理

waitForJQueryProcessing 的代码 sn-p:

public static boolean waitForJQueryProcessing(WebDriver driver,
        int timeOutInSeconds) {
    boolean jQcondition = false;
    try {
        new WebDriverWait(driver, timeOutInSeconds) {
        }.until(new ExpectedCondition<Boolean>() {

            @Override
            public Boolean apply(WebDriver driverObject) {
                return (Boolean) ((JavascriptExecutor) driverObject)
                        .executeScript("return jQuery.active == 0");
            }
        });
        jQcondition = (Boolean) ((JavascriptExecutor) driver)
                .executeScript("return jQuery.active == 0");
        return jQcondition;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return jQcondition;
}

但是上面的代码是上升异常

堆栈跟踪


org.openqa.selenium.WebDriverException: ReferenceError: jQuery is not defined
Command duration or timeout: 10 milliseconds
Build info: version: '2.32.0', revision: '6c40c187d01409a5dc3b7f8251859150c8af0bcb', time: '2013-04-09 10:39:28'
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_17'
Session ID: 58ad81d0-53f9-4862-a916-a1900efdc9c0
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=21.0, 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(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)
    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 com.iclinica.utils.WaitTool$9.apply(WaitTool.java:309)
    at com.iclinica.utils.WaitTool$9.apply(WaitTool.java:1)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208)
    at com.iclinica.utils.WaitTool.waitForJQueryProcessing(WaitTool.java:304)
    at com.iclinica.globals.FirefoxCustomWebdriver.findElement(FirefoxCustomWebdriver.java:14)
    at com.iclinica.page.studyconfig.studydetails.StudyDetailsPage.studydetails(StudyDetailsPage.java:20)
    at com.iclinica.studyconfig.AddPatients.teststudycreation(AddPatients.java:168)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

我用谷歌搜索在 webdriver 对象中设置 jquery 文件路径,但没有找到任何结果

我希望这是有道理的。

谢谢 高拉夫

【问题讨论】:

  • 那么页面上加载了 jQuery 吗?听起来不是。
  • 谢谢@Arran,你说得对。由于js脚本中的一些错误,它没有为多个jsp加载js,但是对于一个jsp,仍然会出现相同的异常,我也使用firebug验证了同一个jsp,但是firebug没有显示任何错误。

标签: webdriver selenium-webdriver


【解决方案1】:

改用这个:

public static boolean waitForJQueryProcessing(WebDriver driver,
        int timeOutInSeconds) {
    boolean jQcondition = false;
    try {
        new WebDriverWait(driver, timeOutInSeconds) {
        }.until(new ExpectedCondition<Boolean>() {

            @Override
            public Boolean apply(WebDriver driverObject) {
                return (Boolean) ((JavascriptExecutor) driverObject)
                        .executeScript("return jQuery.active == 0");
            }
        });
        jQcondition = (Boolean) ((JavascriptExecutor) driver)
                .executeScript("return window.jQuery != undefined && jQuery.active === 0");
        return jQcondition;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return jQcondition;
}

你原来的代码sn-p的变化是:

.executeScript("return window.jQuery != undefined && jQuery.active === 0");

这将确保在检查是否有任何活动的 jQuery 进程之前定义了您的 jQuery 对象。 Selenium 运行速度很快,有时可以在 jQuery 有机会加载到您正在测试的页面之前对其进行查询。

【讨论】:

    【解决方案2】:

    有一个更短的代码版本适合我:

    public void waitForAjaxLoad(WebDriver driver) throws InterruptedException{
        JavascriptExecutor executor = (JavascriptExecutor)driver;
        if((Boolean) executor.executeScript("return window.jQuery != undefined")){
            while(!(Boolean) executor.executeScript("return jQuery.active == 0")){
                Thread.sleep(1000);
            }
        }
        return;
    }
    

    毫秒(1000)可以添加到方法的参数中。

    【讨论】:

      猜你喜欢
      • 2020-05-24
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2021-12-10
      • 2018-08-27
      • 2018-08-03
      • 2019-07-24
      相关资源
      最近更新 更多