pythonwebdriver自动化测试实战.docx

上传人:b****6 文档编号:12709543 上传时间:2023-06-07 格式:DOCX 页数:23 大小:30.98KB
下载 相关 举报
pythonwebdriver自动化测试实战.docx_第1页
第1页 / 共23页
pythonwebdriver自动化测试实战.docx_第2页
第2页 / 共23页
pythonwebdriver自动化测试实战.docx_第3页
第3页 / 共23页
pythonwebdriver自动化测试实战.docx_第4页
第4页 / 共23页
pythonwebdriver自动化测试实战.docx_第5页
第5页 / 共23页
pythonwebdriver自动化测试实战.docx_第6页
第6页 / 共23页
pythonwebdriver自动化测试实战.docx_第7页
第7页 / 共23页
pythonwebdriver自动化测试实战.docx_第8页
第8页 / 共23页
pythonwebdriver自动化测试实战.docx_第9页
第9页 / 共23页
pythonwebdriver自动化测试实战.docx_第10页
第10页 / 共23页
pythonwebdriver自动化测试实战.docx_第11页
第11页 / 共23页
pythonwebdriver自动化测试实战.docx_第12页
第12页 / 共23页
pythonwebdriver自动化测试实战.docx_第13页
第13页 / 共23页
pythonwebdriver自动化测试实战.docx_第14页
第14页 / 共23页
pythonwebdriver自动化测试实战.docx_第15页
第15页 / 共23页
pythonwebdriver自动化测试实战.docx_第16页
第16页 / 共23页
pythonwebdriver自动化测试实战.docx_第17页
第17页 / 共23页
pythonwebdriver自动化测试实战.docx_第18页
第18页 / 共23页
pythonwebdriver自动化测试实战.docx_第19页
第19页 / 共23页
pythonwebdriver自动化测试实战.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

pythonwebdriver自动化测试实战.docx

《pythonwebdriver自动化测试实战.docx》由会员分享,可在线阅读,更多相关《pythonwebdriver自动化测试实战.docx(23页珍藏版)》请在冰点文库上搜索。

pythonwebdriver自动化测试实战.docx

pythonwebdriver自动化测试实战

.

pythonwebdriver项目实战

文档Word

.

第5章测试模型与测试脚本优化

第一节、测试模型介绍

线性测试通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。

这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriverAPI所编写的脚本也是这种形式。

脚本一

froseleniumimporwebdriver

importime

driver=webdriver.Firefox()

driver.get睜睷?

硸)

driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡)

driver.find_element_by_id瑜偢獡睳牯).send_keys?

?

?

driver.find_element_by_id扜湴潌楧).click()

执行具体用例操

......

driver.quit()脚本二

fromseleniumimportwebdriver

importtime

driver=webdriver.Firefox()

driver.get(睜睷?

硸?

driver.find_element_by_id(瑜啢敳乲浡履).send_keys(甥敳湲浡履)

driver.find_element_by_id(瑜偢獡睳牯層).send_keys(?

?

?

尶)

driver.find_element_by_id(扜湴潌楧屮).click()

#执行具体用例操作

文档Word

.......

driver.quit()通过上面的两个脚本,我们很明显的发现它的问题:

一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。

这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。

这种模式下脚本的可重复使用率很低。

模块化与库

我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是就有了下面的改进。

login.py登录模delogin():

driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡)

driver.find_element_by_id瑜偢獡睳牯).send_keys?

?

㈱)

driver.find_element_by_id扜湴潌楧).click()

quit.py

#退出模块

defquit_():

..............

测试用例:

#coding=utf-froseleniumimporwebdriver

文档Word

.

importlogin,quit_#调用登录、退出模块

driver=webdriver.Firefox()#调用退出模块

quit.quit()

