资源描述
Selenium RC使用技巧
版本:V1.0
日期:2008-8-5
作者:夏辉(xiahui_1@)
14
本文档所有例子,请参照”jspNews”项目。
1、HTML元素定位
描述分为以下五种方式:
1、以ID号定位
selenium.click(“id=idOfThing”);
2、以名称定位
selenium.click(“name=nameOfThing”);
3、以Xpath定位,Xpath是一套标准规范
selenium.click(“xpath=//img[@alt='The image alt text']”);
4、以DOM定位
selenium.click(“dom=document.images[56]” );
5、以link方式定位
selenium.click(“link=Test Page For Selenium”);
6、以CSS方式定位
selenium.click(“css=span#firstChild”);
2. frameset操作技巧
2.1 获取当前frameset网页
比如当前网页(index.html)是frameset网页,frameset布局如下:
index=1
name= leftFrame
index=0 name= topFrame
index=2
name= rightFrame
当显示index.html时,可以通过下列语句判断是否是index.html网页:
this.sel.open("http://localhost:8080/jspNews");
org.junit.Assert.assertEquals("testone", this.sel.getTitle());
具体参见:IndexTest.java -> testIndexPageExist()
2.2 获取当前frameset中子网页
用户可以通过当前frameset网页获取其中的子网页,代码如下:
this.sel.selectFrame("index=1");
或者
this.sel.selectFrame("leftFrame ");
例如:查看用户是否已登录
leftFrame首先显示的是登录网页(login.jsp),如果用户输入正确的用户名和密码,则leftFrame显示该用户的功能操作网页(left.html)。
//首先显示index.html网页
this.sel.open("http://localhost:8080/jspNews");
//输入用户名和密码
sel.type("name=name", "admin");
sel.type("name=pwd", "123456");
//模拟点击确定按钮
sel.click("name=btnsub");
//最多等待10秒
sel.waitForPageToLoad("10000");
//选择index=1的子网页,即frameset=leftFrame区的网页
this.sel.selectFrame("index=1");
//判断该网页的标题是否是leftwindow
org.junit.Assert.assertEquals("leftwindow",this.sel.getTitle());
具体参见:IndexTest.java -> testLoginSuccess ()
2.3 从framework中的子网页跳到主网页
如果用户使用了
this.sel.selectFrame("index=1");
从默认的主网页跳转到了子网页,那么可以通过下列语句返回到主网页。
this.sel.selectFrame("relative=parent");
3. html文本框操作技巧
3.1 模拟输入文本,并判定
//对文本框赋值
this.sel.type("name=Tname","夏天");
//将文本框的值赋给textValue
String textValue=this.sel.getValue("name=Tname");
org.junit.Assert.assertEquals( "夏天", textValue);
具体参见:formExampleTest.java -> testtextFrame ()
4. html下拉列表框操作技巧
4.1 判断下拉框的所有数据项是否和期望相同
首先建立期望的数据项,如下所示:
String[] expectProfessions=new String[3];
expectProfessions[0]="计算机";
expectProfessions[1]="文学";
expectProfessions[2]="数学";
再从当前网页的下拉框中读取所有的数据项:
String[] actualProfessions=this.sel.getSelectOptions("profession");
利用junit4 独有的数组判定函数进行比较
org.junit.Assert.assertArrayEquals("下拉框出错", expectProfessions, actualProfessions);
具体参见:formExampleTest.java -> testSelectFrame ()
4.2模拟用户选择一个数据项,并判定
首先模拟用户选择一个数据项,如下所示:
//将名为profession的下拉框,选择第一个数据项
this.sel.select("name=profession", "index=1");
1、网页不提交,判定模拟选择的数据项的名字
String selectName=sel.getSelectedLabel("name=profession");
org.junit.Assert.assertEquals("文学", selectName);
2、网页不提交,判定模拟选择的数据项的值
String selectName=sel.getSelectedValue("name=profession");
org.junit.Assert.assertEquals("文学", selectName);
3、网页提交后,判定模拟选择的数据项的值
this.sel.click("btnSub");
this.sel.waitForPageToLoad("5000");
org.junit.Assert.assertTrue("下拉框没有选择 文学", this.sel.isTextPresent("文学-2"));
具体参见:formExampleTest.java -> testSelectFrame ()
5. html复选框操作技巧
5.1 模拟选中一个复选框,并判定
首先模拟用户选中复选框,并判定
//模拟用户选中数据项-体育
this.sel.check("name=Tch1");
//判定是否选中
boolean selected=this.sel.isChecked("name=Tch1");
org.junit.Assert.assertEquals(true, selected);
具体参见:formExampleTest.java -> testCheckbox()
5.2 模拟取消选中一个复选框,并判定
首先模拟用户选中复选框,再模拟取消选中,并判定
//模拟用户选中数据项-体育
this.sel.check("name=Tch1");
//模拟用户取消选中数据项-体育
this.sel.uncheck("name=Tch1");
//判定是否选中
boolean selected=this.sel.isChecked("name=Tch1");
org.junit.Assert.assertEquals(false, selected);
具体参见:formExampleTest.java -> testCheckbox()
6. html列表框操作技巧
6.1判断列表框的所有数据项是否和期望相同
首先建立期望的数据项,如下所示:
String[] expectSports=new String[3];
expectSports[0]="羽毛球";
expectSports[1]="乒乓球";
expectSports[2]="篮球";
再从当前网页的列表框中读取所有的数据项:
String[] actualSports=this.sel.getSelectOptions("sport");
利用junit4 独有的数组判定函数进行比较
org.junit.Assert.assertArrayEquals("下拉框出错", expectProfessions, actualProfessions);
注意:
expectSports数组中元素的顺序必须和网页上的顺序一致,否则出错
具体参见:formExampleTest.java -> testListFrame ()
6.2判断列表框是否有数据被选中
//判断列表框是否有数据被选中org.junit.Assert.assertFalse(this.sel.isSomethingSelected("name=sport"));
6.3模拟用户选择多个数据项,并判定
模拟用户选择数据项有二种方式:
this.sel.addSelection("name=sport", "index=0");
this.sel.addSelection("name=sport", "label=乒乓球");
建立期望的数据项,如下所示:
String[] expectSports=new String[2];
expectSports[0]="羽毛球";
expectSports[1]="乒乓球";
判定期望结果与实际结果是否一致,有二种方式:
第一种方式
//读取选中的数据项
String[] selectValues = this.sel.getSelectedLabels("name=sport");
org.junit.Assert.assertArrayEquals("列表框出错", expectSports,selectValues);
第二种方式
//期望结果初始化
String[] expectSports=new String[2];
expectSports[0]="1";
expectSports[1]="2";
//读取选中的数据项
String[] selectValues = this.sel.getSelectedValues("name=sport");
org.junit.Assert.assertArrayEquals("列表框出错",expectSports, selectValues);
7. html单选按钮操作技巧
7.1判定是否有单选按钮被选中
//判定是否有单选项选中-第一种方法
boolean selected=this.sel.isChecked("name=Tsex");
org.junit.Assert.assertEquals(true, selected);
//判定是否有单选项选中-第二种方法
String selectedValue =this.sel.getValue("name=Tsex");
org.junit.Assert.assertEquals("on", selectedValue);
具体参见:formExampleTest.java -> testRadio()
7.2 模拟用户选中一个数据项,并判定
首先模拟用户选中一个单选按钮,并判定
//模拟用户选中单选项-女,并判定
this.sel.check("name=Tsex value=女");
boolean selected=this.sel.isChecked("name=Tsex value=女");
org.junit.Assert.assertEquals(true, selected);
具体参见:formExampleTest.java -> testRadio()
8. 验证技巧
8.1判断页面是否存在一个元素
只需打开网页,利用下列语句进行判定,比如验证文本框是否存在
/验证文本框--姓名 是否存在
org.junit.Assert.assertTrue(this.sel.isElementPresent("name=Tname"));
具体参见:formExampleTest.java -> testIsExist()
8.2 处理js的Alert提示
例:比如有一个文本框用来输入年龄,现通过javascript的onBlur事件来检查输入的数据是否是数字,如果不是,用alert,显示“请输入数字内容”。
1、利用focus()确定当前网页焦点,输入数据
//找到文本框--年龄,此语句必不可少
this.sel.focus("name=age");
// 对文本框赋值
this.sel.type("name=age", "汉字233");
2、将焦点转移
//将焦点跳转到文本框--姓名时,利用onblue事件自动检查年龄
this.sel.focus("name=Tname");
3、验证是否出现alert,如果出现,抓住后处理
if(this.sel.isAlertPresent()){
org.junit.Assert.assertEquals("请输入数字内容", this.sel.getAlert());
}
else
org.junit.Assert.fail();
具体参见:formExampleTest.java -> testAlert()
newWindowTest.java -> testAlert()
注意:
getAlert()作用是返回警告窗口内的警告内容,并且模拟用户点击”确定”。
Alert函数只能处理一次,即不能出现两次getAlert,否则第二次调用getAlert失败
8.3 处理js的confirm提示
当selenium处理js的confirm()时,默认自动模拟选择”确定”按钮,如果用户想自动模拟选择”取消”按钮,可使用chooseCancelOnNextConfirmation
//如果不使用chooseCancelOnNextConfirmation语句,模拟用户点击"确定",否则模拟用户点击"取消"
//this.sel.chooseCancelOnNextConfirmation();
this.sel.focus("name=btnsm2");
this.sel.click("name=btnsm2");
// 由于点击"取消",窗体弹出一个alert,所以这里进行判断
if (!this.sel.isAlertPresent()) {
org.junit.Assert.assertEquals("表单例子",this.sel.getTitle());
} else {
org.junit.Assert
.assertEquals("你按了取消,那就是返回false", this.sel.getAlert());
}
具体参见:newWindowTest.java -> testConfirm()
8.4 处理js的prompt提示
如果js中包含prompt(),则可使用answerOnNextPrompt模拟用户输入
this.sel.open("http://localhost:8080/jspNews/NewWindow.html");
//使用answerOnNextPrompt模拟用户输入
this.sel.answerOnNextPrompt("北京");
this.sel.focus("name=btnsm3");
this.sel.click("name=btnsm3");
// 自动模拟点击"确定",窗体弹出一个alert,所以这里进行判断
if (this.sel.isAlertPresent()) {
org.junit.Assert.assertEquals("欢迎您:北京",this.sel.getAlert());
} else {
org.junit.Assert.fail();
}
具体参见:newWindowTest.java -> testPromt()
8.5 验证html元素的属性
我们可以通过ID号、name或数组方式获取html元素的属性
// 验证属性|id1@class|a1
org.junit.Assert.assertEquals("a1", this.sel.getAttribute("id1@class"));
// 验证属性|name1@class|a2
org.junit.Assert.assertEquals("a2",this.sel.getAttribute("name1@class"));
// 以数组方式验证属性|document.links[1]@class|a2
org.junit.Assert.assertEquals("a2",this.sel.getAttribute("document.links[1]@class"));
具体参见:AttributeTest.java -> testAttribute ()
9. 弹出窗体
9.1判断是否存在弹出窗体
模拟用户单击button按钮,触发js
<script type="text/javascript">
function openWindow() {
var refmyPopWindow=window.open('./test_select_window_popup.html', 'myPopupWindowTitle', 'height=200,width=500,top=400,left=50');
}
</script>
<button id="popupPage" onclick="openWindow();">弹出一个窗体</button>
JS中的open函数:
第一个参数:网址
第二个参数:新网页的名称
第三个参数:网页的状态,比如大小,界面等
返回值:新窗体的引用
测试是否弹出窗体代码如下:
this.sel.open("http://localhost:8080/jspNews/test_select_window.html");
// 点击按钮,用js的window.open弹出一个窗体
this.sel.click("popupPage");
// 等待5秒,弹出名为myPopupWindow的窗体
this.sel.waitForPopUp("myPopupWindowTitle", "5000");
// 将弹出的窗体设置为当前窗体
this.sel.selectWindow("myPopupWindowTitle");
// this.sel.selectWindow("弹出的窗体");
org.junit.Assert.assertEquals("http://localhost:8080/jspNews/test_select_window_popup.html",this.sel.getLocation());
说明:
selectWindow函数
第一个参数:可以是窗体的名称,比如myPopupWindowTitle;可以是窗体title,比如弹出的窗体;
具体参见:popWindowTest.java -> testIsExistPopWindow ()
9.2测试关闭弹出的子窗体,并将子窗体的值传给父窗体
模拟用户单击button按钮,触发js的open(),打开子窗体。
在子窗体的文本框内输入数据,模拟用户点击关闭按钮,将子窗体中文本框的值传给父窗体
this.sel.click("popupPage");
// 等待5秒,弹出名为myPopupWindow的窗体
this.sel.waitForPopUp("myPopupWindowTitle", "5000");
// 将弹出的子窗体设置为当前窗体
this.sel.selectWindow("弹出的窗体");
// 对子窗体文本框赋值
this.sel.type("name=txtchildname", "夏天");
//点击子窗体的关闭按钮
this.sel.click("id=btnClosePage");
//将当前窗体设置为父窗体
this.sel.selectWindow("主窗体");
//从父窗体的文本框读取数据,准备验证
String textValue = this.sel.getValue("name=txtParentName");
org.junit.Assert.assertEquals("夏天", textValue);
具体参见:popWindowTest.java -> testCloseChildPage()
9.3子窗体上加载一个新网页
本例通过超链接方式,在子窗体上重新加载一个新网页,并验证
this.sel.open("http://localhost:8080/jspNews/test_select_window.html");
// 点击按钮,用js的window.open弹出一个窗体
this.sel.click("popupPage");
// 等待5秒,弹出名为myPopupWindow的窗体
this.sel.waitForPopUp("myPopupWindowTitle", "5000");
// 将弹出的窗体设置为当前窗体
this.sel.selectWindow("弹出的窗体");
//通过超链接加载新的网页
this.sel.click("link=加载一个新网页");
this.sel.waitForPageToLoad("30000");
org.junit.Assert.assertEquals("重载窗体",this.sel.getTitle());
具体参见:popWindowTest.java -> testReloadChildPage ()
10. html超链接操作技巧
10.1 点击超链接到新网页
//通过超链接加载新的网页
this.sel.click("link=加载一个新网页");
this.sel.waitForPageToLoad("30000");
具体参见:JsTest.java -> testJSPage ()
10.2 包含JS的超链接
如下所示:
<a id="link" href="javascript:alert('link clicked: ' + foo)">link</a>
可通过下列代码测试:
// 模拟用户点击超链接
this.sel.click("link");
org.junit.Assert.assertEquals("link clicked: foo", this.sel.getAlert());
具体参见:JsTest.java -> testJSPage ()
10.3包含三个alert()的超链接
如下所示:
<a id="linkWithMultipleJavascriptStatements"
href="javascript: alert('alert1'); alert('alert2') ; alert ('alert3')">link with multiple javascript calls</a>
利用getAlert()函数,分别进行验证:
// 点击带JS的超链接,包含三个alert
this.sel.click("linkWithMultipleJavascriptStatements");
org.junit.Assert.assertEquals("alert1", this.sel.getAlert());
org.junit.Assert.assertEquals("alert2", this.sel.getAlert());
org.junit.Assert.assertEquals("alert3", this.sel.getAlert());
具体参见:JsTest.java -> testJSPage ()
10.4多个超链接
如果一个网页上出现了多个超链接元素,一般可通过其ID或name识别,selenium也将多个超链接看成一个数组,例如网页上存在多个超链接
<a id="id1" href="#id1" class="a1">this is the first element</a>
<!-- DO NOT DELETE THIS COMMENT: see SEL-68 -->
<a id="id2" name="name1" href="#id2" class="a2" alt="foo">this is
the <b>second</b> <span selenium:foo="bar">element</span>
</a>
我们利用下列代码验证
org.junit.Assert.assertEquals("this is the second element", this.sel.getText("document.links[1]"));
具体参见:AttributeTest.java -> testArrayHtml()
11. 其它操作技巧
11.1 模拟用户点击浏览器上的“后退”按钮
this.sel.goBack();
this.sel.waitForPageToLoad("5000");
11.2 让网页暂停
pause(1000);//1秒
12 让RC模式支持FIT模式
Selenium FIT mode和RC mode下的命令有些许差异,比如FIT中的assertTextPresent,在RC中变成了isTextPresent。同样还有FIT中最实用的命令clickAndWait,在RC中变成了click和waitForPageToLoad。在RC中使用FIT mode中的命令也非难事,找到com.thoughtworks.selenium.Selenium,添加方法:
public void doCommand(String commmand, String parameters);
然后在com.thoughtworks.selenium.DefaultSelenium中添加实现:
public void doCommand(String commmand, String parameters) {
String[] paras = new String[] { "" , "" , "" }
for ( int i = 0 ; i < parameters.length && i < 3 ; i ++ )
paras[i] = parameters[i];
commandProcessor.doCommand(command, paras);
然后试验一下:
selenium.doCommand( " clickAndWait " );
展开阅读全文