java - Selenium 等待 PrimeFaces 4.0 ajax 处理

标签 java ajax jsf selenium primefaces

我的 Selenium 测试需要等待 ajax 请求处理以避免竞争条件。在 PrimeFaces 3.5 中,您可以使用以下方法等待( copied straight from the PrimeFaces svn repo ):

private static final String JQUERY_ACTIVE_CONNECTIONS_QUERY = "return $.active == 0;";
private static final int DEFAULT_SLEEP_TIME_IN_SECONDS = 2;
private static final int DEFAULT_TIMEOUT_IN_SECONDS = 10;

protected void waitUntilAjaxRequestCompletes() {
   new FluentWait<WebDriver>(driver)
      .withTimeout(DEFAULT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
      .pollingEvery(DEFAULT_SLEEP_TIME_IN_SECONDS, TimeUnit.SECONDS)
      .until(new ExpectedCondition<Boolean>() {
         public Boolean apply(WebDriver d) {
            JavascriptExecutor jsExec = (JavascriptExecutor) d;
            return (Boolean) jsExec.executeScript(JQUERY_ACTIVE_CONNECTIONS_QUERY);
         }
   });
}

不幸的是,此代码在 PrimeFaces 4.0 中不起作用,jQuery 连接似乎从未处于 Activity 状态。

所以问题是:在 4.0 版本中如何等待 PrimeFaces ajax 请求处理?

最佳答案

PrimeFaces 4.0使用自己的ajax事件处理程序,您可以使用以下代码:

private static final String JS_JQUERY_DEFINED = "return typeof jQuery != 'undefined';";
private static final String JS_PRIMEFACES_DEFINED = "return typeof PrimeFaces != 'undefined';";
private static final String JS_JQUERY_ACTIVE = "return jQuery.active != 0;";
private static final String JS_PRIMEFACES_QUEUE_NOT_EMPTY = "return !PrimeFaces.ajax.Queue.isEmpty();";

private static final int TIME_OUT_SECONDS=10;
private static final int POLLING_MILLISECONDS=500;

private void waitForJQueryAndPrimeFaces() {
   new FluentWait(driver).withTimeout(TIME_OUT_SECONDS, TimeUnit.SECONDS)
      .pollingEvery(POLLING_MILLISECONDS, TimeUnit.MILLISECONDS)
      .until(new Function < WebDriver, Boolean >() {
         @Override
         public Boolean apply(WebDriver input) {
            boolean ajax = false;
            boolean jQueryDefined = executeBooleanJavascript(input, JS_JQUERY_DEFINED);
            boolean primeFacesDefined = executeBooleanJavascript(input, JS_PRIMEFACES_DEFINED);

            if (jQueryDefined) {
               // jQuery is still active
               ajax |= executeBooleanJavascript(input, JS_JQUERY_ACTIVE);
            }
            if (primeFacesDefined) {
               // PrimeFaces queue isn't empty
               ajax |= executeBooleanJavascript(input, JS_PRIMEFACES_QUEUE_NOT_EMPTY);
            }

            // continue if all ajax request are processed
            return !ajax;
         }
      });
}

private boolean executeBooleanJavascript(WebDriver input, String javascript) {
   return (Boolean) ((JavascriptExecutor) input).executeScript(javascript);
}

关于java - Selenium 等待 PrimeFaces 4.0 ajax 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23300126/

相关文章:

java - android中的activity需要Handler吗?

java - 从外部类非静态构造函数访问内部类的静态方法

jquery - 刷新 HTML 页面而不丢失注入(inject)的 CSS

jsf - 如何让 JSF 在 docker 容器中使用 spring-boot 应用程序?

java - Android:内存/资源泄漏

java - 使用编译器从 Java 到机器代码

javascript - json 数组内的数组

php - WordPress 表单上所需的警报

java - JSF:如果转换失败则调用方法

java - Primefaces 4.0 的 XML 命名空间