电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

分享我的第一次java Selenium自動化測試框架開發過程

瀏覽:63日期:2022-08-15 15:45:09

由于公司的開發團隊偏向于使用Java技術,而且公司倡導學習開源技術,所以我選擇用Java語言來進行Selenium WebDriver的自動化框架開發。由于本人沒有Java開發經驗,以前雖然學過QTP但從沒有接觸過Selenium,正好通過這個機會能學習一下自動化測試,同時也學習一下基本的Java開發過程。

一、首先是搭建框架開發環境

按照網上的方法部署eclipse,建立TestAction工程,并Import引用JDK和Selenium-2.44完整包

分享我的第一次java Selenium自動化測試框架開發過程

二、繼續引用和安裝相關jar包

1、首先是要滿足數據驅動(場景用例和動作用例、數據用例都需要放到excel表上),就需要引用jxl.rar包(實現調用和操作excel);

2、需要實現自動化框架(有測試套件、測試層)就需要通過eclipse安裝TestNg(網上有相關教程);

三、構建框架的樣例代碼

1、實現能夠對excel用例數據的調用(通過jxl的引用),創建ExcelData.java類文件(專門用于對excel的調用),以下截取部分代碼樣例:

/** * @param fileName excel文件名 * @param caseName sheet名 */ public ExcelData(String fileName, String caseName) { super(); this.fileName = fileName; this.caseName = caseName; } /** * 獲得excel表中的數據 */ public Object[][] getExcelData() throws BiffException, IOException { workbook = Workbook.getWorkbook(new File(getPath())); sheet = workbook.getSheet(caseName); rows = sheet.getRows(); columns = sheet.getColumns(); // 為了返回值是Object[][],定義一個多行單列的二維數組 @SuppressWarnings('unchecked')HashMap<String, String>[][] arrmap = new HashMap[rows - 1][1]; // 對數組中所有元素hashmap進行初始化 if (rows > 1) { for (int i = 0; i < rows - 1; i++) {arrmap[i][0] = new HashMap<String, String>(); } } else { System.out.println('excel中沒有數據'); } // 獲得首行的列名,作為hashmap的key值 for (int c = 0; c < columns; c++) { String cellvalue = sheet.getCell(c, 0).getContents(); arrkey.add(cellvalue); } // 遍歷所有的單元格的值添加到hashmap中 for (int r = 1; r < rows; r++) { for (int c = 0; c < columns; c++) {String cellvalue = sheet.getCell(c, r).getContents();arrmap[r - 1][0].put(arrkey.get(c), cellvalue); } } return arrmap; } /** * 獲得excel文件的路徑 * @return * @throws IOException */ public String getPath() throws IOException { File directory = new File('.'); sourceFile = directory.getCanonicalPath() + 'srcsource'+ fileName + '.xls'; return sourceFile; }

2、實現對瀏覽器的調用,考慮到兼容性,需要同時滿足對Chrome、FireFox、IE三大瀏覽器的調用,我們需要準備相關驅動chromedriver.exe、IEDriverServer.exe,這兩驅動都是谷歌和IE官方提供的,可以從網上下載到;而FireFox不需要下載驅動,只要安裝瀏覽器就可調用(Selenium和FireFox屬于一個團隊開發出來的,待遇就是不一樣)。

有了瀏覽器驅動后(我們把驅動放到工程目錄的WebDriver文件夾下,方便按相對路徑統一調用),我們就需要一個能調用瀏覽器的類,以下提供核心代碼樣例:

public static WebDriver getChromeDriver(String url) { //加載Google驅動 //System.setProperty('webdriver.chrome.driver','D:javachromedriver.exe'); System.setProperty('webdriver.chrome.driver',System.getProperties().getProperty('user.dir')+'WebDriverchromedriver.exe'); ChromeOptions options = new ChromeOptions(); //通過配置參數禁止data;的出現 options.addArguments('--user-data-dir='+System.getProperties().getProperty('user.home')+'/AppData/Local/Google/Chrome/User Data/Default'); //通過配置參數刪除“您使用的是不受支持的命令行標記:--ignore-certificate-errors。穩定性和安全性會有所下降?!碧崾? options.addArguments('--start-maximized','allow-running-insecure-content', '--test-type'); WebDriver driver = new ChromeDriver(options); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.navigate().to(url); return driver;}public static WebDriver getFireFoxDriver(String url){System.setProperty('webdriver.firefox.bin', 'D:Program FilesMozilla Firefoxfirefox.exe');// TODO Auto-generated method stubWebDriver driver = new FirefoxDriver(); //Puts a Implicit wait, Will wait for 10 seconds before throwing exceptiondriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //Launch websitedriver.navigate().to(url);return driver;}public static WebDriver getIEDriver(String url){//System.setProperty('webdriver.ie.driver', 'D:javaIE64IEDriverServer.exe');System.setProperty('webdriver.ie.driver', System.getProperties().getProperty('user.dir')+'WebDriverIE32IEDriverServer.exe');DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true); capabilities.setPlatform(Platform.WINDOWS); capabilities.setCapability('silent', true);// TODO Auto-generated method stubWebDriver driver = new InternetExplorerDriver(capabilities); //Puts a Implicit wait, Will wait for 10 seconds before throwing exceptiondriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //Launch websitedriver.navigate().to(url);return driver;}

3、寫一個以數據驅動的場景類,來進行單個事務的用例跑測

(1)首行我們需要用TesgNg提供的數據驅動方法(@DataProvider),來獲取一個場景的用例表數據,這個場景從excel的第一個附表獲取

分享我的第一次java Selenium自動化測試框架開發過程

通過action名,調取用例表(用例表是以action名命名的附表),用例表如下所示(ExpectedObject表示用例校驗對象的頁面Element標簽,用;分隔,分號前面的表示ID,分號后面的表示xpath):

分享我的第一次java Selenium自動化測試框架開發過程

以下為用例表數據獲取的代碼:

@DataProvider(name='action') public Object[][] Numbers() throws BiffException, IOException{getActionString = actionData.getActionStr(1);//獲取第一個場景的broswer、url、action名ExcelData e=new ExcelData('testdata', getActionString.get(2)); return e.getExcelData(); }

然后通過Java的反射機制,實現動態的獲取具體事務類和執行相關操作(每個事務的類名和方法名都與action場景名一致),以下截選相關場景的部分調用代碼:

@Test(dataProvider='action') public void testAction(HashMap<String, String> data) throws BiffException, IOException { try { Class<?> MyClass = Class.forName(packageName+'.'+getActionString.get(2)); Method method = MyClass.getMethod(getActionString.get(2),WebDriver.class); @SuppressWarnings('unused')String [] results = (String []) method.invoke(null,driver); String ExpObject=data.get('ExpectedObject'); String ExpObject_by=ExpObject.split(';')[0].toString(); String ExpObject_Desc=ExpObject.split(';')[1].toString(); if(ExpObject_by.length()>0){ Assert.assertEquals(driver.findElement(By.id(ExpObject_by)).getText(),data.get('ExpectedData'), getActionString.get(2)+data.get('ID')+'驗證結果:'); } else if(ExpObject_Desc.length()>0){ Assert.assertEquals(driver.findElement(By.xpath(ExpObject_Desc)).getText(),data.get('ExpectedData'), getActionString.get(2)+data.get('ID')+'驗證結果:'); } WebDriverDemo.WebSleep(500);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} }

另外說明的是,調用瀏覽器的方法,需要明確是放在@BeforeMethod中,還是在@BeforeClass中,如果是登錄校驗測試,就要保證每次執行測試方法都要打開一次瀏覽器和關閉一次瀏覽器,那么我們就要把調用瀏覽器,和關閉瀏覽器的方法放到@BeforeMethod中和@AfterMethod中。其他業務測試,只要在一個套件類中打開一次瀏覽器和關閉一次瀏覽器就可以,所以用到的是@BeforeClass和@AfterClass。

4、我們需要再寫一個以動作(關鍵詞)驅動的場景類

同樣,調用第二個場景的用例表,樣例代碼如下:

@DataProvider(name='action') public Object[][] Numbers() throws BiffException, IOException{getActionString = actionData.getActionStr(2);//獲取第二個場景的broswer、url、action名ExcelData e=new ExcelData('testdata', getActionString.get(2)); return e.getExcelData(); }

然后在測試方法中,動態的調用具體操作動作,獲取WebElement標簽的方法,包括通過By ID或者By xpath,操作動作以最常見的兩個為例(sendKeys、click),以下為樣例代碼節選:

@Test(dataProvider='action') public void testAction(HashMap<String, String> data) throws BiffException, IOException { //driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);//找不到element就再給5秒查找 try { WebElement TestWebElement = null; String SetObject=data.get('SetObject').trim(); String SetObject_by=SetObject.split(';')[0].toString(); String SetObject_Desc=SetObject.split(';')[1].toString(); if(SetObject_by.length()>0){ TestWebElement=driver.findElement(By.id(SetObject_by)); } else if(SetObject_Desc.length()>0){ TestWebElement=driver.findElement(By.xpath(SetObject_Desc)); } if(data.get('SetOperate').equals('sendKeys')){ TestWebElement.clear(); TestWebElement.sendKeys(data.get('SetValue')); }else if(data.get('SetOperate').equals('click')){ TestWebElement.click(); } String ExpObject=data.get('ExpectedObject').trim(); if(ExpObject.length()>0){ String ExpObject_by=ExpObject.split(';')[0].toString(); String ExpObject_Desc=ExpObject.split(';')[1].toString(); if(ExpObject_by.length()>0){ Assert.assertEquals(driver.findElement(By.id(ExpObject_by)).getText(),data.get('ExpectedData'), getActionString.get(2)+data.get('ID')+'驗證結果:'); } else if(ExpObject_Desc.length()>0){ Assert.assertEquals(driver.findElement(By.xpath(ExpObject_Desc)).getText(),data.get('ExpectedData'), getActionString.get(2)+data.get('ID')+'驗證結果:'); } } WebDriverDemo.WebSleep(500);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} }

這段方法所調用的用例表如下所示(以登錄為例):

分享我的第一次java Selenium自動化測試框架開發過程

5、剩下就是業務擴展類了,所有復雜的事務都可以單獨建立測試類和方法(方便擴展維護,只需要在excel場景表中定義后就能調用,利用的是Java反射機制),在這里就不舉例了。

四、實現測試套件調用和報告輸出

有了以上步驟,一個可擴展的自動化框架已經基本形成,但是還達不到大規模應用測試和腳本方便可移植,這時候我們引入Ant(可以在Eclipse中安裝插件,可以直接上網下載后引用),為了能輸出漂亮一點的報告格式,我們還引入一個saxon-8.7.jar。

有了Ant后,我們就可以建議build.xml文件,就能一鍵bulid我們以上的自動化代碼,并將執行測試后的結果輸出成報告。

1、首先我們需要編輯好測試套件調用的testng.xml,簡單舉例如下:

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE suite SYSTEM 'http://testng.org/testng-1.0.dtd'> <suite name='Suite' parallel='false'> <test verbose='2' name='Test_Action'> <!--<groups> <run> <include name='aaa' /> <include name='bbb' /> <include name='ccc' /> </run> </groups>--> <classes> <class name='TestBrowser.ExcActions'/> <class name='TestBrowser.ExcActions2'/> </classes> </test> <!-- Default test --> </suite> <!-- Default suite -->

2、然后我們需要編輯好一個能引用基礎jar包、build測試代碼、調用testng、輸出漂亮報告的build.xml文件

<?xml version='1.0' encoding='UTF-8'?> <project name= 'TestAction' basedir= '.' default='testoutput'><!--default設置為run表示只執行腳本,設為testoutput表示執行完腳本并輸出視圖報告--><echo message='import libs' /><property name= 'lib.dir' value= 'lib' /> <!--<property name='libdir' location='${basedir}/lib' />--><!--<property name='testng.output.dir' location='${basedir}/test-output' />--><path > <!-- adding the saxon jar to your classpath --> <fileset dir= '${lib.dir}' includes= '*.jar' /> <fileset dir='${basedir}/selenium-2.44.0'> <include name='selenium-java-2.44.0.jar' /> <include name='libs/*.jar' /> </fileset> </path><taskdef name='testng' classname='org.testng.TestNGAntTask' classpathref='test.classpath' rel='external nofollow' /><target name='clean'><delete dir='build'/></target><target name='compile' depends='clean'><echo message='mkdir'/> <mkdir dir='build/classes'/> <javac srcdir='src' destdir='build/classes' debug='on' encoding='UTF-8' includeAntRuntime='false'><classpath refid='test.classpath'/></javac></target><path id='runpath'> <path refid='test.classpath'/> <pathelement location='build/classes'/> </path> <target name='run' depends='compile'><testng classpathref='runpath' rel='external nofollow' outputDir='test-output'><xmlfileset dir='${basedir}' includes='testng.xml'/><jvmarg value='-ea' /></testng></target><target name= 'testoutput' depends='run'><xslt in= 'test-output/testng-results.xml' style= 'test-output/testng-results.xsl'out= 'test-output/index1.html' ><!-- you need to specify the directory here again --><param name= 'testNgXslt.outputDir' expression= '${basedir}/test-output/' /><param name='testNgXslt.showRuntimeTotals' expression='true' /><classpath refid= 'test.classpath' /></xslt></target> </project>

3、完成這些后,我們就可以通過Eclipse直接Run As Ant Build我們的自動化腳本了,輸出一份還算漂亮的報告:

分享我的第一次java Selenium自動化測試框架開發過程

同時,需要在事務操作類中,對實際結果和預期結果進行比較,并將測試結果寫入excel的用例表中,如下:

String[] result=new String [2];result[0] = driver.findElement(By.xpath(pars.get(3).split(';')[1].toString())).getText();result[1] = pars.get(4);if(result[0].equals(result[1])){//pars.size()-1ActionsDemo.modifyExcel(Thread.currentThread().getStackTrace()[1].getMethodName(),k,5,'通過');} else {ActionsDemo.modifyExcel(Thread.currentThread().getStackTrace()[1].getMethodName(),k,5,'失敗');}

分享我的第一次java Selenium自動化測試框架開發過程

五、實現自動化框架腳本的遷移調用

以上的腳本始終是在Eclipse下編譯和調用的,如果要實現靈活遷移,隨便換任何一臺只裝了JDK的電腦都能運行,那么我們就要來點改造

1、首行是保證我們寫的代碼中,所以需要引用文件的地方,都用相對路徑的方式,避免代碼包遷移后需要改路徑。

2、通過批處理調用build文件及用例文件,調用時也是通過批處理自動找到相關路徑,避免用絕對路徑。

3、需要用環境變量的地方,盡量用批處理的方式實現,甚至最好是不用配置環境變量,直接調用相引用相對命令文件的路徑調用

以下舉個通過bat批處理調用Ant來執行整個框架代碼的build:

@echo off::先將測試用例文件拷到用戶目錄下copy srcsourcetestdata.xls %UserProfile%srcsource%cd%org.apache.ant_1.9.6binant.bat -buildfile build.xmlecho 在%cd%test-output下查看測試報告pause六、進一步實現自動化的持續集成

在以上基礎上,我們還可以通過jenkins實現對自動化腳本的調用,以及達到每日構建,持續集成開發的要求。

1、首先部署jenkins(網上有相關方法),由于本人公司一直在用jenkins,我就省了搭建部署這一步,直接將以上的自動化框架腳本上傳

2、自動化腳本完整目錄(包括代碼、用例、lib、引用的jar、build.xml文件等)上傳到SVN(再自動從SVN下到jenkins所在服務器)

3、在jenkins中新建一個測試項目TestAction,主要配置如下:

分享我的第一次java Selenium自動化測試框架開發過程

分享我的第一次java Selenium自動化測試框架開發過程

4、配置完后,就可以立即構建(如果碰到相關報錯問題,就按輸出的提示進行處理),構建成功后,就可以在HTML_Report中看到測試結果:

分享我的第一次java Selenium自動化測試框架開發過程

七、后續處理

到此為止,一個完整的Selenium自動化框架就出來了,要說好用不,不好說,還得經過實踐的檢驗,但是以上這個思考過程和框架的演進過程,應該也是值得借鑒的,畢竟這是我這幾天摸索和學習的過程,對于一個沒有從事過自動化測試,而且沒有做過Java開發的測試人員來說,這只是個開始。

目前來看,這個框架在架構分層上,還是不夠清晰,有很多要改進的東西,從技術上來說,我已經實現了我的目標(學習自動化測試),但是在整體架構和代碼重構上,還有很多工作沒做,以下貼出一份Selenium自動化框架的分層結構,以便后期按照這個標準進行改進:

分享我的第一次java Selenium自動化測試框架開發過程

測試數據層:獨立封裝數據;頁面對象層:封裝頁面對象,共頁面任務層做調用;頁面任務層:實現各個獨立頁面的操作;測試層:實現頁面測試;測試套件層:實現測試層的管理調用;

到此這篇關于分享我的第一次java Selenium自動化測試框架開發過程的文章就介紹到這了,更多相關java Selenium自動化測試 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 国际金融网_每日财经新资讯网 | 钢格板_钢格栅_格栅板_钢格栅板 - 安平县鑫拓钢格栅板厂家 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 市政路灯_厂家-淄博信达电力科技有限公司| 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 |