第一章 自动化测试简介、selenium环境搭建
1.1 自动化测试简介
自动化测试概念:
是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程
自动化测试分类:
功能自动化测试与性能自动化测试
一般IT上所说的自动化测试是指功能自动化测试,通过编码的方式用一段程序来测试一个软件的功能,这样就可以重复执行程序来进行重复测试的目的。如果一个软件有小部分功能发生改变,只要修改一部分自动化测试代码,就可以重复对软件进行测试,从而提高测试效率
分类:
web UI自动化
移动端自动化
接口自动化
性能自动化
selenium三个阶段:
1. 业务自动化工程师 编写自动化业务脚本
2. 自动化框架设计师 能独立编写自动化框架
3. 自动化平台架构师 设计自动化平台
1.2 什么样的项目适合做自动化测试
1、任务测试明确,不会频繁变动
2、每日构建后的验证测试
3、比较频繁的回归测试
4、软件系统界面稳定,变化少
5、需要在多平台运行相同的测试用例、组合遍历型的测试、大量的重复测试
6、软件维护周期长
7、项目进度压力不太长
8、被测系统软件开发比较规范,能够保证系统的可测试性
9、具备大量的自动化测试平台
10、测试人员具备较强的编程能力
一般情况下,只要满足如下三个情况就可以开展自动化测试
软件需求变更不频繁、项目周期较长、自动化测试脚本可重复使用
1.3 自动化测试流程
自动化测试的介入点:
一般是在系统测试阶段开始介入,多用于系统测试的回归测试和性能测试
自动化只是测试方式,跟测试阶段无关。可以把任何测试工作写一个程序自动化实现都可以称为自动化测试。
自动化测试流程:
1. 可行性分析
2.测试需求分析
3.制定测试计划
4.自动化测试设计
5.测试脚本开发
6.无人职守测试 无人值守、自动执行、查看邮件
7.提交测试报告
8. 脚本维护阶段
手工测试的优缺点:
手工测试的缺点
1. 重复性。
2. 精确性。个人因素
3. 效率。软件产品的研发后期效率问题尤为明显。
手工测试的优点
手工测试不可替代的地方至少包括:
测试用例的设计。经验和猜测错误能力
界面和用户体验测试。
正确性的检查。人的思维和逻辑能力
1.4 自动化测试及工具简述
QTP:是quicktest Professional的简称,是一款商业化的自动化测试工具。提供了强大易用的录制回放功能。支撑B/S、C/S两种架构的软件测试。
Robot Framework :是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。
Selenium : 是一款用于Web应用程序测试的工具,它支持多平台、多语言、多浏览去实现自动化测试。
自动化测试的目的:业务回归测试 *****
不同浏览器直接的兼容
1.5 Selenium工具介绍
Selenium是ThoughtWorks专门为Web应用而开发的自动化测试工具,适合进行功能测试、验收测试,同时支持所有基于web的管理任务自动化。
主要功能包括:测试与浏览器的兼容性,测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能,创建回归测试检验软件功能和用户需求。
Selenium特点:
- 开源、免费
- 多浏览器支持:Firefox、Chrome、IE、Opera
- 多平台支撑:windows、linux、MAC
- 对web页面有良好的支撑
- 简单(API简单)、灵活(用开发语言驱动)
- 支持分布式执行测试用例
Selenium 共经历了两个版本selenium 1.0 和selenium2.0、selenium3.0,selenium不是一个简单的工具,而是由几个工具组成,如下图所示:
Selenium IDE 是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器录制与回放功能。
实际场景中如何使用?
快速的创建BUG重现脚本,在测试人员的测试过程中,发现了BUG之后可以通过IDE将重现的步骤记录下来,以帮助开发人员更容易的重现BUG。
IDE录制的脚本可以转换成多种语言,从而帮助我们快速的开发脚本。
Selenium Gird是一种自动化测试的辅助工具,Gird通过现有的计算机基础设施,能加快web_app的功能测试,利用Gird,可以很方便的同时在多台机器上和异构环境中并行运行多个测试用例。其主要特点:
- 并行执行
- 通过一个主机统一控制用例在不同环境、不同浏览器下运行
- 灵活添加变动测试机
- Selenium RC是Selenium家族的核心工具,Selenium RC支持多种不同的语言编写自动化测试脚本,通过Selenium RC的服务器为代理服务器去访问应用从而达到测试的目的。
Selenium RC
Selenium RC使用分Client Libraries和Selenium Server,Client Libraries库主要用于编写测试脚本,用来控制Selenium Server的库。
Selenium Server负责控制浏览器的行为,它主要包含3部分:Launcher、Http Proxy、Core。其中Core是被Selenium Server嵌入到浏览器页面中,它本质是JS函数的集合,通过对这些JS函数进行操作,实现用程序对浏览器进行操作。Launcher 用于启动浏览器,把Core加载到浏览器页面中,并把浏览器代理设置成为Selenium Server 的 Http Proxy
WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测web应用中的javascript,与浏览器紧密集成。同时 WebDriver还利用操作系统级的调用模拟用户输入
1.8 Java+Selenium环境搭建
1.10 第一个Selenium事例
public class baiduDemo {
public static void main(String[] args) throws Exception {
//1.创建一个webDriver对象
WebDriver driver=new ChromeDriver();
//2 .打开网站
driver.get("https://www.baidu.com");
//3.浏览器最大化
driver.manage().window().maximize();
//4. 输入需要搜索的内容
driver.findElement(By.name("wd")).sendKeys("新梦想软件测试");
driver.findElement(By.id("su")).click();
Thread.sleep(3000);
//5.关闭浏览器
driver.close();
}
}
第二章 浏览器操作及对象定位
2.1 selenium 安装浏览器驱动
1、FireFox
WebDriver实现了FireFoxDriver,无需用户下载FireFoxDriver。
优点:FireFoxDriver对页面的自动化测试支持得比较好,很直观地模拟页面的操作,对JavaScript的支持也非常完善,基本上页面上做的所有操作FireFox Driver都可以模拟。
缺点:启动很慢,运行也比较慢,不过,启动之后Webdriver的操作速度虽然不快但还是可以接受的,建议不要频繁启动停止FireFoxDriver。
使用Firefox浏览器只需要设置WebDriver driver = new FirefoxDriver(),前提是你的Firefox被安装在默认的位置。
2、chrome
3、IE
2.2 selenium 浏览器基本API(Java篇
1.浏览器中加载URL: get() --首先要启动浏览器
实例:driver.get("http://www.baidu.com")
2.浏览器最大化:window().maximize() 实例:driver.manage().window().maximize();
3.刷新:refresh() 实例:driver.navigate().refresh();
4.返回上一页:back() 实例:driver.navigate().back();
5. 向前进一页:forward() 实例:driver.navigate().forward();
6.截图:getScreenshotAs()
实例:
File screenShotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenShotFile, new File("D:/test.png"));
7.获取当前页的URL:getCurrentUrl() 实例:driver.getCurrentUrl();
8.关闭当前tab页面:close() 实例:driver.close();
9.退出当前driver:quit() 实例:driver.quit();
10.获取当前页的title: getTitle() 实例:driver.getTitle();
2.3 selenium 对象定位API(Java篇
对象的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的,举例:一个对象就是一个人,我们可以通过身份证号、姓名或者他的住址找到这个人。那么一个web对象也是一样的,我们可以通过唯一区别于其它对象的属性来定位这个元素。
前端工具介绍:
Firebug
Firebug是网页浏览器 Mozilla Firefox下的一款开发类插件,它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体,是开发 JavaScript、CSS、HTML和Ajax的得力助手。
安装Firebug:
Mozilla Firefox菜单--附加组件--插件--搜索Firebug--安装--重启浏览器
Firepath
FirePath 是Firebug的扩展插件,添加了开发工具,可以编辑,监测和生成XPath 1.0表达式、CSS 3选择符和JQuery的选择符。可以快速度的帮助我们通过xPATH和css定义页面上的元素。
安装方式同Firebug
chrome和IE的开发者工具
chrome 浏览器自带开发者工具,浏览器右上的小扳手,在下拉菜单中选择“工具”--“开发者工具” 即可打开,也可以使用快捷键Ctrl+Shift+I或者F12.
IE浏览器从IE8版本开始,加入了开发人员工具,通过菜单栏“工具”--“开发人员工具”或者通过快捷键F12即可打开。
7种识别元素的方法:
我们以百度主页搜索框为例:=
<input autocomplete="off" maxlength="255" value="" class="s_ipt" name="wd" id="kw">
1.通过id定位元素
findElement(By.id("id_vaule"))
driver.findElement(By.id("kw")).sendKeys("123456");
WebElement bu = driver.findElement(By.id("su"));
bu.click();
2.通过name定位元素:
findElement(By.name("name_vaule"))
driver.findElement(By.name("wd")).sendKeys("123456");
3.通过className定位元素(样式名):
findElement(By.className("class_name"))
driver.findElement(By.className("s_ipt")).sendKeys("123456");
4.通过tag_name定位元素(标签名):
findElement(By.tagName("tag_name"))
driver.findElement(By.tagName("input")).sendKeys("123456");
5.通过link定位:
findElement(By.linkText("text_vaule"))
或:findElement(By.partialLinkText("text_vaule"))
driver.findElement(By.linkText("糯米")).click();
driver.findElement(By.partialLinkText("糯")).click();
driver.findElement(By.partialLinkText("新")).click();
6.通过css定位元素:
findElement(By.cssSelector())
7.通过xpath定位元素:
findElement(By.xpath())
四、Xpath元素定位API
xpath是一种在XML文档中定位元素的语言。因为HTML可以看作是XML的一种形式,selenium可使用这种强大语言在web应用中定位元素。
Xpath 中的6种定位元素方法。
- 通过绝对路径做定位
driver.findElement(By.xpath("/html/body/div[3]/div[1]/div/div[3]/a[2]")).click();
备注:
绝对路径以 /开头
- 通过相对路径做定位
如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。
相对路径的表示是指界面的元素能通过一个特定位置(唯一位置)去识别。
driver.findElement(By.xpath("//div[3]/a[2]")).click();
通过firepath获取元素的相对路径
- 通过元素索引定位 ,索引的初始值为1
driver.findElement(By.xpath("//div[3]/a[3]")).click();
- 使用xpath属性(@属性名=’属性值’)定位
driver.findElement(By.name("tj_trnews")).click();
driver.findElement(By.xpath("//a[@name='tj_trnews']")).click();
driver.findElement(By.xpath("//a[@name='tj_trnews' and @class='mnav']")).click();
driver.findElement(By.xpath("//a[@name='tj_trnews' or @class='mnav']")).click();
driver.findElement(By.xpath("//input[@type='submit' and @value='登录']")).click();
- 使用部分属性值(属性值只有部分)匹配
starts-with()
findElement(By.xpath("//a[starts-with(@name,'tj_trne')]"))
ends-with()(XPath1.0中没有ends-with函数,2.0有,现在浏览器实现的都是1.0)
可以用如下代替:
findElement(By.xpath("//a[substring(@name,string-length(@name)-5)='trnews']"))
Substring处理字符串是包前不包后,xpath语法是从1开始 string-length求字符串长度
contains() 包含
findElement(By.xpath("//a[contains(@name,'trnews')]"))
6、使用任意属性值匹配元素
findElement(By.xpath("//*[@*='tj_trnews']"))
- 使用xpath的text函数
driver.findElement(By.linkText("新闻")).click();
driver.findElement(By.partialLinkText("新")).click();
findElement(By.xpath("//a[text()='新闻']")) 绝对匹配
findElement(By.xpath("//a[contians(text(),'新')]")) 包含(模糊)匹配
五、css元素定位方式:
- 使用绝对路径来定位元素:(建议少用) id 用"#"号 class用"."
driver.findElement(By.cssSelector("html body div#wrapper div#head div.head_wrapper div#u1 a +a")).click();
- 使用相对路径来定位元素
driver.findElement(By.cssSelector("div#u1 a +a")).click();
By.cssSelector("div a.mnav")
- 下个节点:
对游历元素列表有用,比如表单(form)或者文字列(ul)元素,下个节点(next sibling) 将告诉selenium 去找页面上同一个父节点中下一个临近的元素。
- 使用id定位元素:
可以使用元素的ID来定位元素,先指定一个HTML标签,然后加上一个”#”符号,跟上id的属性值
findElement(By.cssSelector("input#kw"))
findElement(By.cssSelector("#kw"))
这种方法也是会找界面所有id=kw的元素,不一定能定位到我们要的元素上
- 使用属性值选择器来定位元素
单属性:
findElement(By.cssSelector("a[name='tj_trnews']"))
多属性:
findElement(By.cssSelector("a[name='tj_trnews'][class='mnav']"))
- 部分属性值的匹配
CSS选择器提供了一个部分属性值匹配定位元素的方法,这为了测试那些页面上具有动态变化的属性的元素是非常有用的,例如界面技术EXTJS的id,className是动态变化的。
匹配前缀:^= 匹配后缀:$=
匹配字符串:*= 内文字匹配:contains
findElement(By.cssSelector("a[name^='tj_'][class='mnav']"))
匹配以 tj_ 开始的链接
findElement(By.cssSelector("a[name$='news'][class='mnav']"))
匹配以 news 结尾的链接
findElement(By.cssSelector("a[name*='news'][class='mnav']"))
匹配包含 news 字符串的链接
driver.findElement(By.xpath("//a[@name='tj_trnews' and @class='mnav']")).click();
- 列表选择具体的匹配
Selenium中的CSS选择器允许我们更细致的浏览列表下的元素,如上图,我想选择第三行链接,可以用nth-of-type或者nth-child
findElement(By.cssSelector("div a[class='mnav']:nth-of-type(3)"))
findElement(By.cssSelector("div a[class='mnav']:nth-child(3)"))
总结:CSS定位语法比Xpath简洁,定位方式更灵活多样;不过对CSS理解比Xpath难;但不管是从性能上还是定位更复杂的元素上,CSS优于Xpath
建议:1. 如果做自动化、和开发约定:控制要设置唯一的"id"或设置"name"
2. 先css识别,效率快一些
3. xpath 基本上可以所有识别所有的对象