Selenium 2自动化测试实战——基于Python语言(txt+pdf+epub+mobi电子书下载)

作者:虫师

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Selenium 2自动化测试实战——基于Python语言

Selenium 2自动化测试实战——基于Python语言试读:

前言

记得在2013年,笔者计划要学习一门脚本语言用来辅助测试工作,当时在Ruby与Python之间犹豫不定。后来开始接手社区项目的测试工作,由于社区项目基于Python开发,所以,就自然选择了Python。Python语言的简单易用与丰富的类库给我带来了很大惊喜。

后来考虑到公司的Web产品比较适合进行自动化测试,再加上对产品的开发进度有很好的节奏把控,于是就有了充足的时间尝试开展自动化测试。在此之前,我对QTP和Selenium两个自动化测试工具都有过接触,考虑在这两者之间选择其一。一方面是我个人更偏向于使用开源工具,另一个重要原因是Selenium支持多种编程语言,包括Python。于是,就选择了Python与Selenium这样的组合进行产品自动化测试的尝试。

初期的学习遇到了不少问题。首先,Selenium本身并不是一个单独的工具,它包含IDE、Gird和WebDriver等几个部分;其次,Selenium与编程语言的关系,以及它在编程语言中所扮演的角色;最后,如何开发一个完整的自动化测试项目。初学者都会有这样的疑问。

当时,基于Python语言的Selenium自动化测试资料并不太多,大多资料都是基于Java语言的,所以学习过程也颇费周折。不过,在此过程中也得到了许多朋友的帮助,其中,乙醇的文档和MarkRabbit的细心指导对我的帮助很大,在此表示感谢。

从事软件测试工作不久后,我便养成了写博客的习惯,把平时的学习与积累用简单易懂的方式整理成博文,自然也会把这个技术以一个系列整理分享。后来,为了方便读者阅读,把这个系列的十几篇博文整理成了PDF格式,并命名为Selenium WebDriver(python),这应该可以看作本书的原型。再后来,不断地更新与扩充这份文档的内容,技术不再局限于WebDriver API的操作,于是更名为《Selenium 2 Python自动化测试实战》,基本知识体系已经确定。与此同时,与乙醇合作的自动化相关课程也在同步开展中,使本文档中的内容具有很强的实战性,以解决具体的问题为出发点,用大量的实例来说明自动化实施的思想与概念。

本书的写作目的并不是为了简单地告诉读者如何使用一个自动化测试工具,这并非我的初衷,我希望读者在学习本书的内容后能提高综合的技术高度与宽度,从而摆脱简单的手工测试,向高级测试工程师的道路迈进。为此,我用了一定的章节来介绍Python的基础与应用、BDD行为驱动、GitHub的使用,以及持续集成工具的使用等。

本书能够出版首先需要感谢编辑安娜,她为本书的出版提供了许多意见与帮助。其次,需要感谢以往各期的学生,在传授你们技术的过程中我同样也收获颇多。另外,还要感谢王成成、符志辉、张超、刘玉凤、吴宇、许晶晶、李娜、李朋程等学生,是你们帮助我校对了这本书中的内容。虫师第1章自动化测试基础

在正式开始本书的学习之前,我们有必要先来了解什么是软件测试,以及软件自动化测试相关的概念和工具,这将有助于对本书后面内容的学习。1.1 软件测试分类

软件测试领域名词颇多,许多测试新手容易混淆概念。因为从不同的角度对软件测试有不同的分类方法,所以,这里汇总常见软件测试的相关名词,让读者对软件测试领域有个概括性了解。

1.根据项目流程阶段划分软件测试

图1.1是一个典型的“V”模型软件开发流程,各项软件测试工作是在项目开发流程中循序渐进进行的。下面将介绍各个阶段测试的含义。

1)单元测试:单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程。

2)集成测试:集成测试是在单元测试的基础上,先通过单元模块组装成系统或子系统,再进行测试。重点是检查模块之间的接口是否正确。

3)系统测试:系统测试是针对整个产品系统进行的测试,验证系统是否满足需求规格的定义,以及软件系统的正确性和性能等是否满足其需求规格的要求。

4)验收测试:验收测试是部署软件之前的最后一个测试阶段。验收测试的目的是确保软件准备就绪,向软件购买者展示该软件系统能够满足用户的需求。图1.1 项目流程与对应的测试

2.白盒测试、黑盒测试、灰盒测试

白盒测试与黑盒测试,主要是根据软件测试工作中对软件代码的可见程度进行的划分。这也是软件测试领域中最基本的概念之一,如图1.2所示。图1.2 黑盒测试与白盒测试

1)黑盒测试

黑盒测试,指的是把被测的软件看作一个黑盒子,我们不去关心盒子里面的结构是什么样子的,只关心软件的输入数据和输出结果。

它只检查程序呈现给用户的功能是否按照需求规格说明书的规定正常使用、程序是否能接收输入数据并产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

