diff --git a/examples/mini-web/src/main/resources/applicationContext.xml b/examples/mini-web/src/main/resources/applicationContext.xml index 0df5deca..2140e88f 100644 --- a/examples/mini-web/src/main/resources/applicationContext.xml +++ b/examples/mini-web/src/main/resources/applicationContext.xml @@ -40,7 +40,7 @@ - + @@ -103,6 +103,7 @@ + @@ -110,6 +111,7 @@ + diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/BaseFunctionalTestCase.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/BaseFunctionalTestCase.java index 6e8196c3..707ce3d1 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/BaseFunctionalTestCase.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/BaseFunctionalTestCase.java @@ -94,7 +94,7 @@ public class BaseFunctionalTestCase { s.type(By.name("username"), "admin"); s.type(By.name("password"), "admin"); s.check(By.name("rememberMe")); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); } } @@ -105,6 +105,6 @@ public class BaseFunctionalTestCase { s.open("/logout"); s.type(By.name("username"), user); s.type(By.name("password"), password); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); } } \ No newline at end of file diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/GroupManagerIT.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/GroupManagerIT.java index d3106fca..d863a78d 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/GroupManagerIT.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/GroupManagerIT.java @@ -26,7 +26,7 @@ public class GroupManagerIT extends BaseFunctionalTestCase { */ @Test public void viewGroupList() { - s.clickTo(By.linkText(Gui.MENU_GROUP)); + s.click(By.linkText(Gui.MENU_GROUP)); WebElement table = s.findElement(By.xpath("//table[@id='contentTable']")); assertEquals("管理员", s.getTable(table, 1, GroupColumn.NAME.ordinal())); assertEquals("查看用戶,修改用户,查看权限组,修改权限组", s.getTable(table, 1, GroupColumn.PERMISSIONS.ordinal())); @@ -37,8 +37,8 @@ public class GroupManagerIT extends BaseFunctionalTestCase { */ @Test public void createGroup() { - s.clickTo(By.linkText(Gui.MENU_GROUP)); - s.clickTo(By.linkText("创建权限组")); + s.click(By.linkText(Gui.MENU_GROUP)); + s.click(By.linkText("创建权限组")); //生成测试数据 Group group = AccountData.getRandomGroupWithPermissions(); @@ -55,7 +55,7 @@ public class GroupManagerIT extends BaseFunctionalTestCase { } } - s.clickTo(By.id("submit")); + s.click(By.id("submit")); //校验结果 assertTrue(s.isTextPresent("创建权限组" + group.getName() + "成功")); @@ -63,8 +63,8 @@ public class GroupManagerIT extends BaseFunctionalTestCase { } private void verifyGroup(Group group) { - s.clickTo(By.linkText(Gui.MENU_GROUP)); - s.clickTo(By.id("editLink-" + group.getName())); + s.click(By.linkText(Gui.MENU_GROUP)); + s.click(By.id("editLink-" + group.getName())); assertEquals(group.getName(), s.getValue(By.id("name"))); List checkBoxes = s.findElements(By.name("permissionList")); diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/SecurityIT.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/SecurityIT.java index 81ebcc24..d4509bf8 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/SecurityIT.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/SecurityIT.java @@ -41,10 +41,10 @@ public class SecurityIT extends BaseFunctionalTestCase { //登录普通用户 s.type(By.name("username"), "user"); s.type(By.name("password"), "user"); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); //校验用户权限组的操作单元格只有查看 - s.clickTo(By.linkText(Gui.MENU_USER)); + s.click(By.linkText(Gui.MENU_USER)); assertEquals("", s.getTable(By.id("contentTable"), 1, UserColumn.OPERATIONS.ordinal())); } } diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/UserManagerIT.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/UserManagerIT.java index bf66d577..9355d6db 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/UserManagerIT.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/functional/account/UserManagerIT.java @@ -28,7 +28,7 @@ public class UserManagerIT extends BaseFunctionalTestCase { */ @Test public void viewUserList() { - s.clickTo(By.linkText(Gui.MENU_USER)); + s.click(By.linkText(Gui.MENU_USER)); WebElement table = s.findElement(By.id("contentTable")); assertEquals("admin", s.getTable(table, 1, UserColumn.LOGIN_NAME.ordinal())); assertEquals("Admin", s.getTable(table, 1, UserColumn.NAME.ordinal())); @@ -41,8 +41,8 @@ public class UserManagerIT extends BaseFunctionalTestCase { @Test public void createUser() { //打开新增用户页面 - s.clickTo(By.linkText(Gui.MENU_USER)); - s.clickTo(By.linkText("创建用户")); + s.click(By.linkText(Gui.MENU_USER)); + s.click(By.linkText("创建用户")); //生成待输入的测试用户数据 User user = AccountData.getRandomUserWithGroup(); @@ -61,7 +61,7 @@ public class UserManagerIT extends BaseFunctionalTestCase { } } - s.clickTo(By.id("submit")); + s.click(By.id("submit")); //校验结果 assertTrue(s.isTextPresent("创建用户" + user.getLoginName() + "成功")); @@ -73,7 +73,7 @@ public class UserManagerIT extends BaseFunctionalTestCase { */ private void verifyUser(User user) { - s.clickTo(By.id("editLink-" + user.getLoginName())); + s.click(By.id("editLink-" + user.getLoginName())); assertEquals(user.getLoginName(), s.getValue(By.id("loginName"))); assertEquals(user.getName(), s.getValue(By.id("name"))); @@ -103,8 +103,8 @@ public class UserManagerIT extends BaseFunctionalTestCase { */ @Test public void inputInValidateUser() { - s.clickTo(By.linkText(Gui.MENU_USER)); - s.clickTo(By.linkText("创建用户")); + s.click(By.linkText(Gui.MENU_USER)); + s.click(By.linkText("创建用户")); s.type(By.id("loginName"), "admin"); s.type(By.id("name"), ""); @@ -112,7 +112,7 @@ public class UserManagerIT extends BaseFunctionalTestCase { s.type(By.id("passwordConfirm"), "abc"); s.type(By.id("email"), "abc"); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); Threads.sleep(2000); diff --git a/examples/mini-web/src/test/resources/web.xml b/examples/mini-web/src/test/resources/web.xml index 271e78d8..f7af7019 100644 --- a/examples/mini-web/src/test/resources/web.xml +++ b/examples/mini-web/src/test/resources/web.xml @@ -10,7 +10,7 @@ contextConfigLocation - classpath*:/applicationContext-test.xml + classpath*:/applicationContext.xml classpath*:/applicationContext-shiro.xml @@ -50,7 +50,6 @@ /* - shiroFilter diff --git a/examples/showcase/src/test/java/org/springside/examples/showcase/functional/ajax/AjaxIT.java b/examples/showcase/src/test/java/org/springside/examples/showcase/functional/ajax/AjaxIT.java index 846cd720..6f40d678 100644 --- a/examples/showcase/src/test/java/org/springside/examples/showcase/functional/ajax/AjaxIT.java +++ b/examples/showcase/src/test/java/org/springside/examples/showcase/functional/ajax/AjaxIT.java @@ -16,10 +16,10 @@ public class AjaxIT extends BaseSeleniumTestCase { @Test public void mashup() { s.open("/"); - s.clickTo(By.linkText("Web演示")); - s.clickTo(By.linkText("跨域名Mashup演示")); + s.click(By.linkText("Web演示")); + s.click(By.linkText("跨域名Mashup演示")); - s.clickTo(By.xpath("//input[@value='获取内容']")); + s.click(By.xpath("//input[@value='获取内容']")); s.waitForVisible(By.id("mashupContent"), 5000); assertEquals("Hello World!", s.getText(By.id("mashupContent"))); } diff --git a/examples/showcase/src/test/java/org/springside/examples/showcase/functional/common/UserManagerIT.java b/examples/showcase/src/test/java/org/springside/examples/showcase/functional/common/UserManagerIT.java index dc7654dc..41cb9fe2 100644 --- a/examples/showcase/src/test/java/org/springside/examples/showcase/functional/common/UserManagerIT.java +++ b/examples/showcase/src/test/java/org/springside/examples/showcase/functional/common/UserManagerIT.java @@ -16,20 +16,20 @@ public class UserManagerIT extends BaseSeleniumTestCase { @Test public void editUser() { s.open("/"); - s.clickTo(By.linkText("综合演示")); - s.clickTo(By.id("editLink-user")); + s.click(By.linkText("综合演示")); + s.click(By.id("editLink-user")); //修改用户需要登录管理员权限 s.type(By.name("username"), "admin"); s.type(By.name("password"), "admin"); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); //点击提交按钮 s.type(By.name("name"), "user_foo"); - s.clickTo(By.id("submit")); + s.click(By.id("submit")); //重新进入用户修改页面, 检查最后修改者 - s.clickTo(By.id("editLink-user")); + s.click(By.id("editLink-user")); assertEquals("user_foo", s.getValue(By.name("name"))); } } diff --git a/modules/core/src/main/java/org/springside/modules/test/functional/Selenium2.java b/modules/core/src/main/java/org/springside/modules/test/functional/Selenium2.java index d967fbe6..e6c0c25f 100644 --- a/modules/core/src/main/java/org/springside/modules/test/functional/Selenium2.java +++ b/modules/core/src/main/java/org/springside/modules/test/functional/Selenium2.java @@ -6,15 +6,15 @@ package org.springside.modules.test.functional; import java.util.List; +import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebDriverBackedSelenium; import org.openqa.selenium.WebElement; -import org.springside.modules.utils.Threads; - -import com.thoughtworks.selenium.Selenium; +import org.openqa.selenium.support.ui.ExpectedCondition; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; /** * 融合了Selenium 1.0 API与Selenium 2.0的By选择器的API. @@ -23,32 +23,30 @@ import com.thoughtworks.selenium.Selenium; */ public class Selenium2 { - public static final int DEFAULT_TIMEOUT = 5000; - public static final int DEFAULT_PAUSE_TIME = 250; - + public static int DEFAULT_WAIT_TIME = 20; private WebDriver driver; - private Selenium selenium; - private int defaultTimeout = DEFAULT_TIMEOUT; + private String baseUrl; public Selenium2(WebDriver driver, String baseUrl) { this.driver = driver; - this.selenium = new WebDriverBackedSelenium(driver, baseUrl); + this.baseUrl = baseUrl; + setImplicitlyWait(DEFAULT_WAIT_TIME); } /** * 不设置baseUrl的构造函数, 调用open函数时必须使用绝对路径. */ public Selenium2(WebDriver driver) { - this(driver, ""); + this(driver, null); } + // Driver 函數 // /** * 打开地址,如果url为相对地址, 自动添加baseUrl. - * @param url */ public void open(String url) { - selenium.open(url); - waitForPageToLoad(); + final String urlToOpen = url.indexOf("://") == -1 ? baseUrl + (!url.startsWith("/") ? "/" : "") + url : url; + driver.get(urlToOpen); } /** @@ -59,12 +57,28 @@ public class Selenium2 { } /** - * 获取页面地址. + * 退出Selenium. */ - public String getLocation() { - return driver.getCurrentUrl(); + public void quit() { + driver.quit(); } + /** + * 设置如果查找不到Element时的默认最大等待时间。 + */ + public void setImplicitlyWait(int seconds) { + driver.manage().timeouts().implicitlyWait(seconds, TimeUnit.SECONDS); + } + + /** + * 获取WebDriver实例, 调用未封装的函数. + */ + public WebDriver getDriver() { + return driver; + } + + //Elemenet 函數// + /** * 查找Element. */ @@ -79,17 +93,10 @@ public class Selenium2 { return driver.findElements(by); } - /** - * 判断页面内是否存在文本内容. - */ - public boolean isTextPresent(String text) { - return selenium.isTextPresent(text); - } - /** * 判断页面内是否存在Element. */ - public boolean isElementPresent(By by) { + public boolean isPresent(By by) { try { driver.findElement(by); return true; @@ -121,14 +128,6 @@ public class Selenium2 { driver.findElement(by).click(); } - /** - * 点击Element, 跳转到新页面. - */ - public void clickTo(By by) { - driver.findElement(by).click(); - waitForPageToLoad(); - } - /** * 选中Element. */ @@ -168,7 +167,7 @@ public class Selenium2 { */ public boolean isChecked(By by) { WebElement element = driver.findElement(by); - return element.isSelected(); + return isChecked(element); } /** @@ -199,6 +198,47 @@ public class Selenium2 { return element.getAttribute("value"); } + // WaitFor 函數 // + /** + * 等待Element的内容可见, timeout单位为秒. + */ + public void waitForVisible(By by, int timeout) { + (new WebDriverWait(driver, timeout)).until(ExpectedConditions.visibilityOfElementLocated(by)); + } + + /** + * 等待Element的内容为text, timeout单位为秒. + */ + public void waitForTextPresent(By by, String text, int timeout) { + (new WebDriverWait(driver, timeout)).until(ExpectedConditions.textToBePresentInElement(by, text)); + } + + /** + * 等待Element的value值为value, timeout单位为秒. + */ + public void waitForValuePresent(By by, String value, int timeout) { + (new WebDriverWait(driver, timeout)).until(ExpectedConditions.textToBePresentInElementValue(by, value)); + } + + /** + * 等待其他Conditions, timeout单位为秒. + * + * @see ExpectedConditions + */ + public void waitForCondition(ExpectedCondition conditon, int timeout) { + (new WebDriverWait(driver, timeout)).until(conditon); + } + + // Selenium1.0 函數 // + + /** + * 简单判断页面内是否存在文本内容. + */ + public boolean isTextPresent(String text) { + String bodyText = driver.findElement(By.tagName("body")).getText(); + return bodyText.contains(text); + } + /** * 取得单元格的内容, 序列从0开始, Selnium1.0的常用函数. */ @@ -212,61 +252,4 @@ public class Selenium2 { public String getTable(By by, int rowIndex, int columnIndex) { return getTable(driver.findElement(by), rowIndex, columnIndex); } - - /** - * 等待页面载入完成, timeout时间为defaultTimeout的值. - */ - public void waitForPageToLoad() { - waitForPageToLoad(defaultTimeout); - } - - /** - * 等待页面载入完成, timeout单位为毫秒. - */ - public void waitForPageToLoad(int timeout) { - selenium.waitForPageToLoad(String.valueOf(timeout)); - } - - /** - * 等待Element的内容展现, timeout单位为毫秒. - */ - public void waitForVisible(By by, int timeout) { - long timeoutTime = System.currentTimeMillis() + timeout; - while (System.currentTimeMillis() < timeoutTime) { - if (isDisplayed(by)) { - return; - } - Threads.sleep(DEFAULT_PAUSE_TIME); - } - throw new RuntimeException("waitForVisible timeout"); - } - - /** - * 退出Selenium. - */ - public void quit() { - driver.close(); - driver.quit(); - } - - /** - * 获取WebDriver实例, 调用未封装的函数. - */ - public WebDriver getDriver() { - return driver; - } - - /** - * 获取Selenium实例,调用未封装的函数. - */ - public Selenium getSelenium() { - return selenium; - } - - /** - * 设置默认页面超时. - */ - public void setDefaultTimeout(int defaultTimeout) { - this.defaultTimeout = defaultTimeout; - } }