3. WebDriver中点击按钮、连接无效问题
之前在写一个测试用例的时候,就有发现点击提交按钮不起作用,今天又遇到点击链接也不起作用的情况。经过一些尝试,暂时已通过其他方式解决。
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" " style="color:#0000CC;">>
-
<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" " style="color:#0000CC;">>
-
<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" " style="color:#0000CC;">>
-
<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(" 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("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()
[2] webDriver中如何给元素设置焦点
阅读(5876) | 评论(0) | 转发(0) |