2)白盒测试

白盒测试,指的是把盒子打开,去研究里面的源代码和程序执行结果。

它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条逻辑路径是否都能按预定要求正确工作。

3)灰盒测试

灰盒测试介于黑盒测试与白盒测试之间。

可以这样理解,灰盒测试既关注输出对于输入的正确性,同时也关注内部表现。但这种关注不像白盒测试那样详细、完整,它只是通过一些表征性的现象、事件、标志来判断内部的运行状态。有时候输出是正确的,但内部其实已经错误了,这种情况非常多。如果每次都通过白盒测试来操作,效率会很低,因此需要采取灰盒测试的方法。

3.功能测试与性能测试

从软件的不同测试面可以划分为功能测试与性能测试。

1)功能测试

功能测试主要检查实际功能是否符合用户的需求,因此测试的大部分工作也是围绕软件的功能进行。设计软件的目的就是满足用户对其功能的需求,如果偏离了这个目的,则任何测试工作都是没有意义的。

功能测试又可以细分为很多种:逻辑功能测试、界面测试、易用性测试、安装测试、兼容性测试等。

2)性能测试

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行的测试。

软件的性能包括很多方面,主要有时间性能和空间性能两种。

· 时间性能:主要是指软件的一个具体的响应时间。例如一个登录所需要的时间,一个商品交易所需要的时间等。当然,抛开具体的测试环境,来分析一次事务的响应时间是没有任何意义的,它需要在搭建好的一个具体且独立的测试环境下进行。

· 空间性能:主要指软件运行时所消耗的系统资源,例如硬件资源,CPU、内存、网络带宽消耗等。

4.手工测试与自动化测试

从对软件测试工作的自动化程度可以划分为手工测试与自动化测试。

1)手工测试

手工测试就是由测试人员一个一个地去执行测试用例,通过键盘鼠标等输入一些参数,并查看返回结果是否符合预期结果。

手工测试并非专业术语,手工测试通常是指我们在系统测试阶段所进行的功能测试,为了更明显地与自动化测试进行区分,这里使用了手工测试这种说法。

2)自动化测试

自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计测试用例并通过评审之后,由测试人员根据测试用例中描述的规则流程一步步执行测试,把得到的实际结果与期望结果进行比较。在此过程中,为了节省人力、时间和硬件资源,提高测试效率,便引入了自动化测试的概念。

自动化测试又可分为:功能自动化测试与性能自动化测试。

· 功能自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程。通过测试工具(或框架)录制/编写测试脚本,对软件的功能进行测试,并验证测试结果是否正确,从而代替部分的手工测试工作,达到节约人力成本和时间成本的目的。

· 性能自动化测试:通过性能工具来模拟成千上万的虚拟用户向系统发送请求,从而验证系统的处理能力。

5.冒烟测试、回归测试、随机测试、探索性测试和安全测试

这几种测试出现在软件测试的周期中,既不算具体明确的测试阶段,也不是具体的测试方法。

1)冒烟测试

是指在对一个新版本进行大规模的系统测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。

引入到软件测试中,就是指测试小组在正式测试一个新版本之前,先投入较少的人力和时间验证一个软件的主要功能,如果主要功能都没有运行通过,则打回开发组重新开发。这样做的好处是可以节省时间和人力投入到不可测的项目中。

2)回归测试

回归测试是指修改了旧代码后,重新进行测试以确认修改后没有引入新的错误或导致其他代码产生错误。

回归测试一般是在进行第二轮软件测试时开始的,验证第一轮软件测试中发现的问题是否得到修复。当然,回归也是一个循环的过程,如果回归的问题通不过,则需要开发人员修改后再次进行回归,直到所有问题回归通过为止。

3)随机测试

是指测试中的所有输入数据都是随机生成的,其目的是模拟用户的真实操作,并发现一些边缘性的错误。

随机测试可以发现一些隐蔽的错误,但是也有很多缺点,例如测试不系统、无法统计代码覆盖率和需求覆盖率、发现的问题难以重现等。一般是放在测试的最后执行。随机测试更专业的升级版叫做探索性测试。

4)探索性测试

探索性测试可以说是一种测试思维技术,它没有很多实际的测试方法、技术和工具,但却是所有测试人员都应该掌握的一种测试思维方式。探索性测试强调测试人员的主观能动性,抛弃繁杂的测试计划和测试用例设计过程,强调在碰到问题时及时改变测试策略。

5)安全测试

安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成至发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。

安全测试现在越来越受到企业的关注和重视,因为由于安全性问题造成的后果是不可估量的,尤其是互联网产品,最容易遭受各种安全攻击。1.2 分层的自动化测试

测试金字塔的概念由敏捷大师Mike Cohn在他的Succeeding with Agile一书中首次提出,如图1.3所示。他的基本观点是:我们应该有更多的低级别的单元测试,而不仅仅是通过用户界面运行的高层的端到端的测试。图1.3 测试金字塔

