Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Delivery.java =================================================================== diff -u -r18392 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Delivery.java (.../Delivery.java) (revision 18392) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Delivery.java (.../Delivery.java) (revision 18689) @@ -501,6 +501,7 @@ } Utils.retryingFindAndClick(By .xpath("//button[contains(text(), '保存')]")); + Utils.doWait(500); } } else { Delivery_custom(); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/One_use.java =================================================================== diff -u -r18571 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/One_use.java (.../One_use.java) (revision 18571) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/One_use.java (.../One_use.java) (revision 18689) @@ -90,7 +90,7 @@ supplier.sendKeys("\n"); } Utils.retryingFindAndClick(By.xpath("//button[contains(text(), '添加')]")); - Thread.sleep(1500); + Utils.doWait(1500); } name = Utils.settings.getJSONObject("一级供应室一次性物品1").getString( "名称"); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Apply.java =================================================================== diff -u -r18643 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Apply.java (.../Apply.java) (revision 18643) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/Apply.java (.../Apply.java) (revision 18689) @@ -774,6 +774,7 @@ Utils.clickWebElement(yesbutton); } } + Utils.doWait(500); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/ALL.java =================================================================== diff -u -r18662 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/ALL.java (.../ALL.java) (revision 18662) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/ALL.java (.../ALL.java) (revision 18689) @@ -10,6 +10,7 @@ import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.os.WindowsUtils; import org.testng.AssertJUnit; import org.testng.annotations.AfterTest; import org.testng.annotations.Test; @@ -69,7 +70,7 @@ AssertJUnit.fail(e.getMessage()); } } - + private void oneUse() { try { /*** 一级供应室一次性物品 ***/ @@ -388,7 +389,8 @@ try { File scrFile = ((TakesScreenshot) Utils.driver) .getScreenshotAs(OutputType.FILE); - // Now you can do whatever you need to do with it, for example copy + // Now you can do whatever you need to do with it, for example + // copy // somewhere String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss") @@ -398,7 +400,8 @@ } catch (Exception e) { e.printStackTrace(); } - Utils.driver.quit(); + WindowsUtils.killByName("IEDriverServer.exe"); + WindowsUtils.killByName("iexplore.exe"); } } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/factory/WaitFactory.java =================================================================== diff -u -r18571 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/factory/WaitFactory.java (.../WaitFactory.java) (revision 18571) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/factory/WaitFactory.java (.../WaitFactory.java) (revision 18689) @@ -23,7 +23,7 @@ * @return {@link Wait} */ public static Wait createDefaultWait() { - return createWait(10000, 500); + return createWait(15000, 600); } /** Index: ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/Utils.java =================================================================== diff -u -r18662 -r18689 --- ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/Utils.java (.../Utils.java) (revision 18662) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/selenium/tools/Utils.java (.../Utils.java) (revision 18689) @@ -2,15 +2,13 @@ import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.NoSuchElementException; import java.util.Scanner; import java.util.Set; -import java.util.concurrent.TimeUnit; import java.util.function.Function; import net.sf.json.JSONArray; @@ -27,9 +25,7 @@ import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.FluentWait; import org.openqa.selenium.support.ui.Wait; import org.openqa.selenium.support.ui.WebDriverWait; @@ -38,6 +34,8 @@ import org.testng.Assert; +import test.forgon.disinfectsystem.selenium.factory.WaitFactory; + /** * @author Terry Date : 2016-02-29 23:17 工具类 */ @@ -59,7 +57,7 @@ public static JSONObject settings = null; public static WebDriver driver; - public static int cleanTime=0; + public static int cleanTime = 0; /** * 全局等待的设置 WebDriverWait不能用全局变量,Terry Kwan,2017-5-1 @@ -160,31 +158,35 @@ // 禁用IE的native Events,解决偶尔有时候页面元素的click点击不生效的问题(该方法似乎无效) // 下面的禁用native Events不能禁用,禁用后,鼠标移动到主界面的装配或者灭菌的图标,下拉菜单不会弹出 // Terry Kwan, 2017-05-17 -// ieCapabilities.setCapability(InternetExplorerDriver.NATIVE_EVENTS, -// false); + // ieCapabilities.setCapability(InternetExplorerDriver.NATIVE_EVENTS, + // false); ieCapabilities .setCapability( InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); - String applicationName = Utils.settings.get("seleniumBrowserApplicationName").toString(); + String applicationName = Utils.settings.get( + "seleniumBrowserApplicationName").toString(); ieCapabilities.setCapability("applicationName", applicationName); - - String browserVersion = Utils.settings.get("seleniumBrowserVersion").toString(); + + String browserVersion = Utils.settings.get("seleniumBrowserVersion") + .toString(); ieCapabilities.setCapability("version", browserVersion); try { - String seleniumHubURL = Utils.settings.get("seleniumHubURL").toString(); - driver = new RemoteWebDriver(new URL( seleniumHubURL), ieCapabilities); -// driver = new InternetExplorerDriver(ieCapabilities); + String seleniumHubURL = + Utils.settings.get("seleniumHubURL").toString(); + driver = new RemoteWebDriver(new URL( seleniumHubURL), + ieCapabilities); +// driver = new InternetExplorerDriver(ieCapabilities); String cap = ((InternetExplorerDriver) driver).getCapabilities() .toString(); System.out.println("my cap = " + cap); - if(cleanTime==0){ - Utils.driver.manage().deleteAllCookies(); - Utils.waitPageLoaded(); - cleanTime++; + if (cleanTime == 0) { + Utils.driver.manage().deleteAllCookies(); + Utils.waitPageLoaded(); + cleanTime++; } } catch (Exception e) { e.printStackTrace(); @@ -664,7 +666,7 @@ * 等待页面加载完成 */ public static void waitPageLoaded() { - //这里加长到20秒,有时多次退出登录会卡住,所以这里要设置长一点的等待时间 + // 这里加长到20秒,有时多次退出登录会卡住,所以这里要设置长一点的等待时间 WebDriverWait waitSetting = new WebDriverWait(driver, 20, 400); waitSetting.until((ExpectedCondition) driver -> "complete" .equals(Utils.runJavaScript("return document.readyState"))); @@ -724,7 +726,9 @@ /** * 切换到指定的frame - * @param frame frame的名字 + * + * @param frame + * frame的名字 */ public static void switchToFrame(String frame) { Utils.driver.switchTo().frame(frame); @@ -734,7 +738,9 @@ /** * 切换到指定的window - * @param window window的名字 + * + * @param window + * window的名字 */ public static void switchToWindow(String window) { logger.info("准备开始切换window:" + window); @@ -775,7 +781,7 @@ if (table != null) { WebElement cell = getFirstCellOfTable(table); if (cell != null) { -// cell.click(); + // cell.click(); clickWebElement(cell); } result = true; @@ -916,23 +922,22 @@ */ public static void tryToCloseWarningWindow() { try { - //先等待页面加载完成,然后再等待Ext4.onReady执行完 + // 先等待页面加载完成,然后再等待Ext4.onReady执行完 waitPageLoaded(); - //先等待portalPage.js的Ext4.onReady执行完 - waitPageLoaded("return windowOnLoaded == false ? true : false;",8000,100); - Wait wait = new FluentWait(Utils.driver) - .withTimeout(5000, TimeUnit.MILLISECONDS) - .pollingEvery(250, TimeUnit.MILLISECONDS) - .ignoring(NoSuchElementException.class); + // 先等待portalPage.js的Ext4.onReady执行完 + waitPageLoaded("return windowOnLoaded == false ? true : false;", + 10000, 350); + Wait wait = WaitFactory.createDefaultWait(); // 等待对话框弹出 // wait.until(ExpectedConditions // .visibilityOfElementLocated(By // .xpath("//div/span[contains(text(),'满意度调查表')]"))); // 获取警告信息对话框的集合 List closeBtns = wait.until(driver -> { - // waitPageLoaded(); - return driver.findElements(By.cssSelector("div[class='x-tool x-tool-close']")); - }); + // waitPageLoaded(); + return driver.findElements(By + .cssSelector("div[class='x-tool x-tool-close']")); + }); int size = closeBtns.size(); System.out.println("closeBtns.size() = " + size); // 逐个关闭对话框,先关闭最外层的。如果没关闭最外层的,里面的对话框无法关闭 @@ -978,7 +983,6 @@ Assert.fail(e.getMessage()); } } - /** * 刷新页面 @@ -991,7 +995,7 @@ Utils.waitPageLoaded(); Utils.doWait(500); } - + /** * 等待一段时间,直到页面的URL地址变为期望值 * @@ -1001,10 +1005,7 @@ * 等待的超时时间 */ public static void waitUntilUrlChange(final String newUrl, int seconds) { - Wait wait = new FluentWait(Utils.driver) - .withTimeout(seconds, TimeUnit.SECONDS) - .pollingEvery(250, TimeUnit.MILLISECONDS) - .ignoring(NoSuchElementException.class); + Wait wait = WaitFactory.createDefaultWait(); wait.until(new Function() { public Boolean apply(WebDriver d) { return d.getCurrentUrl().startsWith(newUrl); @@ -1031,10 +1032,9 @@ try { - // config.js配置文件的路径。相对于类路径 String configFilePath = "test/forgon/disinfectsystem/selenium/config/"; - + // 获取Selenium自动化测试的配置信息 InputStream instream1 = Utils.class.getClassLoader() .getResourceAsStream( @@ -1050,8 +1050,7 @@ // String testConfigFilename = seleniumTestConfigPath + "/" // + projectName + "/settings.json"; - InputStream instream2 = Utils.class - .getClassLoader() + InputStream instream2 = Utils.class.getClassLoader() .getResourceAsStream( configFilePath + projectName + "/settings.json"); @@ -1098,11 +1097,12 @@ + text + "')]")); } - /** * 根据自定义属性获取第一个dom,使用方法可以参考: + * * @see Utils#getCustomAttributeDom(String, boolean) - * @param fnName 添加的方法名字 + * @param fnName + * 添加的方法名字 * @return 返回在页面生成js脚本的字符串 */ public static String getFirstCustomAttributeDom(String fnName) { @@ -1111,11 +1111,21 @@ /** * 根据自定义属性获取对应的dom,使用方法如下: - *

String script = getCustomAttributeDom("functionName", true);

- *

script += " var typeDom = functionName('自定义属性所在的tag', '自定义属性的名字');return typeDom;"

- *

Object dom = Utils.runJavaScript(script);"

- * @param fnName 添加的方法名字 - * @param getFirst 是否取第一个节点 + *

+ * String script = getCustomAttributeDom("functionName", true); + *

+ *

+ * script += + * " var typeDom = functionName('自定义属性所在的tag', '自定义属性的名字');return typeDom;" + *

+ *

+ * Object dom = Utils.runJavaScript(script);" + *

+ * + * @param fnName + * 添加的方法名字 + * @param getFirst + * 是否取第一个节点 * @return 返回添加好的脚本 */ public static String getCustomAttributeDom(String fnName, boolean getFirst) { @@ -1126,50 +1136,68 @@ .append("for(var i = 0,len = tagNames.length;i < len;i++){") .append("var node = tagNames[i];") .append("if (node.getAttributeNode(attr)){"); - customAttributeFn.append(getFirst ? "return node;}}}" : "ar.push(node);}}return ar;}"); + customAttributeFn.append(getFirst ? "return node;}}}" + : "ar.push(node);}}return ar;}"); return customAttributeFn.toString(); } /** * 向页面添加JQuery */ public static void addJQuery() { - StringBuilder script = new StringBuilder() - .append("(function() {") + StringBuilder script = new StringBuilder().append("(function() {") .append(" if (!window.jQuery) {") .append(" var s = document.createElement('script');") .append(" s.type = 'text/javascript';") .append(" s.src = '/jquery/jquery-1.11.2.js';") .append(" document.body.appendChild(s);") - .append(" }") - .append("})();"); - // String script = "(function(){if(!window.jQuery){var s = document.createElement('script'); s.type = 'text/javascript'; s.src = '/jquery/jquery-1.11.2.js'; document.body.appendChild(s);}})();"; + .append(" }").append("})();"); + // String script = + // "(function(){if(!window.jQuery){var s = document.createElement('script'); s.type = 'text/javascript'; s.src = '/jquery/jquery-1.11.2.js'; document.body.appendChild(s);}})();"; Utils.runJavaScript(script.toString()); } /** * 使用js来点击 - * @param webElement 要点击的元素 + * + * @param webElement + * 要点击的元素 */ public static void jsClick(WebElement webElement){ - Utils.runJavaScript("arguments[0].click();", webElement); - // 用以下方式可以解决模态窗点击不到,但会申请单提交可能会有问题, - // Utils.runJavaScript("var elem=arguments[0]; setTimeout(function() {elem.click();}, 100)", webElement); + try { + if (webElement.isEnabled() && webElement.isDisplayed()) { + Utils.runJavaScript("arguments[0].click();", webElement); + // 用以下方式可以解决模态窗点击不到,但会申请单提交可能会有问题, + // Utils.runJavaScript("var elem=arguments[0]; setTimeout(function() {elem.click();}, 100)", + // webElement); + } else { + System.out.println("页面上的元素无法进行单击操作"); + } + } catch (StaleElementReferenceException e) { + System.out.println("页面元素没有附加在网页中" + e.getStackTrace()); + } catch (NoSuchElementException e) { + System.out.println("页面元素没有找到要操作的页面元素" + e.getStackTrace()); + } catch (Exception e) { + System.out.println("无法完成单击操作" + e.getStackTrace()); + } } - + /** * 点击WebElement的通用方法,建议都通过此方法调用,以便统一更换最可靠的方法 + * * @param webElement */ - public static void clickWebElement(WebElement webElement){ -// jsClick(webElement); + public static void clickWebElement(WebElement webElement) { + // jsClick(webElement); String tagName = webElement.getTagName(); - if ("button".equalsIgnoreCase(tagName)){ -// if ("button".equalsIgnoreCase(tagName) || "img".equalsIgnoreCase(tagName)){ -// if ("button".equalsIgnoreCase(tagName) || "a".equalsIgnoreCase(tagName) || "img".equalsIgnoreCase(tagName)){ + if ("button".equalsIgnoreCase(tagName)) { + // if ("button".equalsIgnoreCase(tagName) || + // "img".equalsIgnoreCase(tagName)){ + // if ("button".equalsIgnoreCase(tagName) || + // "a".equalsIgnoreCase(tagName) || + // "img".equalsIgnoreCase(tagName)){ jsClick(webElement); - } - else{ + } else { webElement.click(); } }