Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/JSWaiter.java =================================================================== diff -u -r19107 -r19110 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/JSWaiter.java (.../JSWaiter.java) (revision 19107) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/JSWaiter.java (.../JSWaiter.java) (revision 19110) @@ -12,167 +12,184 @@ import org.openqa.selenium.support.ui.WebDriverWait; /** -* -* @author : Terry Kwan -* @date 创建时间:2017年7月15日 下午11:19:17 -* -* 代码来源及使用说明:http://www.swtestacademy.com/selenium-wait-javascript-angular-ajax/ -*/ + * + * @author : Terry Kwan + * @date 创建时间:2017年7月15日 下午11:19:17 + * + * 代码来源及使用说明:http://www.swtestacademy.com/selenium-wait-javascript-angular + * -ajax/ + */ public class JSWaiter { private final static Logger logger = Logger.getLogger(JSWaiter.class); - - private static WebDriver jsWaitDriver; - private static WebDriverWait jsWait; - private static JavascriptExecutor jsExec; - //Get the driver from relevant test - public static void setDriver (WebDriver driver) { - jsWaitDriver = driver; - jsWait = new WebDriverWait(jsWaitDriver, 20); - jsExec = (JavascriptExecutor) jsWaitDriver; - } + private static WebDriver jsWaitDriver; + private static WebDriverWait jsWait; + private static JavascriptExecutor jsExec; - //Wait for JQuery Load - private static void waitForJQueryLoad() { - //Wait for jQuery to load - ExpectedCondition jQueryLoad = driver -> ((Long) ((JavascriptExecutor) jsWaitDriver) - .executeScript("return jQuery.active") == 0); + // Get the driver from relevant test + public static void setDriver(WebDriver driver) { + jsWaitDriver = driver; + jsWait = new WebDriverWait(jsWaitDriver, 20); + jsExec = (JavascriptExecutor) jsWaitDriver; + } - //Get JQuery is Ready - boolean jqueryReady = (Boolean) jsExec.executeScript("return jQuery.active==0"); + // Wait for JQuery Load + private static void waitForJQueryLoad() { + // Wait for jQuery to load + ExpectedCondition jQueryLoad = driver -> ((Long) ((JavascriptExecutor) jsWaitDriver) + .executeScript("return jQuery.active") == 0); - //Wait JQuery until it is Ready! - if(!jqueryReady) { - logger.debug("JQuery is NOT Ready!"); - //Wait for jQuery to load - jsWait.until(jQueryLoad); - } else { - logger.debug("JQuery is Ready!"); - } - } + // Get JQuery is Ready + boolean jqueryReady = (Boolean) jsExec + .executeScript("return jQuery.active==0"); - //Wait for Angular Load - private static void waitForAngularLoad() { - WebDriverWait wait = new WebDriverWait(jsWaitDriver,15); - JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; + // Wait JQuery until it is Ready! + if (!jqueryReady) { + logger.debug("JQuery is NOT Ready!"); + // Wait for jQuery to load + jsWait.until(jQueryLoad); + } else { + logger.debug("JQuery is Ready!"); + } + } - String angularReadyScript = "return angular.element(document).injector().get('$http').pendingRequests.length === 0"; + // Wait for Angular Load + private static void waitForAngularLoad() { + WebDriverWait wait = new WebDriverWait(jsWaitDriver, 15); + JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; - //Wait for ANGULAR to load - ExpectedCondition angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver) - .executeScript(angularReadyScript).toString()); + String angularReadyScript = "return angular.element(document).injector().get('$http').pendingRequests.length === 0"; - //Get Angular is Ready - boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadyScript).toString()); + // Wait for ANGULAR to load + ExpectedCondition angularLoad = driver -> Boolean + .valueOf(((JavascriptExecutor) driver).executeScript( + angularReadyScript).toString()); - //Wait ANGULAR until it is Ready! - if(!angularReady) { - logger.debug("ANGULAR is NOT Ready!"); - //Wait for Angular to load - wait.until(angularLoad); - } else { - logger.debug("ANGULAR is Ready!"); - } - } + // Get Angular is Ready + boolean angularReady = Boolean.valueOf(jsExec.executeScript( + angularReadyScript).toString()); - //Wait Until JS Ready - public static void waitUntilJSReady() { - + // Wait ANGULAR until it is Ready! + if (!angularReady) { + logger.debug("ANGULAR is NOT Ready!"); + // Wait for Angular to load + wait.until(angularLoad); + } else { + logger.debug("ANGULAR is Ready!"); + } + } + + // Wait Until JS Ready + public static void waitUntilJSReady() { + Wait wait = new FluentWait(jsWaitDriver) .withTimeout(15000, TimeUnit.MILLISECONDS) .pollingEvery(250, TimeUnit.MILLISECONDS) .ignoring(JavascriptException.class); - - JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; - //Get JS is Ready - boolean jsReady = false; - - //Wait for Javascript to load - ExpectedCondition jsLoad = driver -> ((JavascriptExecutor) jsWaitDriver) - .executeScript("return document.readyState").toString().equals("complete"); - try{ - jsReady = (Boolean) jsExec.executeScript("return document.readyState").toString().equals("complete"); - } - // 捕获JavascriptException,忽略该异常 - catch (JavascriptException e){ - e.printStackTrace(); - logger.debug(e.getMessage()); - } - //Wait Javascript until it is Ready! - if(!jsReady) { - logger.debug("JS is NOT Ready!"); - //Wait for Javascript to load - wait.until(jsLoad); - } else { - logger.debug("JS is Ready!"); - } - } + JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; - //Wait Until JQuery and JS Ready - public static void waitUntilJQueryReady() { - - // 先等待JS加载完成 - waitUntilJSReady(); - - JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; + // Get JS is Ready + boolean jsReady = false; - //First check that JQuery is defined on the page. If it is, then wait AJAX - Boolean jQueryDefined = (Boolean) jsExec.executeScript("return typeof jQuery != 'undefined'"); - if (jQueryDefined == true) { - //Pre Wait for stability (Optional) - sleep(50); - - //Wait JQuery Load - waitForJQueryLoad(); + // Wait for Javascript to load + ExpectedCondition jsLoad = driver -> ((JavascriptExecutor) jsWaitDriver) + .executeScript("return document.readyState").toString() + .equals("complete"); + try { + jsReady = (Boolean) jsExec + .executeScript("return document.readyState").toString() + .equals("complete"); + } + // 捕获JavascriptException,忽略该异常 + catch (JavascriptException e) { + e.printStackTrace(); + logger.debug(e.getMessage()); + } + // Wait Javascript until it is Ready! + if (!jsReady) { + logger.debug("JS is NOT Ready!"); + // Wait for Javascript to load + wait.until(jsLoad); + } else { + logger.debug("JS is Ready!"); + } + } - //Post Wait for stability (Optional) - sleep(50); - } else { - logger.debug("jQuery is not defined on this site!"); - } - } + // Wait Until JQuery and JS Ready + public static void waitUntilJQueryReady() { - //Wait Until Angular and JS Ready - public static void waitUntilAngularReady() { - JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; + // 先等待JS加载完成 + waitUntilJSReady(); - //First check that ANGULAR is defined on the page. If it is, then wait ANGULAR - Boolean angularUnDefined = (Boolean) jsExec.executeScript("return window.angular === undefined"); - if (!angularUnDefined) { - Boolean angularInjectorUnDefined = (Boolean) jsExec.executeScript("return angular.element(document).injector() === undefined"); - if(!angularInjectorUnDefined) { - //Pre Wait for stability (Optional) - sleep(100); + JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; - //Wait Angular Load - waitForAngularLoad(); + // First check that JQuery is defined on the page. If it is, then wait + // AJAX + Boolean jQueryDefined = (Boolean) jsExec + .executeScript("return typeof jQuery != 'undefined'"); + for (int i = 0; i < 3; i++) { + if (jQueryDefined == true) { + // Pre Wait for stability (Optional) + sleep(50); - //Wait JS Load - waitUntilJSReady(); + // Wait JQuery Load + waitForJQueryLoad(); - //Post Wait for stability (Optional) - sleep(100); - } else { - logger.debug("Angular injector is not defined on this site!"); - } - } else { - logger.debug("Angular is not defined on this site!"); - } - } + // Post Wait for stability (Optional) + sleep(50); + break; + } else { + logger.debug("jQuery is not defined on this site!"); + sleep(50); + continue; + } + } + } - //Wait Until JQuery Angular and JS is ready - public static void waitJQueryAngular() { - waitUntilJQueryReady(); - waitUntilAngularReady(); - } + // Wait Until Angular and JS Ready + public static void waitUntilAngularReady() { + JavascriptExecutor jsExec = (JavascriptExecutor) jsWaitDriver; - public static void sleep (long milis) { - try { - Thread.sleep(milis); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + // First check that ANGULAR is defined on the page. If it is, then wait + // ANGULAR + Boolean angularUnDefined = (Boolean) jsExec + .executeScript("return window.angular === undefined"); + if (!angularUnDefined) { + Boolean angularInjectorUnDefined = (Boolean) jsExec + .executeScript("return angular.element(document).injector() === undefined"); + if (!angularInjectorUnDefined) { + // Pre Wait for stability (Optional) + sleep(100); + + // Wait Angular Load + waitForAngularLoad(); + + // Wait JS Load + waitUntilJSReady(); + + // Post Wait for stability (Optional) + sleep(100); + } else { + logger.debug("Angular injector is not defined on this site!"); + } + } else { + logger.debug("Angular is not defined on this site!"); + } + } + + // Wait Until JQuery Angular and JS is ready + public static void waitJQueryAngular() { + waitUntilJQueryReady(); + waitUntilAngularReady(); + } + + public static void sleep(long milis) { + try { + Thread.sleep(milis); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/sterilization/SterilizationTest.java =================================================================== diff -u -r19095 -r19110 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/sterilization/SterilizationTest.java (.../SterilizationTest.java) (revision 19095) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/sterilization/SterilizationTest.java (.../SterilizationTest.java) (revision 19110) @@ -117,8 +117,10 @@ By.xpath("//div[contains(text(), '无')]")); Utils.retryingFindAndClick( By.xpath("//button[contains(text(), '保存')]")); + + Utils.waitForWindowAmountEquals(1,2000); JSWaiter.waitUntilJQueryReady(); - + // 继续灭菌 // Utils.retryingFindAndDoAction(By.id("iframe_sterilizationRecord"), // Utils.ACTION_SWITCH_TO_FRAME);