Martin Fowler大师在测试金字塔模型的基础上提出分层自动化测试的概念。在自动化测试之前加了一个“分层”的修饰,以区别于“传统的”自动化测试。那么什么是传统的自动化测试?为何要提倡分层自动化测试的思想呢?

所谓传统的自动化测试我们可以理解为基于产品UI层的自动化测试,它是将黑盒功能测试转化为由程序或工具执行的一种自动化测试。

在目前的大多数研发组织当中,都存在开发与测试团队割裂(部门墙)、质量职责错配(测试主要对质量负责)的问题,在这种状态下,测试团队的一个“正常”反应就是试图在测试团队能够掌控的黑盒测试环节进行尽可能全面的覆盖,甚至是尽可能全面的UI自动化测试。

这可能会导致两个恶果:一是测试团队规模的急剧膨胀;二是所谓的全面UI自动化测试运动。因为UI是非常易变的,所以UI自动化测试维护成本相对高昂。

分层自动化测试倡导的是从黑盒(UI)单层到黑白盒多层的自动化测试体系,从全面黑盒自动化测试到对系统的不同层次进行自动化测试,如图1.4所示。图1.4 分层自动化测试

1.单元自动化测试

单元自动化测试是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元是指一个函数,Java中单元是指一个类,图形化的软件中单元是指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。规范的进行单元测试需要借助单元测试框架,如Java语言的Junit、TestNG,C#语言的NUnit,以及Python语言的unittest、pytest等,目前几乎所有的主流语言都有其相应的单元测试框架。

Code Review 中文翻译为代码评审或代码审查,是指在软件开发过程中,通过对源代码进行系统性检查的过程。通常的目的是查找系统缺陷、保证软件总体质量以及提高开发者自身水平。与Code Review相关的插件和工具有很多,例如Java语言中基于Eclipse的ReviewClipse和Jupiter、主要针对Python语言的Review Board等。

2.接口自动化测试

根据笔者的理解,Web应用的接口自动化测试大体分为两类:模块接口测试和Web接口测试。

1)模块接口测试,主要测试模块之间的调用与返回。当然,我们也可以将其看作是单元测试的基础。它主要强调对一个类方法或函数的调用,并对返回结果的验证,所用到的测试工具与单元自动化测试相同。

2)Web接口测试又可分为两类:服务器接口测试和外部接口测试。

· 服务器接口测试:指测试浏览器与服务器的接口。我们知道Web开发一般分前端和后端,前端开发人员用HTML/CSS/JavaScript等技术,后端开发人员用PHP/Java/C#/Python/Ruby等各种语言。用户的操作是在前端页面上,需要后端提供服务器接口,前端通过调用这些接口来获得需要的数据,通过HTTP协议实现前后端的数据传递。

· 外部接口测试:指调用的接口由第三方系统提供。典型的例子就是第三方登录,例如新上线的产品为了免于新用户注册账号的麻烦会提供第三方登录,那么用户在登录的时候调用的就是第三方登录的接口,用户登录信息的验证由第三方完成,并返回给当前系统是否验证通过。

当然,接口测试也有相应的类库或工具,例如测试HTTP的有HttpUnit、Postman等。

3.UI自动化测试

UI层是用户使用该产品的入口,所有功能都通过这一层提供并展示给用户,所以测试工作大多集中在这一层进行。为了减轻这一层的测试人力和时间成本,早期的自动化测试工具主要针对该层设计。目前主流的测试工具有UFT、Watir、Robot Framework、Selenium等。

除UI层所展示的功能外,前端代码同样需要进行测试。在前端开发中最主要的莫过于JavaScript脚本语言,而QUnit就是针对JavaScript的一个强大的单元测试框架。

图1.4中的测试金字塔映射了不同测试阶段所投入的自动化测试的比例,UI层被放到了塔尖,这也说明UI层应该投入较少的自动化测试。如果系统只关注UI层的自动化测试并不是一种明智的做法,因为其很难从本质上保证产品的质量。如果妄图实现全面的UI层的自动化测试,那么需要投入大量的人力和时间,然而,最终获得的收益可能远低于所投入的成本。因为对于一个系统来讲,越接近用户其越容易变化,为了适应这种变化就必须要投入更多的成本。

既然UI层的自动化测试这么劳民伤财,那么我们是不是只做单元测试与接口测试就可以了呢?答案是否定的,因为不管什么样的产品,最终呈现给用户的都是UI层的功能,所以产品才需要招聘大量的测试人员进行UI层的功能测试。也正是因为测试人员在UI层投入了大量的时间与精力,所以我们才有必要通过自动化的方式帮助测试人员解放部分重复的工作。所以,笔者更提倡“半自动化”的开展测试工作,把可以自动化测试的工作交给工具或脚本完成,这样测试人员就可以把更多的精力放在更重要的测试工作上,例如探索性测试等。

