scaoping 发表于 2018-1-8 08:33:28

Selenium 我的自动化测试历程 (Selenium+TestNG+Java+ReportNG+Jenkins)

  测试环境:Java+Selenium+TestNG,Jenkins持续集成。

测试代码

代码结构
  采用页面对象模型(Page Object),减少UI修改后,对代码的影响。

https://testerhome.com/uploads/photo/2016/4d996fd0b1b5254af20e7e0e1452730f.jpeg!large  Java编写,采用TestNG测试框架。
  先说点概念的:


[*]  Selenium
  Selenium是一套完整的Web应用程序测试系统,它包含了测试的录制(Selenium>  Selenium Core:Selenium的核心部分,它由一些纯js代码组成, 可以运行在windows/linux的不同browser上,而IDE是在core的基础上的一种应用, 通过UI实现类似QTP/Winner的脚本录制回放功能,它是Selenium>  Selenium>  Selenium RC: Selenium Remote Control,是客户端利用各种编程语言,通过网络向Selenium Server发送指令,Selenium Server接收到测试指令后,启动浏览器并向其发出JavaScript调用实现对Html页面的全面追踪,并通过网络把执行结果返回给调用者。
  Selenium WD: Selenium WebDriver。Web驱动。
  Selenium Grid:允许同时并行地、在不同的环境上运行多个测试任务,极大地加快 Web 应用的功能测试。 (没有用过,不太了解)

[*]  TestNG
  TestNG是一个测试框架,使用@Test控制测试的执行,执行后,自动输出测试报告。
环境搭建

Java运行环境
  根据个人电脑系统类型选择对应的jdk安装包下载(jdk-8u5-windows-x64.exe或jdk-7u45-windows-i586.exe)下载完成之后,打开软件进行安装。


[*]  配置环境变量
  系统环境变量JAVA_HOME:d:\Java\jdk1.8.0_05(写自己安装的jdk地址)
  系统环境变量Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
  系统变量CLASSPATH:;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  配置完成之后,在doc下输入javac,如果出现用法:javac。。,证明配置好了

JDBC配置
  Jdbc用于java读取sql server数据库。
  数据库安装就不多说了,我本地64位计算机,jdk1.8,Sql Server 2008R2。


[*]下载Microsoft JDBC Driver 6.0 (sqljdbc_6.0.7728.100_chs.tar.gz) 官网地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=11774 我只留下了sqljdbc4.jar
[*]配置环境变量CLASSPATH  新增:C:\sqljdbc4;( 我放在了C盘根目录下)

[*]复制包到相关目录下  sqljdbc4.jar文件拷到
  E:\Program Files\Java\jdk1.8.0_05\jre\lib\ext
  E:\Program Files\Java\jre8\lib\ext
  目录下,分别拷贝一份(看你的安装目录了)
Java开发工具
  eclipse-standard-kepler-SR1-win32-x86_64

相关包导入


[*]  TestNG
  TestNG框架相关:
  bsh-2.0b4.jar,jcommander.jar,snakeyaml.jar这三个包。
  在org.testng.eclipse_6.9.9.201510270734中lib中,我把整个文件夹(rg.testng.eclipse_6.9.9.20151027073)放在了eclipse所在的目录:\eclipse\features\org.testng.eclipse_6.9.9.201510270734\lib ,之后在引入这三个包。

[*]  Selenium
  selenium-server-standalone-2.48.2.jar

[*]  Jxl.jar
  用于读取excel表格
浏览器
  浏览器使用火狐浏览器39.0.3,虽然版本比较低,但是与selenium版本兼容,需要安装组件:firepath

页面元素

定位
  通过页面元素的固定属性,来确定元素。可以通过id,name,className,tagName,cssSelector,linkText,partialLinkText等属性来定位,不太好定位的元素,可以使用xpath方式。


[*]1. 通过id定位
  driver.findElement( By.id("Text1"))


[*]2. 通过name定位
  driver.findElement( By.name("输入"))


[*]3. 通过xpath定位
  driver.findElement( By.xpath("html/body/div/p/label/input"))


[*]4. 通过linkText定位链接
  driver.findElement( By.linkText ("这是一个链接")),需要完整匹配文字


[*]5. 通过partialLinkText定位链接
  driver.findElement( By. partialLinkText ("链接")),不需要完整匹配文字


[*]6. findElements()
  定位多个元素,返回一个list,List elements,通过elements.get(index).click();进行遍历操作,index从0开始。
  注意:如果属性中有空格,就只能使用xpath方法确定元素。

元素操作
  1.文本框赋值
  sendKeys("你好!")
  2.清空文本框
  clear()
  3.获取文本框中内容
  getAttribute("value")
  4.点击
  .click()
  5.下拉框


[*]选择  首先定义一个下拉框对象:
  Select select = new Select(driver.findElement(By.xpath("//*[@id='select_k1']")));
  第二步,通过对象定位所选的下拉框内容,三种方法:
  

  //通过可见文本去选择
  
select.selectByVisibleText("哈尔滨");
  
//通过html中的value值去选择
  
select.selectByValue("heb");
  
//通过index(索引从 0 开始) 选择
  select.selectByIndex(2);
  

  


[*]  获取下拉框已选值
  使用getFirstSelectedOption()获得所选的项,再通过getText()获得值:
  select. getFirstSelectedOption().getText()
  6.复选框
  7.单选按钮
  //选中
  click();
  //判断单选框是否被选中,返回布尔值
  isSelected();
  8.页面弹框处理(alert)
  

//声明对话框变量  
Alert alert = driver.switchTo().alert();
  
//获取弹框中的文字
  
alert.getText()
  
//点击弹框中的确定
  
alert.accept();
  

  

  9.表单(Form)
  Form 中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交:
  

WebElement approve = driver.findElement(By.id("approve"));  
approve.submit();
  
//只适合于表单的提交,例如百度搜索框输入关键字后按回车键进行搜索
  

  

  10.上传文件
  

//定位上传控件  
WebElement upload = driver.findElement(By.id("替换成实际的定位的值"));
  
//定义了一个本地文件的路径
  
String filePath = "d:\text.txt";
  
//为上传控件进行赋值操作,将需要上传的文件的路径赋给控件
  
upload.sendKeys(filePath);
  

  

  11.拖拉
  

//定义第一个元素  
WebElement element1 =driver.findElement(By.XX));
  
