Java Selenium等待PrimeFaces 4.0 ajax处理

Java Selenium等待PrimeFaces 4.0 ajax处理,java,ajax,jsf,selenium,primefaces,Java,Ajax,Jsf,Selenium,Primefaces,我的Selenium测试需要等待ajax请求处理,以避免竞争条件。在PrimeFaces 3.5中,可以使用以下方法等待(): private static final String JQUERY\u ACTIVE\u CONNECTIONS\u QUERY=“return$.ACTIVE==0;”; 私有静态final int DEFAULT_SLEEP_TIME_IN_SECONDS=2; 私有静态最终整数默认超时时间(以秒为单位)=10; 受保护的void waitUntilAjaxReq

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

private static final String JQUERY\u ACTIVE\u CONNECTIONS\u QUERY=“return$.ACTIVE==0;”;
私有静态final int DEFAULT_SLEEP_TIME_IN_SECONDS=2;
私有静态最终整数默认超时时间(以秒为单位)=10;
受保护的void waitUntilAjaxRequestCompletes(){
新FluentWait(驱动程序)
.withTimeout(默认超时,单位为秒,时间单位为秒)
.pollingEvery(默认睡眠时间,单位为秒,时间单位为秒)
.直到(新的预期条件){
公共布尔应用(WebDriver d){
JavascriptExecutor jsExec=(JavascriptExecutor)d;
返回(布尔值)jsExec.executeScript(JQUERY\u ACTIVE\u CONNECTIONS\u QUERY);
}
});
}
不幸的是,这段代码在PrimeFaces4.0中不起作用,jQuery连接似乎从未处于活动状态


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

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);
}
private static final String JS_JQUERY_DEFINED=“return typeof JQUERY!='undefined';”;
私有静态最终字符串JS_PRIMEFACES_DEFINED=“return typeof PRIMEFACES!='undefined';”;
私有静态最终字符串JS_JQUERY_ACTIVE=“return JQUERY.ACTIVE!=0;”;
私有静态最终字符串JS_PRIMEFACES_QUEUE_NOT_EMPTY=“return!PRIMEFACES.ajax.QUEUE.isEmpty();”;
专用静态最终整数时间\输出\秒=10;
私有静态最终整数轮询_毫秒=500;
私有void waitForJQueryAndPrimeFaces(){
新建FluentWait(驱动程序)。带超时(超时秒,时间单位秒)
.pollingEvery(轮询时间单位为毫秒,时间单位为毫秒)
.until(新函数(){
@凌驾
公共布尔应用(WebDriver输入){
布尔ajax=false;
布尔jquerydefine=executeboleanjavascript(输入,JS_JQUERY_定义);
布尔PrimeFacesdefine=executeBooleanJavascript(输入,JS_PRIMEFACES_定义);
如果(jQueryDefined){
//jQuery仍然处于活动状态
ajax |=executeboleanjavascript(输入,JS_JQUERY_ACTIVE);
}
如果(primeFacesDefined){
//PrimeFaces队列不是空的
ajax |=executeboleanjavascript(输入,JS_PRIMEFACES_QUEUE_NOT_EMPTY);
}
//如果已处理所有ajax请求,则继续
返回!ajax;
}
});
}
私有布尔值executeBooleanJavascript(WebDriver输入,字符串javascript){
返回(布尔值)((JavascriptExecutor)输入);
}

ajax=operator做什么?@KorayTugay将其翻译为:
ajax=ajax | | executeboleanjavascript(输入,JS|JQUERY|ACTIVE)
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);
}