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


发布时间:2020-09-24 22:05:19

点击下载

作者:虫师

出版社:电子工业出版社

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

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

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

前言

《Selenium2自动化测试实战——基于Python语言》出版后,我陆续收到许多反馈,有很多同学(我习惯这么称呼软件测试的同行)通过这本书学会了Selenium自动化测试,这是我写这本书的初衷,能在你学习测试技术的道路上提供一点点帮助,我感到非常高兴!也有同学向我反馈了书中的一些错误,在此深表感谢。

随着我在自动化测试技术上的积累,我越发觉得《Selenium2自动化测试实战——基于Python语言》一书有许多不足之处,有些内容已经过时,有些技术需要更进一步的探讨。2017年的时候我萌生要写第二版的想法,当时只是想对少部分内容进行修改,直接到2018年下半年才开始动笔重新整理内容。我写书的方式是一遍遍地修改书中的内容,所以,虽然不是从头到尾写一本新书,但也花费了半年之久。

前面的章节安排与《Selenium2自动化测试实战——基于Python语言》一书相比,变化不大,但里面的内容都有改动,主要是替换或修改了里面的例子。随着我对自动化测试的理解,更正了前一本书中的部分观点。(1)加入了pytest单元测试框架的使用方法,与unittest相比,pytest的功能更加强大,而且还有丰富的扩展库,更适合用来做自动化测试。(2)补充了Jenkins的使用方法。(3)增加了3章appium移动自动化测试工具的介绍。随着移动互联网的发展,移动自动化测试几乎成为测试人员必备技能之一,appium正是在Selenium的基础上扩展而来的自动化工具。

当然,在上一本的基础上,本书也删减了部分内容。(1)删掉了Selenium IDE相关的内容,越来越多的测试人员使用WebDriver编写自动化脚本,Selenium IDE作为浏览器的自动化插件,已经很少有同学单独使用它完成大型自动化项目了。(2)删掉了Python多线程相关的内容。多线程的优点是可以提高自动化测试的执行速度,缺点是降低了自动化的稳定性。本书介绍了减少测试用例执行时间的其他方法。(3)删掉了BDD行为驱动开发相关的内容,本书更聚焦于自动化测试技术,所以,其他技术请参考专业的书进行学习。

本书在命名时也颇为纠结,本书的内容属于《Selenium2自动化测试实战——基于Python语言》升级版,如果命名为《Selenium2自动化测试实战——基于Python语言(第二版)》可以看出这种继承关系,但是书中内容是基于Selenium3编写的,所以最终命名为《Selenium3自动化测试实战——基于Python语言》。

在本书出版之际,Selenium4已在开发当中,从Selenium官方给出的消息来看,Selenium4对于本书的内容影响很小。

最后,由于作者水平有限,书中难免有错误之处,希望你能将错误反馈给我,我将感激不尽。感谢编辑安娜,没有她的帮助本书无法出版。感谢读者的厚爱,正是你们的鼓励和支持,才使我有动力完成本书。虫师2019年6月

读者服务

轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。

● 提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

● 与读者交流:在页面下方【读者评论】处留下您的疑问或观点,与其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/36924第1章 自动化测试基础1.1 分层的自动化测试

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

测试金字塔如图1-1所示。图1-1 测试金字塔

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

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

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

1.单元自动化测试

单元自动化测试是指对软件中的最小可测试单元进行检查和验证。

将单元测试交给测试人员去做,有利有弊,整体来说,由开发人员去做更为合适。

测试人员做单元测试的优势是具备测试思维,在设计测试用例时考虑更加全面;但劣势也很明显,目前,大多数测试人员很难做到像开发人员一样熟悉被测代码。

让开发人员去写单元测试,优势非常明显,没有谁比开发人员更熟悉自己写的代码了他们只需掌握单元测试框架的使用和一些常用的测试方法,即可写单元测试,而且定位bug时更加方便。

所以,测试人员可以教开发人员如何使用单元测试框架和测试方法,而不是代替开发人员去写单元测试。

2.接口自动化测试