//定义第二个元素
  
WebElement element2= driver.findElement(By.XX));
  
//将第一个元素拖拽到第二个元素
  
(new Actions(driver)).dragAndDrop(element1, element2).perform();
  

  

  12.鼠标悬停
  

Actions action = new Actions(driver);  
action.moveToElement(driver.findElement(By.XX)).perform();
  

  

  13.滚动页面至某元素出现
  

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript("arguments.scrollIntoView(true);", driver.findElement(By.XX));
  

  

执行用例
  使用TestNG中的@Test执行用例。
  @Beforeclass 在执行类之前执行, @Afterclass在执行类之后执行

输出结果

TestNG
  TestNG自带的结果,html类型。

ReportNG
  1.配置:


[*]  下载
  三个包:guice-3.0.jar,reportng-1.1.4.jar,velocity-dep-1.4.jar,导入到项目中;

[*]  配置监听
  Windows->preference-TestNG,配置如下图:

https://testerhome.com/uploads/photo/2016/05d2cf908d3c18afdc1699ea17567863.jpg!large
  关闭默认监听,改为:org.uncommons.reportng.HTMLReporter


[*]  配置xml文件
  新增:
  <listener>
  注明:我放在了前面
  2.二次开发
  反编译工具:jd-gui.exe(打开导入文件即可)或jad.exe和net.sf.jadclipse_3.3.0.jar
  2.1 配置:
  下载jad.exe和jadclipse(需要下载支持eclipse版本的,我的eclipse是4.3.0)。
  将jad.exe放在java目录下:E:\Program Files\Java\jdk1.8.0_05\jre\bin;
  下载地址:http://download.csdn.net/detail/shilinjie_8952/9674940
  将net.sf.jadclipse_3.3.0.jar拷贝到:XX\eclipse\plugins下面,重启eclipse
  打开之后,选择Eclipse->Window->Preferences->Java,设置如下图:

https://testerhome.com/uploads/photo/2016/515b0cf3a34583a5faee49918350f15e.jpg!large
  配置打开.class默认方式:
  .class和.class without source都要修改为默认值是JadClipse
   

https://testerhome.com/uploads/photo/2016/b8cf49376ad51981c26ba0475f2abd65.jpg!large
   
  注意:如果修改完成后,打开的.class文件全是注释,说明Jad的路径不正确。
  有时这个反编译的不好用,可以配合jd-gui.exe或者其他反编译软件一起查看源码。
  2.2 修改源码
  思路:新建一个工程,导入需要的包,按照ReportNG创建目录和java文件,肯定会有些错误,修改一(因为是反编译的,所以会有些问题)能编译通过就可以,(我的是最笨的,一个一个创建的java文件,应该有更好的办法)。按照需求修改源码,右键工程,就可以导出jar了。

元素管理
  两种方法都可以对元素进行管理:


[*]Excel文件存储元素  可以将元素统一存储在excel中,在执行用例之前,统一读取到数组中,包括:编号,名称,查找方法,值,描述。

https://testerhome.com/uploads/photo/2016/5f3a4f488349192f0661ed60d44fd60e.jpg!large

[*]数据库存储元素  可以将元素通过工具直接插入到数据库中保存,在执行用例之前,统一读取到数组中,包括:编号,名称,查找方法,值,描述等字段。描述在这里(自己写的C#小程序)

https://testerhome.com/uploads/photo/2016/3676f536c427d31a9d827c222b17de28.jpg!large  用例管理
  用例采用excel进行管理,用sheet区分不同功能,储存相关需要验证的字段,固定列:第一列(编号),倒数第二列(预期结果),最后一列(错误类型),三列固定的值,用于在代码中使用。

https://testerhome.com/uploads/photo/2016/466cd3416ea59ae1254cf1fd46dfeb3a.jpg!large
持续集成
  采用Jenkins+Ant+Svn实现。
  Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目、监控外部调用执行的工作。
  Ant:形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,这里用来:从svn上签出到某个文件夹下—>编译—>执行用例

Jenkins配置


[*]安装jdk  步骤参考本文环境搭建-Java运行环境。

[*]下载Jenkins  通过官网下载:https://jenkins.io/index.html
  

https://testerhome.com/uploads/photo/2016/8570d0b95b8ea09796399a3a54f1bdcc.jpg!large
  下载下来的是一个msi文件,直接点击安装,默认安装,时间挺长的,而且好多插件装不上,没关系,用到再哪个装哪个。
  装完之后,访问:http://127.0.0.1:8080/ ,需要登录,登录名:admin,admin的密码保存在安装目录Jenkins\secrets\initialAdminPassword文件中。


[*]  插件安装
  Ant Plugin:执行build.xml 文件
  SVN Publisher plugin:通过SVN签出源码
  HTML Publisher Plugin:将测试结果显示在Jenkins中
  Email Extension Plugin:发邮件使用

[*]  系统配置
  系统管理—Global Tool Configuration,配置jdk和ant

https://testerhome.com/uploads/photo/2016/a8f0501add89e8edd1cd0a16c8222d79.jpg!large
  注意:登录就去有时会报错,错误大概就是插件没有安装好,去系统设置里面,找一下报错的插件,装上就好了。步骤如下:

https://testerhome.com/uploads/photo/2016/656f5415a08a3f535052fae20d5cd0d3.jpg!large  找到插件,勾选,点击下面直接安装:

https://testerhome.com/uploads/photo/2016/da386e4513dec88edbb790fe93f1c747.jpg!large  安装过程中可能会出现下载插件失败的情况,可以根据失败提示中的下载地址,下载到本地,选择“高级”上传下载的插件,就会自动安装了:

https://testerhome.com/uploads/photo/2016/93636064b92ff1c2209635899d627622.jpg!large  节点配置:
  有时候没有选项:Launch slave agents using Java Web Star
  解决:系统管理-Configure Global Security-随机选取勾上 tcp port for JNLP agents,原来是禁用的

https://testerhome.com/uploads/photo/2016/40257eef132e851ad74f45a2ebb8a9fe.jpg!large
Ant配置


[*]Jdk安装 参考本文环境搭建-Java运行环境
[*]Ant 下载:http://ant.apache.org/srcdownload.cgihttp://download.csdn.net/detail/shilinjie_8952/9689638下载。或

https://testerhome.com/uploads/photo/2016/02ddd9adde528fc4cde3516ce408bb54.jpg!large  环境变量:
  ant_home:E:\ant\apache-ant-1.9.7-bin\apache-ant-1.9.7,bin目录所在路径
  Path: %ANT_HOME%\bin ant.bat所在路径
  在doc下,测试:ant.bat,出现下图配置成功:

https://testerhome.com/uploads/photo/2016/b474fe4044717edeb78fd80e54580993.jpg!large
Jenkins使用
  1.创建节点

https://testerhome.com/uploads/photo/2016/c1b549579f89c9830c978c51a3c51b78.jpg!large  点击ok
  进入配置节点:

https://testerhome.com/uploads/photo/2016/3a677bc8a1ece5227a5245fc5ddb52d3.jpg!large  创建好之后,如下图:

https://testerhome.com/uploads/photo/2016/1e383c15f00422dd52df9c101c9ccd94.jpg!large  启动节点:点击“Launch”,下载,之后,双击下载到的slave-agent.jnlp文件,或在doc下执行红框中的那一串(我用命令启动提示Unable to access jarfile slave.jar),都可以启动,启动好如下图:

https://testerhome.com/uploads/photo/2016/7b83c5e0ba687fcb9242b5f35f30cd8a.jpg!large  2.创建任务

https://testerhome.com/uploads/photo/2016/71906330facdf8ed42005a63e78249f4.jpg!large  点击“创建一个新任务”,填写任务名称,选择自由风格,如下图:

https://testerhome.com/uploads/photo/2016/7e4e6e9a17f708c1403624020e16ad2d.jpg!large  设置源码管理:添加svn源码路径,设置svn的用户名密码

https://testerhome.com/uploads/photo/2016/705c54ae74b955e31f12251048a0599d.jpg!large  构建触发器:设置何时什么频率进行构建
  我设置的是:每天17点28分构建,28 17 * * *说明:
  第一个参数代表的是分钟 minute,取值 0~59;
  第二个参数代表的是小时 hour,取值 0~23;
  第三个参数代表的是天 day,取值 1~31;
  第四个参数代表的是月 month,取值 1~12;
  最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
  所以 28 17 * * * 表示的就是每天的17点28构建一次。
  构建:选择Execute Windows batch command,填写ant

https://testerhome.com/uploads/photo/2016/fc63e77868449fd5b3a72936e621dbbe.jpg!large  或者选择Invoke Ant:

https://testerhome.com/uploads/photo/2016/7a547e52998f63a3950e361c047a1f49.jpg!large  构建后,需要显示一下测试报告,采用publish html report方式,实际上就是读取一个html文件,显示在jenkins里面的Html Report中

https://testerhome.com/uploads/photo/2016/1449b8518d81cb68416472c3330888c5.jpg!large  如果需要发送邮件,也可以添加一个构建后操作:
  需要填写收件人地址,邮件内容选择了html;Attach Build Log,选择Attach Build Log(发送日志附件);trigger触发发邮件,选择总是发邮件。

https://testerhome.com/uploads/photo/2017/02844974ca6a2a2afb1b35c22a664c51.jpg!large  需要参考下面:5.配置发送邮件 将发邮件配置好
  Defult content内容
  

<body>  <tableborder="1" cellspacing="0" cellpadding="5">

  <tr>  <tdalign="center">名称</td>
  <td align="center">值</td>
  </tr>

  <tr >  <td align="left" >项目名称</td>
  <td align="left" >$PROJECT_NAME</td>
  </tr>
  <tr>  <td align="left">执行编号</td>
  <td align="left">$BUILD_NUMBER</td>
  </tr>
  <tr>  <td align="left">构建状态</td>
  <td align="left">$BUILD_STATUS</td>
  </tr>
  <tr>  <td align="left">触发原因</td>
  <td align="left">${CAUSE}</td>
  </tr>
  <tr>  <td align="left">日志地址</td>
  <td align="left"><a href="${BUILD_URL}console">${BUILD_URL}console</a></td>
  </tr>
  <tr>  <td align="left">构建地址</td>
  <td align="left"><a href="$BUILD_URL">$BUILD_URL</a></td>
  </tr>
  <tr>  <td>  ${JELLY_SCRIPT,template="html"}
  </td>
  

  
</tr>
  
</table>
  

  

  

  到此,任务就创建好了。
  构建的过程是:先利用svn签出源码,然后根据构建中的ant命令或Invoke Ant方式执行构建,实际上就是在源码文件夹中寻找build.xml文件,并执行,接下来需要说明一下被执行的build.xml文件如何配置。
  3.配置build.xml文件
  这个配置很重要,决定了能否执行测试用例

https://testerhome.com/uploads/photo/2016/1e97271eb51d13d3c334584e743623a4.jpg!large
  4.构建
  可以按照构建触发器中的设置进行构建,也可以立刻构建查看各项是否设置正确:

https://testerhome.com/uploads/photo/2016/59ebf853d1eec17211d624bed4a9f61f.jpg!large
  构建过程中查看控制台,可以查看到过程:

https://testerhome.com/uploads/photo/2016/5b6c95170494f4a93292a4177286abea.jpg!large
  执行完用例之后,通过HTML Report查看结果

https://testerhome.com/uploads/photo/2016/b1dd12c8f1ba69dc11d25ba79a248f04.jpg!large
  5.配置发送邮件
   系统设置:Jenkins Location 设置系统管理员地址

https://testerhome.com/uploads/photo/2017/8ee6a6a3c4ec3c6836c6e213c8a44ba0.jpg!large
  系统设置:Extended E-mail Notification设置
  我用的是qq邮箱,密码是16位授权码,需要勾选ssl,不然服务器报错

https://testerhome.com/uploads/photo/2017/9d1c3462b8168ace0a38bb77c0672546.jpg!large
   系统设置:邮件通知
  要与系统管理员邮箱设置一致,密码16位授权码

https://testerhome.com/uploads/photo/2017/0e53b8ddb3bca20223b448b9784540c8.jpg!large

问题与解决方法
  1.问题:构建过程中,不显示浏览器
  解决方法:不使用系统级服务,而是手动启动Jenkins。
  我的电脑->管理->服务和应用程序->服务,将jenkins服务禁用,并且禁止启动,自行用命令启用
  java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"
  最好写成bat文件,内容:
  echo "Jenkins CI automation testting"
  java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"
  pause
  每次启动通过bat文件启动
  2.问题:构建报错:编码GBK的不可映射字符
  解决方法:在build.xml中,javac下,增加,build.xml中有注释。
  3.问题:报告显示不正确,index中没有值
  解决方法:在启动时,用:java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"启动。
  转载自《https://testerhome.com/topics/6495》--站在巨人的肩膀上
页: [1]
查看完整版本: Selenium 我的自动化测试历程 (Selenium+TestNG+Java+ReportNG+Jenkins)