至于在金字塔中每一层测试的投入比例则要根据实际的产品特征来划分。在《Google测试之道》一书中提到,Google对产品测试类型划分为:小测试、中测试和大测试,采用70%(小)/20%(中)/10%(大)的比例,大体对应测试金字塔中的Unit、Service和UI层。

在进行自动化测试中最担心的是变化,因为变化会直接导致测试用例的运行失败,所以需要对自动化脚本进行不断调整。如何控制失败、降低维护成本是对自动化测试工具及人员能力的挑战。反过来讲,一份永远都运行通过的自动化测试用例已经失去了它存在的价值。1.3 什么样的项目适合自动化测试

相信在你拿到这本书时已经对要进行自动化的项目做了一些分析和考量,但在这里我们还是有必要说明一下什么样的项目适合尝试进行自动化测试,以免读者在不太适合自动化测试的项目中痛苦挣扎,既浪费了大量的人力和时间,又收效甚微。

1)任务测试明确,不会频繁变动。

2)每日构建后的测试验证。

3)比较频繁的回归测试。

4)软件系统界面稳定,变动少。

5)需要在多平台上运行的相同测试案例、组合遍历型的测试,大量的重复任务。

6)软件维护周期长。

7)项目进度压力不太大。

8)被测软件系统开发较为规范,能够保证系统的可测试性。

9)具备大量的自动化测试平台。

10)测试人员具备较强的编程能力。

当然,并非以上10条都具备的情况下才能开展自动化测试工作,因此需要读者做出权衡。在我们普遍的自动化测试经验中,一般满足以下三个条件就可以对项目开展自动化测试。

1)软件需求变动不频繁

自动化测试脚本变化的大小与频率决定了自动化测试的维护成本。如果软件需求变动过于频繁,那么测试人员就需要根据变动的需求来不断地更新自动化测试用例,从而适应新的功能。而脚本的维护本身就是一个开发代码的过程,需要扩展、修改、调试,有时还需要对架构做出调整。如果所花费的维护成本高于利用其节省的测试成本,那么自动化测试就失去了它的价值与意义。

一种折中的做法是先对系统中相对稳定的模块与功能进行自动化测试,而变动较大的部分用手工进行测试。

2)项目周期较长

由于自动化测试需求的确定、自动化测试框架的设计、脚本的开发与调试均需要时间来完成,而这个过程本身就是一个软件的开发过程,如果项目的周期较短,没有足够的时间去支持这样一个过程的话,那么就不需要进行自动化测试了。

3)自动化测试脚本可重复使用

自动化测试脚本的重复使用要从三个方面来考量:一是所测试的项目之间是否存有很大的差异性(如C/S系统架构与B/S系统架构的差异);二是所选择的测试技术和工具是否适应这种差异;三是测试人员是否有能力设计开发出适应这种差异的自动化测试框架。1.4 自动化测试及工具简述

自动化测试的概念有广义与狭义之分:广义上来讲,所有借助工具来辅助进行软件测试的方式都可以称为自动化测试;狭义上来讲,主要指基于UI层的功能自动化测试。

注意:如果没有特别说明,则本文所说的“自动化测试”均指“基于UI的功能自动化测试”。

目前市面上的自动化测试工具非常多,下面几款是比较常见的自动化测试工具。

1)UFT

UFT(Unified Functional Testing)由QTP(Quick Test Professional software)与ST(Service Test)合并而来,由HP公司开发。它是一个企业级的自动测试工具,提供了强大易用的录制回放功能,同时兼容对象识别模式与图像识别模式两种识别方式,支持B/S与C/S两种架构的软件测试,是目前主流的自动化测试工具。

2)Robot Framework

Robot Framework是一款基于Python语言编写的自动化测试框架,具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试。

3)Watir

Watir(Web Application Testing in Ruby)是一个基于Web模式的自动化功能测试工具。Watir是一个Ruby语言库,使用Ruby 语言进行脚本开发。

4)Selenium

Selenium也是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试。目前在Web自动化领域应用越来越广泛。

当然,除上面所列的自动化测试工具外,根据不同的应用还有很多商业的或开源的以及公司自己开发的自动化测试工具。1.5 Selenium工具介绍

1.什么是Selenium?

Selenium主要用于Web应用程序的自动化测试,但并不局限于此,它还支持所有基于Web的管理任务自动化。

Selenium 的特点如下:

· 开源,免费;

· 多浏览器支持:Firefox、Chrome、IE、Opera、Edge;

· 多平台支持:Linux、Windows、MAC;

· 多语言支持:Java、Python、Ruby、C#、JavaScript、C++;

· 对Web页面有良好的支持;

· 简单(API简单)、灵活(用开发语言驱动);

· 支持分布式测试用例执行。