Web应用的接口自动化测试大体分为两类:模块接口测试和协议接口测试。(1)模块接口测试,主要测试程序模块之间的调用与返回。它主要强调对一个可实现完整功能的类、方法或函数的调用的测试。(2)协议接口测试,主要测试对网络传输协议的调用,如HTTP/SOAP等,一般应用在前端和后端开发之间,以及不同项目之间。

模块接口测试更适合开发人员去做;协议接口测试既可以由开发人员去做,也可以由测试人员去做。

3.UI自动化测试

UI自动化测试以实现手工测试用例为主,可降低系统功能回归测试的成本(人力成本和时间成本)。UI自动化测试由部分功能测试用例提炼而来,更适合测试人员去做。

在《Google 测试之道》一书中,Google把产品测试类型划分为:小测试、中测试和大测试,采用70%(小)、20%(中)和10%(大)的比例,分别对应测试金字塔中的Unit层、Service层和UI层。1.2 适合自动化测试的项目

参考以下几点:(1)任务测试明确,不会频繁变动。(2)每日构建后的测试验证。(3)比较频繁的回归测试。(4)软件系统界面稳定,变动少。(5)需要在多平台上运行的相同测试案例、组合遍历型的测试,以及大量的重复任务。(6)软件维护周期长。(7)项目进度压力不太大。(8)被测软件系统开发较为规范,能够保证系统的可测试性。(9)具备大量的自动化测试平台。(10)测试人员具备较强的编程能力。

当然,并非以上10条都具备的情况下才能开展自动化测试工作。根据我们的经验,一般来说,满足以下3个条件就可以对项目开展自动化测试。(1)软件需求变动不频繁。(2)项目周期较长。(3)自动化测试脚本可重复使用。1.3 如何学习UI自动化测试

要想学好基于Selenium/appium的UI自动化测试,应从以下3个方面入手。

1.编程语言

