1、1Selenium RC 使用技巧版本:V1.0日期:2008-8-5作者:夏辉 (xiahui_)2本文档所有例子,请参照”jspNews” 项目。1、HTML 元素定位描述分为以下五种方式:1、以 ID 号定位selenium.click(“id=idOfThing”);2、以名称定位 selenium.click(“name=nameOfThing”); 3、以 Xpath 定位,Xpath 是一套标准规范selenium.click(“xpath=/imgalt=The image alt text”); 4、以 DOM 定位selenium.click(“dom=document.i
2、mages56” ); 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.html 时,可以通过下列语句判断是否是 index.html 网页:this.sel.open(“http:/localhost:8080/jspNews“);ind
3、ex=2name= rightFrameindex=0 name= topFrameindex=1name= leftFrame3org.junit.Assert.assertEquals(“testone“, this.sel.getTitle();具体参见:IndexTest.java - testIndexPageExist()2.2 获取当前 frameset 中子网页用户可以通过当前 frameset 网页获取其中的子网页,代码如下:this.sel.selectFrame(“index=1“);或者this.sel.selectFrame(“leftFrame “);例如:查看用户
4、是否已登录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“);/选择i
5、ndex=1的子网页,即frameset=leftFrame区的网页this.sel.selectFrame(“index=1“);/判断该网页的标题是否是leftwindoworg.junit.Assert.assertEquals(“leftwindow“,this.sel.getTitle();具体参见:IndexTest.java - testLoginSuccess ()2.3 从 framework 中的子网页跳到主网页如果用户使用了this.sel.selectFrame(“index=1“);从默认的主网页跳转到了子网页,那么可以通过下列语句返回到主网页。this.sel.se
6、lectFrame(“relative=parent“);43. html 文本框操作技巧3.1 模拟输入文本,并判定/对文本框赋值this.sel.type(“name=Tname“,“夏天“);/将文本框的值赋给textValueString textValue=this.sel.getValue(“name=Tname“);org.junit.Assert.assertEquals( “夏天“, textValue);具体参见:formExampleTest.java - testtextFrame ()4. html 下拉列表框操作技巧4.1 判断下拉框的所有数据项是否和期望相同首先建
7、立期望的数据项,如下所示:String expectProfessions=new String3;expectProfessions0=“计算机“ ;expectProfessions1=“文学“ ;expectProfessions2=“数学“ ;再从当前网页的下拉框中读取所有的数据项:String actualProfessions=this.sel.getSelectOptions(“profession“);利用 junit4 独有的数组判定函数进行比较org.junit.Assert.assertArrayEquals(“下拉框出错“ , expectProfessions, ac
8、tualProfessions);具体参见:formExampleTest.java - testSelectFrame ()4.2 模拟用户选择一个数据项,并判定首先模拟用户选择一个数据项,如下所示:/将名为 profession 的下拉框,选择第一个数据项this.sel.select(“name=profession“, “index=1“);1、网页不提交,判定模拟选择的数据项的名字String selectName=sel.getSelectedLabel(“name=profession“);org.junit.Assert.assertEquals(“文学“ , selectNa
9、me);2、网页不提交,判定模拟选择的数据项的值String selectName=sel.getSelectedValue(“name=profession“);5org.junit.Assert.assertEquals(“文学“ , selectName);3、网页提交后,判定模拟选择的数据项的值this.sel.click(“btnSub“);this.sel.waitForPageToLoad(“5000“);org.junit.Assert.assertTrue(“下拉框没有选择 文学“, this.sel.isTextPresent(“文学-2“ );具体参见:formExamp
10、leTest.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 模拟取消选中一个复选框,并判定首先模拟用户选中复选框,再模拟取消
11、选中,并判定/模拟用户选中数据项-体育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 exp
12、ectSports=new String3;6expectSports0=“羽毛球“;expectSports1=“乒乓球“;expectSports2=“篮球“;再从当前网页的列表框中读取所有的数据项:String actualSports=this.sel.getSelectOptions(“sport“);利用 junit4 独有的数组判定函数进行比较org.junit.Assert.assertArrayEquals(“下拉框出错“ , expectProfessions, actualProfessions);注意:expectSports数组中元素的顺序必须和网页上的顺序一致,否则
13、出错具体参见: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
14、expectSports=new String2;expectSports0=“羽毛球“;expectSports1=“乒乓球“;判定期望结果与实际结果是否一致,有二种方式:第一种方式/读取选中的数据项String selectValues = this.sel.getSelectedLabels(“name=sport“);org.junit.Assert.assertArrayEquals(“列表框出错“ , expectSports,selectValues);第二种方式/期望结果初始化String expectSports=new String2;expectSports0=“1“;e
15、xpectSports1=“2“;/读取选中的数据项String selectValues = this.sel.getSelectedValues(“name=sport“);7org.junit.Assert.assertArrayEquals(“列表框出错“ ,expectSports, selectValues);7. html 单选按钮操作技巧7.1 判定是否有单选按钮被选中/判定是否有单选项选中-第一种方法boolean selected=this.sel.isChecked(“name=Tsex“);org.junit.Assert.assertEquals(true, sele
16、cted);/判定是否有单选项选中-第二种方法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=Tse
17、x 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 提示例:比如有一个
18、文本框用来输入年龄,现通过 javascript 的 onBlur 事件来检查输入的数据是否是数字,如果不是,用 alert,显示“请输入数字内容 ”。1、利用 focus()确定当前网页焦点,输入数据8/找到文本框-年龄,此语句必不可少this.sel.focus(“name=age“);/ 对文本框赋值this.sel.type(“name=age“, “汉字 233“);2、将焦点转移/将焦点跳转到文本框-姓名时,利用onblue事件自动检查年龄this.sel.focus(“name=Tname“);3、验证是否出现 alert,如果出现,抓住后处理if(this.sel.isAler
19、tPresent()org.junit.Assert.assertEquals(“请输入数字内容“, this.sel.getAlert();elseorg.junit.Assert.fail();具体参见:formExampleTest.java - testAlert()newWindowTest.java - testAlert()注意:getAlert()作用是返回警告窗口内的警告内容,并且模拟用户点击” 确定”。Alert 函数只能处理一次,即不能出现两次 getAlert,否则第二次调用 getAlert 失败8.3 处理 js 的 confirm 提示当 selenium 处理
20、js 的 confirm()时,默认自动模拟选择”确定” 按钮,如果用户想自动模拟选择”取消 ”按钮,可使用 chooseCancelOnNextConfirmation/如果不使用chooseCancelOnNextConfirmation语句,模拟用户点击“确定“ ,否则模拟用户点击“取消“/this.sel.chooseCancelOnNextConfirmation();this.sel.focus(“name=btnsm2“);this.sel.click(“name=btnsm2“);/ 由于点击“取消“,窗体弹出一个alert,所以这里进行判断if (!this.sel.isAl
21、ertPresent() org.junit.Assert.assertEquals(“表单例子“, this.sel.getTitle(); else org.junit.Assert.assertEquals(“你按了取消,那就是返回false“ , this.sel.getAlert();具体参见:newWindowTest.java - testConfirm()98.4 处理 js 的 prompt 提示如果 js 中包含 prompt(),则可使用 answerOnNextPrompt 模拟用户输入this.sel.open(“http:/localhost:8080/jspNew
22、s/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();具体参见
23、:newWindowTest.java - testPromt()8.5 验证 html 元素的属性我们可以通过 ID 号、name 或数组方式获取 html 元素的属性/ 验证属性|id1class|a1org.junit.Assert.assertEquals(“a1“, this.sel.getAttribute(“id1class“);/ 验证属性|name1class|a2org.junit.Assert.assertEquals(“a2“,this.sel.getAttribute(“name1class“);/ 以数组方式验证属性|document.links1class|a2o
24、rg.junit.Assert.assertEquals(“a2“,this.sel.getAttribute(“document.links1class“);具体参见:AttributeTest.java - testAttribute ()9. 弹出窗体9.1 判断是否存在弹出窗体模拟用户单击 button 按钮,触发 jsfunction openWindow() var refmyPopWindow=window.open(./test_select_window_popup.html, myPopupWindowTitle, height=200,width=500,top=400,
25、left=50);弹出一个窗体10JS 中的 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“);
26、/ 将弹出的窗体设置为当前窗体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
27、.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“);/将当前窗体设置为父窗体