Selenium经历了两个版本,Selenium 1.0和Selenium 2.0。Selenium不是由单独一个工具构成的,而是由一些插件、类库组成,每个部分都有其特点和应用场景,Selenium 1.0家谱,如图1.5所示。图1.5 Selenium 1.0家谱

2.Selenium IDE

Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。那么什么情况下用到它呢?官方给出了它自身作用的定位:

快速地创建bug重现脚本,在测试人员测试过程中,发现bug之后可以通过IDE将重现的步骤录制下来,以帮助开发人员更容易地重现bug。

IDE录制的脚本可以转换成多种语言,从而帮助我们快速地开发脚本。关于这个功能在后面的章节中我们会着重介绍。

3.Selenium Grid

Selenium Grid是一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-App的功能测试。利用Grid可以很方便地实现在多台机器上和异构环境中运行测试用例。

4.Selenium RC

Selenium RC(Remote Control)是Selenium家族的核心部分。Selenium RC支持多种不同语言编写的自动化测试脚本,通过Selenium RC的服务器作为代理服务器去访问应用,从而达到测试的目的。

Selenium RC分为Client Libraries和Selenium Server。Client Libraries库主要用于编写测试脚本,用来控制Selenium Server的库。Selenium Server负责控制浏览器行为。总的来说,Selenium Server主要包括三个部分:Launcher、Http Proxy和Core。其中,Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JavaScript函数的集合,即通过这些JavaScript函数,我们才可以实现用程序对浏览器进行操作。Launcher用于启动浏览器,把Selenium Core加载到浏览器页面当中,并把浏览器的代理设置为Selenium Server 的Http Proxy。

5.Selenium 2.0

搞清了Selenium 1.0 的家族关系,再来看看Selenium 2.0。Selenium 2.0就是把WebDriver加入到了这个家族中,简单用公式表示为:

Selenium 2.0=Selenium 1.0+WebDriver

需要强调的是,在Selenium 2.0中主推的是WebDriver,可以将其看作Selenium RC的替代品。因为Selenium为了保持向下的兼容性,所以在Selenium 2.0中并没有彻底地抛弃Selenium RC。如果是初次使用Selenium开发一个新的自动化测试项目,那么可以直接使用WebDriver。Selenium RC与WebDriver 有什么区别呢?

Selenium RC是在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript翻译器来翻译和执行selenese命令(selenese是Selenium命令集合)。

WebDriver是通过原生浏览器支持或者浏览器扩展来直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript,与浏览器紧密集成,因此支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持之外,WebDriver还利用操作系统级的调用,模拟用户输入。

Selenium与WebDriver原是属于两个不同的项目,WebDriver的创建者Simon Stewart早在2009年8月的一份邮件中解释了项目合并的原因。

Selenium与WebDriver合并原因:为何把两个项目合并?部分原因是WebDriver解决了Selenium存在的缺点(例如能够绕过JavaScript沙箱,我们有出色的API),部分原因是Selenium解决了WebDriver存在的问题(例如支持广泛的浏览器),部分原因是因为Selenium的主要贡献者和我都觉得合并项目是为用户提供最优秀框架的最佳途径。1.6 前端技术介绍

由于Selenium是基于Web的自动化测试技术,而我们要操作的对象是Web页面,所以有必要对前端Web的技术与工具作一个简单介绍。

1.HTML简介

HTML(Hyper Text Markup Language)中文为超文本标记语言,是网页的基础。它并不是一种编程语言,而是一种标记语言(一套标记标签),但我们可以在HTML标签中嵌入各种前端脚本语言,如VBScript、JavaScript等。下面是一个简单的HTML页面:

html

与之间的文本用于描述网页。

与之间的文本用于定义文档的头部,它是所有头部元素的容器。

之间的文本显示在浏览器的标题栏。

与之间的文本是可见的页面内容。

之间的文本被显示为正文,h1表示为一号字体。

现在我们通过浏览器打开任意一个页面,在页面上的右键菜单中单击“查看网页源代码”,在复杂的前端代码中依然可以找到HTML的身影。

当然,HTML还定义了许多其他标签,读者可以登录w3school网站学习。

2.JavaScript简介

JavaScript是一种由Netscape公司的LiveScript发展而来的前端脚本语言(脚本语言是一个种轻量级的语言),是一种解释性语言(代码执行不需要预编译),被设计用来向HTML页面添加交互行为,通常被直接嵌入到HTML页面。

如果要在HTML页面中使用JavaScript,则需要添加就可以告诉浏览器,JavaScript脚本从何处开始,到何处结束。使用document.write()可以向文档输出内容。

3.XML简介

XML是指扩展标记语言,是标准通用标记语言的一个子集。与HTML类似,但它并非HTML的替代品,它们为不同的目的而设计。HTML被设计用来显示数据,其焦点是数据的外观;XML被设计为传输和存储数据,其焦点是数据的内容。

下面是一个简单的XML文件。

xml_file.xml

一个应该包含XML的声明,它定义了XML文档的版本号。