Selenium/appium支持多种编程语言(Java、Python、Ruby、C#、JavaScript等),更准确地说,Selenium/appium针对每种编程语言都开发了相应的Selenium/appium测试库。

编程语言是基础,UI自动化能否做好,除元素是否好定位外,更与自动化项目的设计有关如何设计方便扩展和维护的自动化测试项目对UI自动化测试来说非常重要,而自动化项目的设计离不开扎实的编程基础。

2.Selenium/appium API

Selenium(WebDriver)和appium API提供了操作Web/App的类和方法。我们只需使用这些方法即可操作Web页面上的元素或App上面的控件。

3.单元测试框架

如何定义一条测试用例、如何组织和运行测试用例,以及如何统计测试用例的运行结果(总测试用例数、成功测试用例数、失败测试用例数等),都是由单元测试框架实现的。单元测试框架是编写自动化测试用例的基础。1.4 Selenium简介

Selenium经历了三个大版本,Selenium 1.0、Selenium 2.0和Selenium 3.0。Selenium不是由单独一个工具构成的,而是由一些插件和类库组成的,这些插件和类库有其各自的特点和应用场景。Selenium 1.0家族关系如图1-3所示。图1-3 Selenium 1.0家族关系

1.Selenium 1.0(1)Selenium IDE。

Selenium IDE是嵌入在Firefox浏览器中的一个插件,可实现简单的浏览器操作的录制与回放功能。(2)Selenium Grid。

Selenium Grid是一个自动化测试辅助工具。利用Grid可以很方便地实现在多台机器上或异构环境中运行测试用例。(3)Selenium RC。

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

Selenium RC分为Client Libraries和Selenium Server两部分。Client Libraries主要用于编写测试脚本,负责控制Selenium Server的库。Selenium Server负责控制浏览器行为。

Selenium Server主要分为三部分:Selenium Core、Launcher和Http Proxy。Selenium Core就是一堆JavaScript函数的集合。通过这些JavaScript函数,我们可以用程序对浏览器进行操作。Launcher用于启动浏览器,把Selenium Core加载到浏览器页面当中,同时,把浏览器的代理设置为Http Proxy。

2.Selenium 2.0

Selenium 2.0把WebDriver加到了Selenium1.0这个家族中,简单用公式表示如下:

需要注意的是,在Selenium 2.0中主推的是WebDriver,可以将其看作Selenium RC的替代品。为了保持向下的兼容性,Selenium 2.0并没有彻底抛弃Selenium RC。

Selenium RC与WebDriver的工作方式有着本质的区别。

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

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

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

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

3.Selenium 3.0

2016年7月,Selenium 3.0悄悄发布了第一个beta版。Selenium 3.0做了以下更新。(1)去掉了Selenium RC,简单用公式表示如下:(2)Selenium 3.0只支持Java 8以上版本。(3)Selenium 3.0中的Firefox浏览器驱动独立了。Selenium 2.0测试库默认是集成Firefox浏览器驱动的,在Selenium 3.0中,Firefox浏览器和Chrome浏览器一样,在使用前需要下载和设置浏览器驱动。(4)mac OS 操作系统集成了Safari的浏览器驱动,该驱动默认在/usr/bin/safaridriver目录下。(5)只支持IE 9.0以上版本。

4.Selenium IDE

Selenium IDE同样是Selenium的家族成员。Selenium IDE 有两个版本,旧版的Selenium IDE是基于Firefox浏览器扩展的,如图1-4所示。图1-4 旧版的Selenium IDE

它提供了比较完备的自动化功能,如脚本录制/回放、定时任务等;还可以将录制的脚本导成不同编程语言的Selenium测试脚本,这在很大程度上可以帮助新手编写测试用例。但旧版的Selenium IDE不支持Firefox新版本支持的API,因此Selenium团队重新开发了新版的Selenium IDE,可以同时支持Chrome、Firefox以及其他浏览器。

项目地址:https://github.com/SeleniumHQ/selenium-ide。

新版的Selenium IDE如图1-5所示,功能比较简单,本书不再对Selenium IDE进行介绍。图1-5 新版的Selenium IDE1.5 appium简介

appium是当前移动平台上主流的自动化测试工具之一。

appium是一个合成词,分别由“application”的前三个字母和“Selenium”的后三个字母组成。application为“应用”,我们一般把移动平台上的应用简称为App。Selenium是当前主流的Web UI自动化测试工具。appium与Selenium之间是有继承关系的。appium的寓意是:移动端的Selenium自动化测试工具。

appium是一个开源自动化测试工具,支持 iOS 和 Android 平台上的原生应用、Web应用以及混合应用。

原生应用:是指那些用iOS或者Android SDK开发的应用(App)。

Web应用:是指可以使用移动浏览器(如iOS上的Safari和Android上的Chrome)访问的应用。

混合应用:是指用原生代码封装网页视图,原生代码和Web内容交互的应用。比如,微信小程序,可以帮助开发者使用网页技术开发应用,然后用原生代码封装。

更重要的是,appium是一个跨平台的测试工具,它允许测试人员在不同的平台(iOS、Android)使用同一套API编写自动化测试脚本,这大大增加了iOS和Android测试套件之间代码的复用性。

1.appium与Selenium

appium类库封装了标准Selenium客户端类库,为用户提供常见的JSON格式的Selenium命令,以及额外的移动设备控制相关的命令,如多点触控手势和屏幕方向等操作。

appium客户端API实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。

appium 服务器定义了官方协议的扩展,为appium 用户提供方便的接口来执行各种设备动作,例如,在测试过程中安装/卸载App等。这也是我们需要安装appium特定的客户端,而不是通用的Selenium 客户端的原因。当然,appium 客户端API只是增加了部分操作,在Selenium 客户端的基础上进行了简单的扩展,因此它们仍然可以用来运行通用的Selenium会话。第2章 测试环境搭建2.1 安装Python

官网:https://www.python.org。

Python语言是由Guido van Rossum于1989年开发的,于1991年发行第一个公开发行版。因为早期的Python版本在基础设计方面存在着一些不足之处,所以2008年Guido van Rossum重新发布了Python (当时命名为Python 3000)。Python 3在设计的时候很好地解决了之前的遗留问题,但是Python 3的最大的问题是不完全向后兼容,当时向后兼容的版本是Python 2.6。

Guido van Rossum宣布对Python 2.7的技术支持时间延长到2020年。Python 2.7是2.x系列的最后一个版本。本书推荐使用Python 3.x。

你可以根据自己的平台选择相应的版本进行下载。对于Windows用户来说,如果是32位系统,则选择x86版本;如果是64位系统,则选择64版本。下载完成后会得到一个.exe文件,双击进行安装即可。

Python安装界面如图2-1所示。图2-1 Python安装界面

安装过程与一般的Windows程序类似,注意勾选“Add Python 3.7 to PATH”。

安装完成后,在“开始”菜单中可以看到安装好的Python目录,如图2-2所示。图2-2 Python目录

在Windows命令提示符下输入“python”命令,可以进入Python Shell模式,如图2-3所示。图2-3 Windows命令提示符

小提示:如果提示“python”既不是内部命令,也不是外部命令,那么你需要把Python的安装目录添加到系统变量Path中,操作步骤如下。

右击桌面上的“此电脑”,打开右键菜单,单击“属性→高级系统设置→高级→环境变量”,在“系统变量”的“Path”中添加:

变量名:Path

变量值:;C:\Python372.2 安装Selenium

最新的Python安装程序已经集成了pip,pip可以帮助我们方便地管理Python第三方包(库)。我们可以在...\Python37\Scripts\目录下查看是否存在pip.exe文件,并确保该目录已添加到“环境变量”的“PATH”下面。打开Windows命令提示符,输入“pip”命令,确保该命令可以执行。

通过“pip”命令安装Selenium包。

Pip的常用命令如下。2.3 第一个Selenium自动化测试脚本

下面编写第一个Selenium自动化测试脚本,创建test_baidu.py文件。

第1行代码,导入selenium下面的webdriver模块。

第2行代码,调用webdriver模块下的Chrome()类(注意大小写),赋值给变量driver。

第3行代码,通过driver变量,调用Chrome()类提供的get()方法访问百度首页。

第4、5行代码,通过find_element_by_id()方法分别定位页面上的元素,并且通过send_keys()和click()做输入、单击操作。

第6行代码,通过quit()关闭浏览器。

接下来,你可以选择自己熟悉的Python 编辑器/IDE来运行这段代码。如果你是第一次使用Python语言,并且没有编程基础,那么也可以使用Python自带的IDLE,主流的Python编辑器/IDE有Sublime Text3、Atom、VS Code和PyCharm,都是免费的,你不妨下载且体验一番,选择适合自己的。2.4 浏览器驱动

当运行第2.3节中的代码时,可能会遇到以下报错。

不要害怕报错,我们要学会查看错误信息,并从中找到解决方法。“File "baidu_test.py",line 3”,Python告诉我们错误在baidu_test.py文件的第3行。第3行代码是:

该行代码会调用Chrome()类,用于启动Chrome浏览器。最后,抛出WebDriverException异常,信息如下:

告诉我们需要将Chrome浏览器对应的ChromeDriver驱动文件添加到“环境变量”的Path中。

各浏览器驱动下载地址如下。

GeckoDriver(Firefox):https://github.com/mozilla/geckodriver/releases

ChromeDriver(Chrome):https://sites.google.com/a/chromium.org/chromedriver/home

IEDriverServer(IE):http://selenium-release.storage.googleapis.com/index.html

OperaDriver(Opera):https://github.com/operasoftware/operachromiumdriver/releases

MicrosoftWebDriver(Edge):https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver

1.设置浏览器驱动

设置浏览器的方式非常简单。我们可以手动创建一个存放浏览器驱动的目录,如D:\drivers,将下载的浏览器驱动文件(例如ChromeDriver、GeckoDriver)放到该目录下。

右击“此电脑”,在右键菜单中单击“属性→高级系统设置→高级→环境变量→系统变量→Path”,将“D:\drivers”目录添加到Path中。

变量名:Path

变量值:;D:\drivers

2.验证浏览器驱动

下面验证不同的浏览器驱动是否能正常使用,当然,你需要在操作系统中安装这些浏览器。第3章 Python基础

如果你已经有Python基础,那么可以跳过本章,本章是特意为Python新手准备的。通过对本章的学习,读者可以快速掌握Python的基础语法,这是编写自动化测试必须要掌握的。3.1 Python哲学

在具体学习Python之前,我们先来看一些有趣的东西。在Python IDLE的Shell模式下输入“import this”,将会看到如图3-1所示的一段话。图3-1 Python之禅(The Zen of Python)

Beautiful is better than ugly.优美胜于丑陋。

Explicit is better than implicit.明了胜于晦涩。

Simple is better than complex.简单胜过复杂。

Complex is better than complicated.复杂胜过凌乱。

Flat is better than nested.扁平胜于嵌套。

Sparse is better than dense.间隔胜于紧凑。

Readability counts.可读性很重要。

Special cases aren't special enough to break the rules.即使假借特例的实用性之名,也不能违背这些原则。

Although practicality beats purity.虽然实用性次于纯度。

Errors should never pass silently.错误不应该被无声地忽略。

Unless explicitly silenced.除非明确的沉默。

In the face of ambiguity,refuse the temptation to guess.当存在多种可能时,不要尝试去猜测。

There should be one-and preferably only one-obvious way to do it.应该有一个,最好只有一个,很明显可以做到这一点。

Although that way may not be obvious at first unless you're Dutch.虽然这种方式可能不容易,除非你是Python之父。

Now is better than never.现在做总比不做好。

Although never is often better than*right*now.虽然过去从未比现在好。

If the implementation is hard to explain,it's a bad idea.如果这个实现不容易解释,那么它肯定是个坏主意。

If the implementation is easy to explain,it may be a good idea.如果这个实现容易解释,那么它很可能是个好主意。

Namespaces are one honking great idea-let's do more of those!命名空间是一种绝妙的理念,应当多加利用!

这就是Python之禅,也可以看作Python设计哲学。在接下来的Python学习中可体会到这种设计哲学。3.2 输出

一般编程语言的教程都是从打印“Hello World!”开始的,我们这里也不免俗,下面就从打印“Hello Python”开始。3.2.1 打印

Python提供了print()方法来打印信息,在Python IDLE中输入以下信息。

可打印出“hello Python”字符串。但是,有时候我们打印的信息并不是固定的,下面来看如何格式化输出。

这里分别定义了name和age变量,并用三种方式实行格式化输出。

第一种通过连接符(+)进行拼接。注意,age是整型,所以需要通过str()方法将整型转换成字符串。

第二种通过格式符(%s、%d)进行替换,其中,%s用于指定字符串,%d(data)用于指定数字。如果不确定待打印的数据的类型,则可以用%r表示。

第三种通过格式化函数format()进行格式化。这种方式是大多数程序员推荐的。如果不指定位置,就按照默认顺序。当然,也可以通过{0}、{1}指定位置,或者用变量指定对应关系,示例如下。3.2.2 引号与注释

在Python中是不区分单引号('')与双引号("")的。也就是说,单引号和双引号都可以用来表示一个字符串。

单引号与双引号可以互相嵌套使用,但不能交叉使用。

再来看看注释,基本上每种语言都会提供单行注释和多行注释。Python的单行注释用井号(#)表示。创建一个2_annotation.py文件。

单行注释一般写在代码的前一行或代码末尾。

多行注释用三引号表示,同样不区分单、双引号。3.3 分支与循环

结构化程序实际上是由顺序、分支和循环三种基本结构组成的。3.3.1 if语句

和大多数语言一样,Python通过if语句实现分支判断,一般语法为if…else。创建3_if.py文件。

上面的语句分别对a和b赋值,通过if语句判断a和b的大小。如果a大于b,则输出“a max!”,否则输出“b max!”。

需要强调的是,Python没有像其他大多数语言一样使用“{}”表示语句体,而是通过语句的缩进来判断语句体,缩进默认为4个空格。

if语句通过“==”运算符判断相等,通过“!=”运算符判断不相等。

除此之外,if语句还可以用“in”和“not in”判断字符串是否包含。

if语句还可以进行布尔(True/False)类型的判断。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载