本系列所有代码 https://github.com/zhangting85/simpleWebtest

本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。

文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本的编写是下一步编写页面对象脚本的基础。

1.在开始之前,我想明确一下,自动化测试的基本原理。

有的测试人员认为自动化测试很神秘,很神奇。恰恰相反,自动化测试很简单

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

1)取预期结果;

2)取实际结果;

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

从历史角度来看,自动化测试的出现早于专职测试人员的出现。也就是说在开始有我们这些专门做软件测试的测试人员之前,自动化测试已经存在了。

原因就是他简单

selenium自动化测试,在自动化测试里也是属于超级简单的一类。但前提是必须理解上面说的自动化测试原理,以及其他一些自动化测试设计原则。否则,我们将会看到,简单的项目也会失败。有很多由初、中级开发人员或会一点点代码的测试人员编写的selenium自动化测试项目,因此失败。

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

1)定位一个元素

2)操作一个元素

3)断言

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

 package simplewebtest.test;

 import java.util.concurrent.TimeUnit;

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

本系列所有代码https://github.com/zhangting85/simpleWebtest,

这个例子存放在src/test/java/simplewebtest/test/TestBaiduHome.java

下面逐行解释:

WebDriver driver=new FirefoxDriver();

这里是声明了一个 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表达式。

findElement方法需要一个By类型的参数。

但是代码里我们使用了By.id("kw1") 这里的id是一个静态方法,他的声明是:

public static By id(java.lang.String id)

所以我们调用By.id的时候,他会返回一个By类型的对象给我们。

至于下面findElement是怎样用这个对象来查找页面元素的,暂时不讲。简单来说,就是把我们传入的id传给对应的Driver,由driver去查找元素,再返回给我们。

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。

selenium从入门到应用 - 2,简单线性脚本的编写的更多相关文章

  1. Selenium 2 入门

    在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...

  2. 隐式等待-----Selenium快速入门(九)

    有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...

  3. selenium webdriver入门

    写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...

  4. selenium从入门到应用 - 7,testNG的DataProvider

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  5. selenium从入门到应用 - 4,页面对象设计模式的实现

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  6. Python+Selenium基础入门及实践

    Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...

  7. 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 元素(WebElement)-----Selenium快速入门(三)

    上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法:  返回值  方法名  说 ...

  9. python selenium webdriver入门基本操作

    python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...

随机推荐

  1. Linux内核情景分析的alloc_pages

    NUMA结构的alloc_pages ==================== mm/numa.c 43 43 ==================== 43 #ifdef CONFIG_DISCON ...

  2. do_exit【转】

    转自:http://blog.csdn.net/lhf_tiger/article/details/8768874 进程在退出时,必须释放它所拥有的资源,并通过某种方式告诉父进程.进程的退出一般是显示 ...

  3. 用css控制table td内文字超出隐藏

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) 效果图: 重点是把table设置为table-layout: fixed; 超出的文字隐藏的效果才有. p标签超出的文字隐藏的效果不需要设置这个内 ...

  4. error while loading shared libraries:libmysqlclient.so.18 错误

    error while loading shared libraries:libmysqlclient.so.18错误 新手安装php的时候如果出现这种问题,解决办法很简单,就是查看你的mysql安装 ...

  5. cpp调用dll

    c++ 显示调用 其他程序dll #pragma comment(lib, "DllTest.lib") int fnDllTest(void); int c = fnDllTes ...

  6. 关于JAVA SESSION的小测试

    手生就要多练啊... package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; ...

  7. (6)java基础知识-基本数据类型、数据类型转换

    一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte:  1字节 取值范围 -128~127 short: 2字节    取值范围 -32768~32767 int:     4字节 取 ...

  8. php的function() use($args)用法

    使用use返回 aaa aaa.使用函数传参数aaa bbb. use的参数必须是已经存在的,如果没有定义返回Notice: Undefined variable: word ,使用函数参数方式不需要 ...

  9. mysql----kill慢查询

    每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您 ...

  10. Bean装配--xml

    1,bean package com.songyan.zhangpei; import java.util.ArrayList; import com.sun.xml.internal.bind.v2 ...