定义了文档里的第一个元素,也叫根元素。

、为根元素的子元素,他们分别包含了发送者与接收者的信息。这个XML文档仅仅是用标签包装了纯粹的信息,我们需要编写软件或程序,才能传送、接收和显示出这个文档。

XML允许我们自己定义标签,上例中的标签没在任何XML标准中定义过,如,这些标签是由我们自己定义的。

上面只是简单介绍了HTML、JavaScript以及XML等前端技术,了解这些技术将有助于我们顺利地进行Web自动化测试工作。1.7 前端工具介绍

1.FireBug

FireBug是Firefox浏览器下的一套开发类插件,相信很多读者对这款前端工具并不陌生。它集HTML查看和编辑、Javascript控制台、网络状况监视器、Cookie查看于一体,是开发JavaScript、CSS、HTML和Ajax的得力助手,如图1.6所示。图1.6 FireBug

我们可以通过它方便地查看页面上的元素,从而根据其属性进行定位。在Web自动化测试脚本的编写过程中,此工具起着至关重要的作用。

FireBug安装方式:首先在Firfox浏览器的菜单栏中单击tools(工具)→add-ons Manager(添加组件),搜索FireBug。然后对搜索到的插件进行安装,安装完成后重启浏览器,即可在工具栏中看到FireBug的按钮。

2.FirePath

FirePath是FireBug插件扩展的一个工具,用来编辑、检查和生成的XPath1.0表达式、CSS 3选择器以及jQuery选择器。可以帮助我们通过XPath和CSS来快速定位页面上的元素,如图1.7所示。图1.7 FirePath

当通过FireBug的鼠标箭头选择一个页面元素后,FirePath输入框将给出XPath的表达式,快速地帮助我们定位元素。我们可以点击“XPath:”按钮切换到CSS定位方式,从而获得一个元素的CSS定位方式。FirePath的安装方式与FireBug类似。

3.Chrome开发人员工具与IE开发人员工具

Chrome 和IE浏览器同样也提供了类似FireBug 的开发人员工具,可以帮助我们定位页面元素。

Chrome浏览器默认自带Chrome开发人员工具,单击Chrome浏览器右上角的菜单按钮,在下拉菜单中选择“工具”→“开发人员工具”即可打开,还可以通过快捷键Ctrl+Shift+I或 F12打开,如图1.8所示。图1.8 Chrome开发人员工具

IE浏览器从IE8版本开始加入了开发人员工具,用起来也非常方便。单击菜单栏“工具”→“F12开发人员工具”或者通过快捷键F12即可打开,如图1.9所示。值得一提的是,它提供了浏览器的兼容模式,我们可以通过选择浏览器模式切换到不同的IE版本,这将非常方便地帮助我们测试IE浏览器的兼容性。图1.9 IE开发人员工具1.8 开发语言的选择

通过前面的介绍,我们了解到Selenium WebDriver支持多种语言的开发,如Java、Python、Ruby、PHP、C#、JavaScript 等,那么我们应该选择哪一种语言结合Selenium WebDriver进行自动化开发呢?这里笔者给出一点自己的看法。

有人说我们公司的软件是用某语言开发的,所以自动化测试也要选某语言;其实软件开发语言和软件自动化测试语言没有必然联系。也就是说,基于Python(+ Selenium)编写的自动化测试脚本既可以测试基于Java开发的Web项目,也可以测试基于PHP开发的Web项目。所以,在选择Selenium自动化测试语言时不需要考虑与开发语言的一致性。

选择与开发相同的语言当然有有利的一面,测试人员通过编写自动化测试实践,既提高了自己的编码能力,也有助于其他开发测试工作的进行。例如,协助开发人员定位代码级的bug,协助开发人员进行单元测试等,而这些工作就需要熟悉开发人员所使用的语言了。

本书并没有像市面上已经出版的几本Selenium书一样选用应用更为广泛的Java、C#,而是选用了Python,主要有以下几个方面的考虑。

对编程能力较弱的初学者来说,Python与Ruby等语言更容易学习和使用。通过自动化测试技术的实践,读者不仅可以掌握自动化测试技术,还能掌握一门语法简单且功能强大的编程语言。那为什么选Python而不选Ruby 呢?这其中存在一定的个人偏好,因为Ruby是一个“魔法”语言,时常会给你带来很多惊喜,而Python 的宗旨是使处理问题变得更简单,它们之间存在不同的设计哲学。当然,不管选择哪一种编程语言,都会有个人的需求驱动与偏好在里面。

Python语言除了在自动化测试领域有出色的表现外,在系统编程、网络编程、Web开发、GUI开发、科学计算以及游戏开发等多个领域都应用得非常广泛,而且具有非常良好的社区支持。也就是说,学习和掌握Python编程,其实是为你打开了一道更为广阔的大门。