driver.get(睜睷?

硸?

#调用登录模块

login.login()

#其它个性化操作

......

注意,上面代码并非完整代码,不能运行。

通过上面的代码发现,我们可以把脚本中相同的部分独立出来,形成模块或库;当脚本需要进行调用。

这样做有两个好处:

一方面提高了开发效率,不用重复的编写相同的脚本;另一方面提高了代码的复用。

数据驱动

数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。

这显然是一个非常高级的概念和想法。

其实,我们能做到的是下面的形式。

d:

\abc\data.txt

文档Word

.

4.x

图#coding=utf-8webdriverimportfromselenium

os,time

import)牜source=open(?

尺屜慜换屜屜慤慴琮瑸,

values=source.readlines()

source.close()

执行循环#

values:

forserchindriver=webdriver.Firefox()

driver.get(?

硸硸尮

).send_keys(serch)歜屷driver.find_element_by_id(.....

文件的之类,又或者是数组、字典函数。

我们实现了数excel文件,还是csv、不管我们读取的是txt

据与脚本的分离,换句话说,我们实现了参数化。

我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。

同样的脚本执行不同的数据从而得到了不同的结构。

是不是增强的脚本的复用性呢!

自动化工具来说确是一个买点,因其实,这对开发来说是完全没有什么技术含量的;对于当初QTP

为它面对的大多是不懂开发的测试。

文档Word

.

关键字驱动

理解了数据驱动,无非是把“数据”换成“关键字”,关键字的改变引起测试结果的改变。

关键字驱动用编程方式就不太容易表现了。

QTP、robotframework等自动化工具都提供了关键字驱动(填表格)。

好吧!

我能说seleniumIDE也是关键字驱动么?

图5.x

转化成表格是这样的:

文档Word

.

4.x

图、值(value))SeleniumIDE脚本分:

命令(command)、对象(command格式就那里不偏不移,通过这样的格式去描述不同的对象,从而引起最终结果的改变。

也就是说一切以对象为出发点。

当然,这样的脚本,显然对于不懂代码的同学非常直观!

我要找谁(对象)?

怎么做(命令)?

做什么(值)?

从而实现更强大的功能和扩展性。

到框架;注册keyword然后“”可以自己定义更高级的关键字驱动,关键字更详细的理解可以看我偶像的那偏文章。

这里简单介绍了自动化测试的几种不同的模型,虽然简单阐述了他们的优缺点,但他们并非后后

者淘汰前者的关系,在实施自动化更多的是以需求为出发点,混合的来使用以上模型去解决问题;使我们的脚本更易于开发与维护。

第二节、登录模块化

通过上一节对测试模型的学习可以看到,在我们的目前的脚本中还是有很多可以模块化的地方,比如登录模块。

我们的每一个用例的执行都需要登录脚本,那可我们是否可以将登录脚本独立到单独的文件调用。

下面以快播私有云的登录退出测试用例为例:

webcloud.py

#coding=utf-8

fromseleniumimportwebdriver

frommon.byimportBy

frommon.keysimportKeys

文档Word

.

fromselenium.webdriver.support.uiimportSelect

frommon.exceptionsimportNoSuchElementException

importunittest,time

classLogin(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url=passport.kuaibo.

self.verificationErrors=[]

self.accept_next_alert=True

#私有云登录用例

deftest_login(self):

driver=self.driver

driver.get(self.base_url+\/login/?

referrer=http:

//webcloud.kuaibo./)

driver.maximize_window()

#登陆

driver.find_element_by_id(%user_name).clear()

driver.find_element_by_id(%user_name).send_keys(%username)

driver.find_element_by_id(%user_pwd).clear()

driver.find_element_by_id(%user_pwd).send_keys(S456)

driver.find_element_by_id(dl_an_submit).click()

time.sleep(3)

#新功能引导

driver.find_element_by_class_name(guide-ok-btn).click()

time.sleep(3)

#退出

driver.find_element_by_class_name(Usertool).click()

time.sleep

(2)

牤癩牥昮湩彤汥浥湥彴祢江湩彫整瑸尨退出).click()

文档Word

.time.sleep

(2)

deftearDown(self):

self.driver.quit()

self.assertEqual([],self.verificationErrors)

if__name__==__main__:

unittest.main()

从业务流程及用例分析,每一个自动化测试用例的执行过程为:

先执行登录操作,然后执行具体的操作(如文件/文件夹的创建、删除、移动、重命名等操作),最后执行退出操作。

如上面的测试用例,登录与退出操作是相对固定的,那么我们可以把登录与退出操作模块化出去,然后调用,一方面不用写重复代码,另一方面可以使测试用例更关注具体的用例代码。

login.py

在与webcloud.py相同的文件夹下创建login.py文件:

#coding=utf-8fromseleniumimportwebdriver

frommon.exceptionsimportNoSuchElementException

importunittest,time

deflogin(self):

driver=self.driver

driver.maximize_window()

driver.find_element_by_id(%user_name).clear()

driver.find_element_by_id(%user_name).send_keys(%username)

driver.find_element_by_id(%user_pwd).clear()

driver.find_element_by_id(%user_pwd).send_keys(S456)

driver.find_element_by_id(dl_an_submit).click()

time.sleep(3)

webcloud.py#coding=utf-8fromseleniumimportwebdriver

frommon.byimportBy

文档Word

.

frommon.keysimportKeys

fromselenium.webdriver.support.uiimportSelect

frommon.exceptionsimportNoSuchElementException

importunittest,time

importlogin#导入登录文件

classLogin(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url=passport.kuaibo.

self.verificationErrors=[]

self.accept_next_alert=True

#私有云登录用例

deftest_login(self):

driver=self.driver

driver.get(self.base_url+\/login/?

referrer=http:

//webcloud.kuaibo./)

#调用登录模块

login.login(self)

#新功能引导

driver.find_element_by_class_name(guide-ok-btn).click()

time.sleep(3)

#退出

driver.find_element_by_class_name(Usertool).click()

time.sleep

(2)

牤癩牥昮湩彤汥浥湥彴祢江湩彫整瑸尨退出).click()

time.sleep

(2)

deftearDown(self):

self.driver.quit()

文档Word

.self.assertEqual([],self.verificationErrors)

if__name__==__main__:

unittest.main()

进行到这里,我们有必要补充一下python语言中函数、类、方法的使用,这将有助于我们自动化测试脚本的开发。

下面打开pythonIDLE:

函数的使用:

1>>>defadd(a,b):

c=a+b

printc

 

>>>add(1,3)

4

2

>>>defadd2(a=1,b=3):

c=a+b

returnc

 

>>>d=add2()

>>>printd

4

相bb,对a、关键字可创建函数,在例通过def1中我们创建了add()函数,默认接收两个参数化a、,并将结果函数内打印。

加结果给c返做加法,并将结果用returnb、设置了默认值,同样对a、badd2()例2中创建了函数,这一次对a接收的结果打印。

在接收add2()时用的是默认值,将后将d回;d类与方法的使用:

>>>classCounter:

defadd(self,a,b):

c=a+b

printc

文档Word

.

defsubtract(self,a,b):

c=a-b

printc

>>>d=Counter()

>>>d.add(5,3)

8

>>>d.subtract(5,3)

2

通过class关键字我们创建了一个Counter类,定义了add()和subtract()两个方法分别来完成加法和减法运算,并将计算结果打印。

通过上面的例子我们明显的发现类的方法与函数有一个明显的区别,在类的方法中必须有个额外的第一个参数(self),但在调用类的方法时却不必为这个参数赋值。

self参数所指的是对象本身,所以习惯性地命名为self。

为何Python给self赋值而你不必给self赋值?

创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(a,b),在这个过程中,Python会自动转为Myclass.method(MyObject,a,b),这就是Python的self的原理。

即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数。

下面回到用例本身来讨论如何模块化和调用的,在login.py文件中:

deflogin(self):

driver=self.driver

这里用到的是方法,(driver=self.driver)driver为对象身的driver,这一句很重要,否则我们无法在ligin()方法中使用driver操作浏览器。

在webdriver.py文件中:

导入登录文importlogin

...

调用登录模

login.login(self)

...

文档Word

.

首先导入login文件,然后对文件中的login()方法进行调用。

下面笔者动手把退出的相关操作也模块化出去吧!

第三节、数据驱动(参数化)

在测试模型一节的数据驱动中我们已经介绍了如何通过python的readlines()函数对XX输入信息进行参数化设置,将其它循环的读取data.txt文件中每一行数据。

这里再回顾一下实现参数化的方式。

baidu_read_data.py

#coding=utf-8

fromseleniumimportwebdriver

importos,time

source=open(?

尺屜慜换屜屜慤慴琮瑸,牜)

values=source.readlines()

source.close()

#执行循环

forserchinvalues:

browser=webdriver.Firefox()

browser.get(?

慢摩?

browser.find_element_by_id(歜屷).send_keys(serch)

browser.find_element_by_id(獜屵).click()

browser.quit()

open方法以只读方式(r)打开本地的data.txt文件,readlines方法是逐行的读取文件内容。

通过for循环,serch可以每次获取到文件中的一行数据,在定位到XX的输入框后,将数据传入send_keys(serch)。

这样通过循环调用,直到文件的中的所有内容全被读取。

登录参数化(读取txt文件)

文档Word

.

pythonpython文档我们发现现在按照上面的思路,对自动化脚本中用户、名密码进行参数化,通过读取文件的方式有:

整个文件读取、逐行读取、固定字节读取。

并没有找到一次读取两条数据的好方法。

创建两个文件,分别存放用户名密码,如图6.x

6.x

图打开之前编写的login.py文件,做如下修改:

#coding=utf-8

fromseleniumimportwebdriver

frommon.exceptionsimportNoSuchElementException

importunittest,time,os

source=open(D:

\\selenium_python\\data%username.txt,

)#用户名文件

un=source.read()#读取用户名

source.close()

source2=open(D:

\\selenium_python\\data\password.txt,

)#密码文件

pw=source2.read()#读取密码

source2.close()

deflogin(self):

driver=self.driver

driver.maximize_window()

driver.find_element_by_id(%user_name).clear()

driver.find_element_by_id(%user_name).send_keys(un)

driver.find_element_by_id(%user_pwd).clear()

driver.find_element_by_id(%user_pwd).send_keys(pw)

driver.find_element_by_id(dl_an_submit).click()

time.sleep(3)

分别打开两个txt文件,通过un和pw来接收用户名和密码信息,将接收的数据通过send_key(xx)转入到执行程序中。

运行我们前面创建的webcloud.py文件,程序可以正常的执行。

虽然这样做比较丑,但是确实达到了数据与脚本分离的目的。

文档Word

.

缺点:

虽然目的达到了这,但这样的实现有很多问题:

1、用户名密码分别在不同的文件里,修改用户名和密码比较麻烦。

2、username.txt和password.txt文件中只能保存一个用户密码,无能很好的循环读取。

登录参数化(函数)

函数是我们前面刚介绍的python知识,函数可以预先给参数化赋值,借助这个特性,我们可以通过调用函数的方式对用户名密码进行参数化

userinfo.py

deffun(un='testing',pw=123456):

printsuccessreaderusernameandpassword!

!

returnun,pw

我们为两个参数un和pw赋了初值,赋值内容如果是字符串需要加引号,如果是数字可以不需要引号。

再次打开login.py文件,做如下修改:

#coding=utf-8

fromseleniumimportwebdriver

frommon.exceptionsimportNoSuchElementException

importunittest,time

importuserinfo#导入函数

#通过两个变量,来接收调用函数获得用户名&密码

us,pw=userinfo.fun()

#打印两个变量

printus,pw

deflogin(self):

driver=self.driver

driver.maximize_window()

driver.find_element_by_id(%user_name).clear()

driver.find_element_by_id(%user_name).send_keys(un)

文档

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2