zoukankan      html  css  js  c++  java
  • Java+TestNG+Maven+Selenium的web自动化测试脚本环境的搭建

    一、环境搭建

    1、安装java环境

    a、 安装JDK

    b、安装eclipse

    c、安装maven

    参考:http://www.cnblogs.com/s1328/p/4620812.html

    2、安装eclipse下的testng插件

    Eclipse中点击Help->Install new software -> 点击Add

    在Location输入 http://beust.com/eclipse

    选中Testng版本,点击Next,按照提示安装,安装完之后重启Eclipse

    3、安装firefox插件

    a、fireBug插件,帮你定位页面元素

    b、firePath插件,可以直接告诉你页面元素的Xpath

    下面需要在Eclipse里为我们要做的web自动化测试创建一个Eclipse工程

    你需要按照File - New - Project - Maven - Maven Project来创建Maven工程

    这里为了简单起见,你可以直接去GitHub拿我创建好的工程 

    https://github.com/zhangting85/simpleWebtest

    不会用GitHub的同学只要打开这个连接然后点击Download ZIP这个按钮就可以下载到创建好的工程源代码。

    然后在Eclipse里按照File - Import... - Maven - Existing Maven Projects来导入刚刚下载的源代码。

     

    工程结构详解:

    一个最简单的标准maven工程,源代码放在src/main/java目录下,测试代码放在src/test/java目录下;

    maven还创建了一个pom.xml,负责替你管理所有这个工程所依赖的jar包。

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>simple-webtest</groupId>
      <artifactId>simple-webtest</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>simple-webtest</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
          <dependency>
              <groupId>org.testng</groupId>
              <artifactId>testng</artifactId>
              <version>6.8.5</version>
          </dependency>
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-java</artifactId>
              <version>2.40.0</version>
          </dependency>
      </dependencies>
    </project>

    上面的<version>2.40.0</version>中间是版本号,如果selenium要从2.40升级到2.41了,我们只需要改这里的版本号。不用再去官网下载jar包了。

    是不是很方便?

     

    4. 检查环境是否准备完毕

    在Eclipse里刚刚导入的工程里,找到simpleWebtest.test包下的TestWebdriverEnv.java文件。

    右键 - Run as - TestNG Test

    如果前面步骤均安装正确,你将看到selenium打开了你的Firefox浏览器,并跳转到我的GitHub工程所在页面。

    命令行里会输出Hello World, TestNG

    此外,testNG还会在你的工程目录下创建test-output目录,里面存放着默认的testNG测试报告。

    好。至此一个selenium的脚本开发环境就搭好了。

    以上测试代码只使用了firefox,如果你想创建chrome、ie的测试脚本,

    还需要下载对应的driver文件并把这些文件放在你系统的环境变量path里。

    比如,ie的driver文件是IEDriverServer.exe。有需求的朋友就去官网下载吧。

    二、编写简单线性脚本

    1、自动化测试原理

    自动化测试,一般分三个步骤:

    1)取预期结果;

    2)取实际结果;

    3)断言:比较1)和2)来判断测试是否通过;

    2、简单的selenium测试脚本编写,一般也是分三个步骤:

    1)定位一个元素

    2)操作一个元素

    3)断言

    这里用百度首页的搜索做一个例子:

    package simplewebtest.test;
     2 
     3 import java.util.concurrent.TimeUnit;
     4 
     5 import org.openqa.selenium.By;
     6 import org.openqa.selenium.WebDriver;
     7 import org.openqa.selenium.firefox.FirefoxDriver;
     8 import org.testng.annotations.Test;
     9 
    10 public class TestBaiduHome {
    11     
    12     @Test
    13     public void searchSomething(){
    14 
    15         WebDriver driver=new FirefoxDriver();//打开Firefox; open firefox
    16         driver.get("http://www.baidu.com");//打开百度open the url
    17         driver.findElement(By.id("kw1")).sendKeys("GitHub");//输入搜索关键字“GitHub";input search keyword
    18         driver.findElement(By.id("su1")).click();//点击搜索按钮click the search button
    19         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds                        
    20         String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
    21         assert aResult.contains("GitHub");//做断言 assertion
    22         driver.findElement(By.xpath(".//*[@id='4']/h3/a")).click();//打开第四个搜索结果。Open the 4th search result on baidu
    23         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds                        
    24         
    25         //获取所有窗口的handle,然后逐个切换,直到切换到最新窗口 switch to the new window
    26         for(String winHandle : driver.getWindowHandles()){     
    27             driver.switchTo().window(winHandle);     
    28             }     
    29         
    30         String aTitle=driver.getTitle();//取新窗口的title
    31         System.out.println("current widnow title is:"+aTitle);//打出来看看
    32         assert aTitle.contains("GitHub");//断言
    33         
    34     }
    35 }

    下面逐行解释:

    WebDriver driver=new FirefoxDriver();

    参考:http://www.cnblogs.com/sdet/p/3633639.html

    这里是声明了一个 WebDriver 类型的对象引用,我给他起名叫driver;

    然后让这个driver指向WebDriver的一个子类(FirefoxDriver)的对象;

    我们知道FirefoxDriver继承自WebDriver,IEDriver也继承自WebDriver;

    就像苹果继承自水果,橘子也继承自水果;

    这里用了Java的向上转型,使用子类的对象来初始化父类的引用。(注:实际上Webdriver是一个接口。)

    这将产生什么效果呢?

    我们在driver上调用方法的时候,都是先查找WebDriver里的方法定义,然后jvm去他的子类比如FirfoxDriver中找到其在子类中的实现,再执行的。比如FirefoxDriver的get方法和IEDriver的get方法,他们具体执行的代码内容明显是不一样的。但我们的脚本,只要改变driver引用的子类,而不用改变我后面的方法调用。

    也就是说,我们用firefox和用ie,除了第一句话新建对象时不一样,后面的方法调用都是一样的。

    java会自动根据我们上面这句话里创建的对象,去选择他应该执行的实际代码。

    这也就是JAVA里的多态,一句话记住多态:用子类对象初始化父类引用,方法调用时自动执行子类代码,成员变量调用时自动调用父类成员变量。

    以上,题外话略多,是希望测试人员不要自我放弃,写个程序不会有多难,Java的基础必须要掌握。

    driver.get("http://www.baidu.com");

    调用Webdriver的get方法,跳转到制定的URL;

    凡是这里跳转不过去的,十有八九是因为webdriver版本太低,浏览器版本太高,请改上一节讲的pom.xml里配置的webdriver版本号至最新版。

    driver.findElement(By.id("kw1")).sendKeys("GitHub");//输入搜索关键字“GitHub";input search keyword
    driver.findElement(By.id("su1")).click();//点击搜索按钮click the search button

    这里调用Webdriver的findElement方法来查找页面元素。然后在找到的页面元素WebElement对象上调用sendKeys方法来打字和click方法来点击。

    如果你问我这个id的值是怎么来的,那么你可以去看一下FireBug这个插件,他会替你找到每一个元素的一切属性。

    如果你要定位的元素没有id,你还可以用className,Xpath,css,等等来定位。

    另一个插件FirePath可以帮你产生任意元素的xpath表达式。

     定位xPath的方法参考:http://www.cnblogs.com/s1328/p/4931145.html

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    很常用的一个等待页面加载的语句。这个implicityWait是会对driver的下一个findElement调用起作用的。

    百度这个搜索结果页面很有意思,虽然我们感觉不出来,但搜索结果其实是异步显示上去的,所以不加等待他就会找不到元素。

    而后面点击搜索结果打开一个窗口的时候我们再次用了等待。

    另外,这个方法并不是对所有网页都有效,有时我们要用一些别的等待。还有尽量不要用Thread.sleep

    String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
    assert aResult.contains("GitHub");//做断言 assertion

    这两句,首先去取实际结果,也就是根据某个xpath表达式找到的搜索结果元素上的Text

    然后,再判断他是否符合预期结果,即包含有“GitHub”这个字符串。

    assert是TestNG提供的,这里不要用if else去判断这个字符串。TestNG的assert结果会反映在测试报告里。

    也不要自己去抛出一个代表断言失败的异常,TestNG会替你完成这件事。

    以上两个错误是中低级开发人员编写测试框架时常犯的。

    我们既然用了TestNG,请至少尝试去用TestNG的功能。



        for(String winHandle : driver.getWindowHandles()){     
                driver.switchTo().window(winHandle);     
                }  

    这段代码表示切换窗口。有意思的是,他是在窗口打开后,先取出所有窗口的hanles,然后一个一个切过去。

    因为新窗口必定在最后,所以不论你有几个窗口,这段代码总能找到最新一个窗口。如果你还需要操作老窗口,

    可以事先把老窗口的Handle保存起来,以后再切回来。

    以上一个简单的线性测试脚本编写完毕。基本的元素定位、元素操作、窗口切换、断言都有了,你可以查看官网的文档,了解各个api的更多方法。

    熟练地编写线性脚本大概需要个把月,有编程基础的更快,这一篇介绍的内容基本没有难度。下一篇介绍进阶的线性脚本,包括frame,actions,关闭浏览器,运行javascript,WebDriverWait。

    
    

     

  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/s1328/p/4931094.html
Copyright © 2011-2022 走看看