对有编程经验的读者来说,学习Python语言的成本很低,你完全可以在很短的时间内学习和使用Python来处理问题。有一个看上去还不错的一门语言,为什么不去尝试使用一下呢?当然,对于同样想学习Selenium自动化测试技术,而不愿意尝试使用Python语言的读者来说,本书的例子虽然基于Python语言,但更多的是提供处理问题的思路与方法,所以,同样可以把本书作为参考资料。

虽然本书中涉及Python语言的地方都会进行单独讲解,但为了初学者能系统全面地使用Python语言,笔者建议准备好一本Python基础教程放在身边,以便有疑问的地方随时翻阅。第2章测试环境搭建

也许你已经迫不及待地坐在了电脑前面,想要开始自动化测试之旅。不要着急,在此之前,我们需要先搭建好测试所需的开发环境。如果你选择使用Python和Selenium来从事自动化测试工作,从这本书开始,没错的!2.1 Windows下的环境搭建

如果想要学习一门编程语言,对于新手来说只需到其官方网站上去下载最新版本安装即可,但对于想要学习Python的新手来说,将会面临一个版本选择的问题。因为Python同时存在两个版本(Python 2和Python 3),而这两个版本目前处于并行更新状态。

之所以会有两个版本并存的情况,是因为早期的Python版本在基础方面设计存在着一些不足之处,Python 3在设计的时候很好地解决了这些遗留问题,并且在性能上也有了一定的提升,但同时带来的新问题就是不完全向后兼容,所以就造成了两个版本并存的情况。

就目前情况来看,两个版本的更新与维护都在继续。并且Python 2的开发者依然过半。在笔者看来读者选择哪一个版本进行入门学习都可以,对有丰富经验的Pythoner来说,选择使用哪个版本取决于他们当前要使用的库、框架是否支持该版本,当然,对于新手来说选择Python 3的最大好处就是可以很大程度地避免编码问题。

在该书出版时,笔者纠结该选择Python 2还是Python 3,因为本书中涉及的部分库目前还不支持Python 3,例如,第8.1节的HTMLTestRunner,第12章中的Lettuce等。站在未来的角度,决定将所有代码基于Python 3实现并说明与Python 2的不同之处,这样读者不管选用哪一版本都可以按照本书的内容进行学习。2.1.1 安装Python

访问Python官方网站:https://www.Python.org/。

找到下载页面下载最新版本的Python 3,截至作者发稿,最新版本为Python 3.5。读者可根据自己的平台选择相应的版本进行下载。对于Windows用户来说,如果是32位系统则选择x86版本;如果是64位系统,则选择64版本。下载完成后会得到一个以.msi为后缀名的文件,双击进行安装,如图2.1所示。图2.1 Python安装界面

安装过程与一般的Windows程序类似。安装完成后,可在开始菜单中看到安装好的Python目录,如图2.2所示。图2.2 Python目录

打开Python自带的IDLE,就可以编写Python程序了,Python Shell界面如图2.3所示。图2.3 Python Shell界面

或者通过在Windows命令提示符下输入“python”命令,也可以进入Python Shell模式,如图2.4所示。图2.4 命令提示符

小提示:如果提示Python不是内部或外部命令!别急,把Python的安装目录添加到系统环境变量的Path下面,右击桌面“我的电脑”,打开右键菜单,在属性→高级→环境变量→系统变量的Path中添加:

变量名:PATH

变量值:;C:\Python35

也可以在图2.1所示Python安装界面,勾选 Add Python 3.5 to PATH复选框,在安装完成后自动完成PATH配置工作。2.1.2 安装setuptools与pip

setuptools是Python Enterprise Application Kit(PEAK)的一个副项目,它是Python的distutilsde工具的增强工具,可以让程序员更方便地创建和发布 Python 包,特别是那些对其他包有依赖性的状况。

经常使用Python的读者可能会注意到,当需要安装第三方Python包时,可能会用到easy_install 命令。easy_install是由PEAK开发的setuptools包里带的一个简易安装命令,因此使用easy_install时实际上是在调用setuptools来完成安装模块的工作。

pip是一个安装和管理Python包的工具,通过pip来安装Python包变得十分简单,我们将省去搜索→查找版本→下载→安装等烦琐的过程。pip的安装依赖于setuptools,所以在安装pip之前需要先安装setuptools。需要注意的是,目前Python 3并不支持setuptools,因此需要使用distribute。

setuptools与pip下载地址如下:

通过上面的地址进行下载,将得到下面两个包(随着时间变化,包的版本号会有所更新)。

通过解压缩工具进行解压,将得到相应的文件夹。在Windows命令提示符下进入文件解压缩目录,通过python命令执行setup.py进行安装。以下分别为安装setuptools与pip的命令:

cmd.exe

不过,在最新 Python安装包中已经集成了 pip,读者可以到 Python安装目录C:\Python35\Script\下查看是否有 pip.exe或 pip3.exe文件。如果有则可以直接在 Windows命令提示符下输入pip或pip3命令:

