之前在写一个测试用例的时候,就有发现点击提交按钮不起作用,今天又遇到点击链接也不起作用的情况。经过一些尝试,暂时已通过其他方式解决。
1. 软件版本
1) 操作系统:Win7 旗舰版(64位)
2) JDK:1.7
3) Eclipse:Mars Release (4.5.0) Eclipse Java EE IDE for Web Developers
4) Eclipse TestNG插件:org.testng.eclipse_6.9.5.201506120235
5) Webdriver:selenium-java-2.46.0
6) IEDriverServer.exe
2. 被测对象说明
为了说明问题,我以一个简单的登陆流程作为测试对象:登陆页面,如果用户密码正确则提交后跳转到登陆成功页面,否则跳转到登陆失败页面,登陆失败页面有一个链接,点击后跳转到登陆界面。下面是各页面的代码。
2.1 登陆页面
点击(此处)折叠或打开
- <%@ page language="java"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8"%>
- <% String path = request.getContextPath(); %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>系统登录</title>
- </head>
- <body>
- <center>
- <h1>系统登录</h1>
- <hr>
- <form name="loginForm" action="<%=path%>/login.action" method="post">
- 用户名:<input type="text" name="username" /><br>
- 密码:<input type="password" name="password" /><br>
- <input type="submit" value="登录" id="btnLogin" name="btnLogin" /><br>
- </form>
- </center>
- </body>
- </html>
2.2 登陆成功页面
点击(此处)折叠或打开
- <%@ page language="java"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>登录成功</title>
- </head>
- <body>
- <center>
- <h1>登录成功</h1>
- <hr>
- </center>
- </body>
- </html>
2.3 登陆失败页面
点击(此处)折叠或打开
- <%@ page language="java" import="java.util.*"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8"%>
- <% String path = request.getContextPath(); %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>登录失败</title>
- </head>
- <body>
- <center>
- <h1>登录失败</h1>
- <hr>
- <a class="return" href="<%=path%>/login.jsp">返回</a>
- </center>
- </body>
- </html>
3. 点击提交按钮不起作用
一开始我针对登陆成功的测试用例是这样写的:
点击(此处)折叠或打开
- @Test
- public void loginSuccessTest() {
- System.setProperty("webdriver.ie.driver", System.getProperty("user.dir")+"\\IEDriverServer.exe");
- WebDriver driver = new InternetExplorerDriver();
- driver.get("http://127.0.0.1:8080/ Login/");
- driver.manage().window().maximize();
-
- CharSequence[] csUser = new CharSequence[1];
- csUser[0] = "admin";
- driver.findElement(By.name("username")).sendKeys(csUser);
-
- CharSequence[] csPW = new CharSequence[1];
- csPW[0] = "123456";
- driver.findElement(By.name("password")).sendKeys(csPW);
-
- driver.findElement(By.name("btnLogin ")).click();
-
- String excepted = "登录成功";
- String actual = driver.getTitle();
- assertEquals(actual, excepted);
-
- driver.close();
-
- try{
- Runtime.getRuntime().exec("tskill IEDriverServer");
- }catch(IOException ie){
- System.out.println("failed to close IEDriverServer......");
- ie.printStackTrace();
- }
- }
但执行这个用例,并没有点击【登录】按钮,执行到填写完两个文本输入框后就停止了,然后就关闭了,用例报错,说获取到的是【系统登录】而非期望的【登陆成功】。但没有报空指针异常,也就是说,submit按钮是获取到的,然后我又把click()改为submit(),即:
点击(此处)折叠或打开
- driver.findElement(By.name("btnLogin ")).submit ();
执行后还是一样一样的结果。
后来查到一篇关于click()和submit()区别的帖子[1],说click()只能用于submit按钮,而submit()可以用于form中的所有element,包括form本身。于是修改代码为:
点击(此处)折叠或打开
- driver.findElement(By.name("loginForm ")).submit ();
执行成功。
4. 点击链接不起作用
在测试失败页面点击【返回】连接跳转回登陆页面的用例中,又遇到点击后不起作用的问题。
点击(此处)折叠或打开
- @Test
- public void returnTest() {
- System.setProperty("webdriver.ie.driver", System.getProperty("user.dir")+"\\IEDriverServer.exe");
- driver = new InternetExplorerDriver();
- driver.get("http://127.0.0.1:8080/Login/login_failure.jsp");
- driver.manage().window().maximize();
-
- driver.findElement(By.xpath("//a[@class='return']")).click();
- String excepted = "系统登录";
- String actual = driver.getTitle();
- assertEquals(actual, excepted);
-
- driver.close();
-
- try{
- Runtime.getRuntime().exec("tskill IEDriverServer");
- }catch(IOException ie){
- System.out.println("failed to close IEDriverServer......");
- ie.printStackTrace();
- }
- }
这个就没法用上面submit按钮的方法了,于是我想,如果能将焦点设置到这个连接上,然后按【Enter】键,和点击的效果是一样的。于是我参考了资料[2],将代码修改为:
点击(此处)折叠或打开
- WebElement element = driver.findElement(By.xpath("//a[@class='return']"));
- Actions action = new Actions(driver);
- action.contextClick(element).perform();
- element.sendKeys(Keys.ESCAPE);
- element.sendKeys(Keys.ENTER);
这是用在连接上点击右键,然后按【ESC】键来设置焦点的,没有直接设置焦点的方法。有一点很奇怪,Actions的click()和doubleClick(),及单击和双击都不起作用,只有右键contextClick()起作用。另:Actions类在org.openqa.selenium.interactions下面。
还有记得在断言之前,间隔一两秒,不然会没操作完成,就去获取title了,然后断言失败。
5. 用处理连接的方法处理提交按钮
处理链接的方法,是否能用到submit按钮上呢?试试就知道了
点击(此处)折叠或打开
- WebElement element = driver.findElement(By.name("btnLogin"));
- Actions action = new Actions(driver);
- action.contextClick(element).perform();
- element.sendKeys(Keys.ESCAPE);
- element.sendKeys(Keys.ENTER);
参考资料
[1] Selenium Webdriver submit() vs click() http://stackoverflow.com/questions/17530104/selenium-webdriver-submit-vs-click
[2] webDriver中如何给元素设置焦点 http://www.ltesting.net/ceshi/open/kygncsgj/selenium/2013/0115/205906.html