cmd.exe

如果出现pip命令的说明信息,则说明我们已经安装成功。如果提示pip不是内部或外部命令,则可以手动将C:\Python35\Scripts\目录添加到系统环境变量下的Path下面,重新打开cmd命令行验证。2.1.3 安装Selenium

Selenium这里不再过多介绍,前面安装pip是为了更方便地安装Selenium包,通过pip命令可直接安装Selenium包:

cmd.exe

安装 pip的好处是可以使用 pip命令方便地安装 Python第三方库,就像当前安装Selenium一样简单。在通过pip安装Python第三方库时,如果只输入包名,则默认安装当前库中最新的版本,如果我们不想安装最新版本的包,则可以在包名后面加版本号。

cmd.exe

pip下面包含了很多命令,正如我们前面只输入一个有pip后回车所得到的提示。show命令可查看安装包的版本及安装路径。2.1.4 ActivePython

ActivePython是由ActiveState公司推出的Python专用编程和调试工具。

ActivePython包含了完整的Python内核,可直接调用Python官方的开源内核;此外还有Python编程需要用到的IDLE,并附加了一些Python的Windows扩展,同时还提供了访问Windows APIs的所有服务。ActivePython虽然不像纯Python那样是开源的,但也可以免费下载使用。

使用ActivePython的好处是它已经集成了pip包管理工具,可以直接通过pip命令来安装Python第三方库。

ActivePython下载地址如下:

ActivePython同样支持Windows、Mac和Linux等平台,读者可根据自己的平台下载相应的ActivePython版本,安装界面如图2.5所示。图2.5 ActivePython安装界面

ActivePython的安装过程与Python相同,安装完成后,同样会在Windows开始菜单中生成相应的菜单项。

安装ActivePython后,可以以同样的方式使用pip命令安装Selenium库,过程同上,这里不再赘述。2.2 Ubuntu下的环境搭建

Linux操作系统的版本很多,这里以流行的Ubuntu系统为例,介绍在其下面的安装过程。

因为Ubuntu系统本身对Python有很强的依赖,所以Ubuntu自带的就有Python。笔者曾因不小心卸载了Ubuntu系统自带的Python,从而导致系统无法正常启动,这一点也说明了Python在不同领域都有非常广泛的应用。

当前在Ubuntu系统中已经同时集成了Python 2与Python 3,打开终端,输入“python 2”或“Python 3”命令回车,即可进入相应版本的Python Shell模式。

ubuntu终端

下面我们在Ubuntu的Python 3下安装setuptools与pip,因为它们已经存在于Ubuntu的软件仓库之中,所以可以使用apt-get命令进行安装。apt-get是debian、Ubuntu等发行版Linux系统的包管理工具。

安装setuptools的命令如下:

ubuntu终端

小提示:apt-get命令一般需要root权限执行,所以在使用apt-get命令之前需要先切换到root用户,如果不想切换为root用户,则可以在命令前加sudo。sudo命令是允许系统管理员让普通用户执行一些或者全部root命令的一个工具。

例:sudo apt-get xxxx

用同样的方法安装pip。

ubuntu终端

如果通过apt-get命令无法安装,则参考Windows下面的安装方式,先到Python官方网站下载相应安装包,解压执行setup.py文件进行安装。

如果想使用Python 3的pip安装Selenium,可以通过以下命令。

ubuntu终端2.3 使用IDLE编写Python

通过上面烦琐的配置后我们终于搭建好需要的自动化开发环境了,那么你一定迫不及待要跟着我一起写自动化脚本了,别急!在此之前我们需要先找到合适的 IDE(Integrated Development Environment,集成开发环境)。如果你是一位编程老手,那么你一定有自己趁手的IDE;如果是一位编程菜鸟,那么Python自带的IDLE是个不错的入门之选。

IDLE(Python GUI)是一个功能完备的代码IDE,允许你在这个IDE中编写代码,另外还有一个Python Shell(Python的交互模式),可以在其上面进行编程练习。

启动IDLE时,会显示“三个尖括号”提示符(>>>),可以在这里输入代码。在Python Shell输入代码回车后会立即执行,并直接在下面显示执行的结果,如图2.6所示。图2.6 Python Shell下输入代码

IDLE提供了大量的特性,不过只需了解其中一小部分就能高效地使用IDLE。

1.Tab键自动补全

先键入Python关键字的前面几个字母,然后按下Tab键,IDLE会自动匹配出相应的关键字。通过键盘上下键进行选择,从而提高代码输入速度,降低输错率,如图2.7所示。图2.7 Tab键自动补全

2.回退代码语句

可以通过组合键Alt+P回退到上一次编辑的Python代码,组合键Alt+N与之相反,可以前进至下一次编辑的代码。如果在Python Shell模式下,代码不小心写错导致执行错误,那么通过回退修改要比重新输入一遍高效得多,如图2.8所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?