文档库 最新最全的文档下载
当前位置:文档库 › python webdriver 自动化测试实战

python webdriver 自动化测试实战

python webdriver 自动化测试实战
python webdriver 自动化测试实战

python webdriver 项目实战

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

第一节、测试模型介绍

线性测试

通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。

脚本一

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("https://www.wendangku.net/doc/ca14520580.html,")

driver.find_element_by_id("tbUserName").send_keys("username")

driver.find_element_by_id("tbPassword").send_keys("123456")

driver.find_element_by_id("btnLogin").click()

#执行具体用例操作

......

driver.quit ()

脚本二

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("https://www.wendangku.net/doc/ca14520580.html,")

driver.find_element_by_id("tbUserName").send_keys("username")

driver.find_element_by_id("tbPassword").send_keys("123456")

driver.find_element_by_id("btnLogin").click()

#执行具体用例操作

......

driver.quit ()

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

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

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

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

模块化与库

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

login.py

#登录模块

def login():

driver.find_element_by_id("tbUserName").send_keys("username")

driver.find_element_by_id("tbPassword").send_keys("456123")

driver.find_element_by_id("btnLogin").click()

quit.py

#退出模块

def quit_():

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

测试用例:

#coding=utf-8

from selenium import webdriver

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

driver = webdriver.Firefox()

driver.get("https://www.wendangku.net/doc/ca14520580.html,")

#调用登录模块

login.login()

#其它个性化操作

......

#调用退出模块

quit.quit()

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

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

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

数据驱动

数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。这显然是一个非常高级的概念和想法。

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

d:\abc\data.txt

图4.x

#coding=utf-8

from selenium import webdriver

import os,time

source = open("D:\\abc\\data.txt", "r")

values = source.readlines()

source.close()

#执行循环

for serch in values:

driver = webdriver.Firefox()

driver.get("https://www.wendangku.net/doc/ca14520580.html,")

driver.find_element_by_id("kw").send_keys(serch)

.....

不管我们读取的是txt 文件,还是csv、excel 文件的之类,又或者是数组、字典函数。我们实现了数据与脚本的分离,换句话说,我们实现了参数化。我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。

同样的脚本执行不同的数据从而得到了不同的结构。是不是增强的脚本的复用性呢!

其实,这对开发来说是完全没有什么技术含量的;对于当初QTP 自动化工具来说确是一个买点,因为它面对的大多是不懂开发的测试。

关键字驱动

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

关键字驱动用编程方式就不太容易表现了。QTP 、 robot framework 等自动化工具都提供了关键字驱动(填表格)。

好吧!我能说selenium IDE 也是关键字驱动么?

图5.x

转化成表格是这样的:

图4.x

Selenium IDE 脚本分:命令(command)、对象(command)、值(value)

格式就那里不偏不移,通过这样的格式去描述不同的对象,从而引起最终结果的改变。也就是说一切以对象为出发点。

当然,这样的脚本,显然对于不懂代码的同学非常直观!我要找谁(对象)?怎么做(命令)?做什么(值)?

更高级的关键字驱动,可以自己定义keyword然后“注册”到框架;从而实现更强大的功能和扩展性。关键字更详细的理解可以看我偶像的那偏文章。

这里简单介绍了自动化测试的几种不同的模型,虽然简单阐述了他们的优缺点,但他们并非后后者淘汰前者的关系,在实施自动化更多的是以需求为出发点,混合的来使用以上模型去解决问题;使我们的脚本更易于开发与维护。

第二节、登录模块化

通过上一节对测试模型的学习可以看到,在我们的目前的脚本中还是有很多可以模块化的地方,比如登录模块。我们的每一个用例的执行都需要登录脚本,那可我们是否可以将登录脚本独立到单独的文件调用。

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

webcloud.py

#coding=utf-8

from selenium import webdriver

from https://www.wendangku.net/doc/ca14520580.html,mon.by import By

from https://www.wendangku.net/doc/ca14520580.html,mon.keys import Keys

from selenium.webdriver.support.ui import Select

from https://www.wendangku.net/doc/ca14520580.html,mon.exceptions import NoSuchElementException

import unittest, time

class Login(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url = "https://www.wendangku.net/doc/ca14520580.html,"

self.verificationErrors = []

self.accept_next_alert = True

#私有云登录用例

def test_login(self):

driver = self.driver

driver.get(self.base_url + "/login/?referrer=http%3A%2F%https://www.wendangku.net/doc/ca14520580.html,%2F")

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("123456")

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)

driver.find_element_by_link_text("退出").click()

time.sleep(2)

def tearDown(self):

self.driver.quit()

self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":

unittest.main()

从业务流程及用例分析,每一个自动化测试用例的执行过程为:先执行登录操作,然后执行具体的操作(如文件/文件夹的创建、删除、移动、重命名等操作),最后执行退出操作。如上面的测试用例,登录与退出操作是相对固定的,那么我们可以把登录与退出操作模块化出去,然后调用,一方面不用写重复代码,另一方面可以使测试用例更关注具体的用例代码。

login.py

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

#coding=utf-8

from selenium import webdriver

from https://www.wendangku.net/doc/ca14520580.html,mon.exceptions import NoSuchElementException

import unittest, time

def login(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("123456")

driver.find_element_by_id("dl_an_submit").click()

time.sleep(3)

webcloud.py

#coding=utf-8

from selenium import webdriver

from https://www.wendangku.net/doc/ca14520580.html,mon.by import By

from https://www.wendangku.net/doc/ca14520580.html,mon.keys import Keys

from selenium.webdriver.support.ui import Select

from https://www.wendangku.net/doc/ca14520580.html,mon.exceptions import NoSuchElementException

import unittest, time

import login #导入登录文件

class Login(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url = "https://www.wendangku.net/doc/ca14520580.html,"

self.verificationErrors = []

self.accept_next_alert = True

#私有云登录用例

def test_login(self):

driver = self.driver

driver.get(self.base_url + "/login/?referrer=http%3A%2F%https://www.wendangku.net/doc/ca14520580.html,%2F")

#调用登录模块

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)

driver.find_element_by_link_text("退出").click()

time.sleep(2)

def tearDown(self):

self.driver.quit()

self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":

unittest.main()

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

函数的使用:

#例1

>>> def add(a,b):

c=a+b

print c

>>> add(1,3)

4

#例2

>>> def add2(a=1,b=3):

c=a+b

return c

>>> d=add2()

>>> print d

4

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

例2中创建了add2()函数,这一次对a、b设置了默认值,同样对a、b做加法,并将结果用return返回;d在接收add2()时用的是默认值,将后将d接收的结果打印。

类与方法的使用:

>>> class Counter:

def add(self,a,b):

c=a+b

print c

def subtract(self,a,b):

c=a-b

print c

>>> 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 文件中:

def login(self):

driver = self.driver

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

在webdriver.py 文件中:

#导入登录文件

import login

...

#调用登录模块

login.login(self)

...

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

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

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

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

baidu_read_data.py

#coding=utf-8

from selenium import webdriver

import os,time

source = open("D:\\abc\\data.txt", "r")

values = source.readlines()

source.close()

# 执行循环

for serch in values:

browser = webdriver.Firefox()

browser.get("https://www.wendangku.net/doc/ca14520580.html,")

browser.find_element_by_id("kw").send_keys(serch)

browser.find_element_by_id("su").click()

browser.quit()

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

通过for循环,serch 可以每次获取到文件中的一行数据,在定位到百度的输入框后,将数据传入send_keys(serch)。这样通过循环调用,直到文件的中的所有内容全被读取。

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

现在按照上面的思路,对自动化脚本中用户、名密码进行参数化,通过python文档我们发现python 读取文件的方式有:整个文件读取、逐行读取、固定字节读取。并没有找到一次读取两条数据的好方法。

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

图6.x

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

#coding=utf-8

from selenium import webdriver

from https://www.wendangku.net/doc/ca14520580.html,mon.exceptions import NoSuchElementException

import unittest, time, os

source = open("D:\\selenium_python\\data\username.txt", "r") #用户名文件

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

source.close()

source2 = open("D:\\selenium_python\\data\password.txt", "r") #密码文件

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

source2.close()

def login(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文件,程序可以正常的执行。虽然这样做比较丑,但是确实达到了数据与脚本分离的目的。

缺点:

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

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

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

登录参数化(函数)

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

userinfo.py

def fun(un='testing',pw=123456):

print "success reader username and password!!"

return un,pw

我们为两个参数un和pw赋了初值,赋值内容如果是字符串需要加引号,如果是数字可以不需要引号。再次打开login.py文件,做如下修改:

#coding=utf-8

from selenium import webdriver

from https://www.wendangku.net/doc/ca14520580.html,mon.exceptions import NoSuchElementException

import unittest, time

import userinfo #导入函数

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

us,pw = userinfo.fun()

#打印两个变量

print us,pw

def login(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)

单独运行login.py 文件:

>>> ================================ RESTART ================================ >>>

success reader username and password!!

testing 123456

说明我们对函数的参数调用是成功的,将un、pw两个变量的值传入用户名密码的send_keys()方法中即可。

登录参数化(读取字典)

既然我们是固定的读取用户名和密码两个值,那么可以借助python字典的方式来完成这个需求。

字典由大括号内的多键值对组成;下面继续在python IDLE交互模式下演示字典的创建与使用。>>> data = {'abc':'123','def':'456'}

>>> print data

{'abc': '123', 'def': '456'}

>>> data.keys()

['abc', 'def']

>>> data.values()

['123', '456']

>>> data.items()

[('abc', '123'), ('def', '456')]

创建字典用大括号,数据由key/value 键值对组成,keys()方法返回字典中的键列表。values()返回字典

中的值列表,items()返回(key,value)元组。

下面创建一个存放字典的函数文件userinfo.py :

def zidian():

data={'username':'123456','testing360':'123123'}

print "success reader username and password!!"

return data

字典的可以方便的存放k,v 键值对,一个键对应一个值;注意,如果密码中有非数字,需要加引号。需要说明的是我们的需求并不适合循环的读取用户名密码,不过我们可以写一小程序单独验证这种循环读取的方式:

loop_reader.py

#coding=utf-8

import userinfo #导入函数

#获取字典数据

info = userinfo.zidian()

#通过items()循环读取元组(键/值对)

for us,pw in info.items():

print us

print pw

运行结果如下:

>>> ================================ RESTART ================================ >>>

success reader username and password!!

username

123456

testing360

123456

在实际使用中,可以将un、pw两个变量循环获得的值传入相应的send_keys()方法中。

目前方式解决了两个问题:一次传入两个值,以及循环读取。

表单参数化(csv)

假如我有自动化脚本中要参数化一张表单,表单需要填写用户名、邮箱,年龄,性别等信息,使用上面的方法就很难来解决这个问题,下面通过读取csv文件的方法来解决这个问题。

创建userinfo.csv文件,如图5.x

图5.x

通过WPS 或excel 创建表格,文件另存为选择CSV格式,下面修改loop_reader.py文件进行循环读取:

#coding=utf-8

import csv #导入csv包

#读取本地CSV文件

my_file='D:\\selenium_python\\data\\userinfo.csv'

data=csv.reader(file(my_file,'rb'))

#循环输出每一行信息

for user in data:

print user[0]

print user[1]

print user[2]

print user[3]

运行结果:

>>> ========================= RESTART ==============================

>>>

testing

123456@https://www.wendangku.net/doc/ca14520580.html,

23

testing2

123123@https://www.wendangku.net/doc/ca14520580.html,

18

testing3

456123@https://www.wendangku.net/doc/ca14520580.html,

29

csv.reader()用于读取CSV文件,user[0] 表示表格中第一列的数据(用户名),user[0]表示表格中第二列的数据(邮箱),后面类推。

通过CSV读取文件比较灵活,可以循环读取每一条数据,从而又不局限每次所读取数据的个数。

我们这里举例了多种方式来进行参数化,虽然最终看来CSV的方式最灵活,这里更多的是想告诉读者解决问题的方法是多样的,我们可以用python的各种技巧来选择最简单的方法来解决问题。从这个过程中我们也学到了不少python编程技术。

我这里可以说是用python 最基础的知识点解决了问题,这里只算提供一个思路,温习一下python ,你一定可以找到更完美优雅的方法;解决问题的方法是多样的,使用最贴合需求的方法,简单解决问题。这一节写的比较多,对构建自动化框架来说,参数化是非常重要的一个知识点。

脚本的模块化与参数化是我们在自动化脚本开发中用到最多的两个技巧,希望读者能认真体会,灵活的运行到具体的项目中。

pythonwebdriver自动化测试实战

. python webdriver 项目实战 文档Word . 第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 fro selenium impor webdriver impor time 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 ()脚本二 from selenium import webdriver import time 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 登录模de login(): driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡) driver.find_element_by_id瑜偢獡睳牯).send_keys??㈱) driver.find_element_by_id扜湴潌楧).click() 测试用例:#coding=utf-fro selenium impor webdriver 文档Word . 注意,上面代码并非完整代码,不能运行。

如何用 Python实现自动化测试

如何用 Python实现自动化测试 近期一直在看王阳明的相关书籍,他的一个观点我非常赞同,不管要学习什么一定要立志,立志是非常非常重要的,但是立志前一定要有动机,或者说要有"打击",那种让 你内心感到瓦凉瓦凉的打击!我在软件测试这个行业工作了12年之久,截至5年前,我 一直很愉悦地,内心充盈地做着黑盒测试,曾几何时我也觉得最好离"开发"远远的,因为 很多人都说:女孩子做测试挺好的~~ 但是,我遇到很一个非常现实而残忍的问题:"裁员",想想自己也挺奇葩的,在一个公司竟然待了12年之久,在这12年里,因为各种原因,我经历了大大小小的裁员有5次之多,一有裁员需求,老板第一个考虑的就是测试人员。每一次裁员,都是自己团队里的兄弟姐妹,我要亲自告诉他或她,因为公司现在裁员,需 要你离开公司,虽然你的工作是合格的,甚至是优秀的~~然后我要鼓起勇气陪着哭泣的他或她去立刻办理离职手续,一刻也不能停留~~你能想象我内心的崩溃吗?每一次我都会问为什么又是我们?每一次老板都会坦率地告诉我,为什么裁员考虑的是我们测试团队:就 是因为可取代性太强了!!我真的实实在在意识到了黑盒测试的无力。 公司在寒冬时,需要"蓄积能量",也就是需要减少开支,老板就要开始衡量,哪类研 发人员被裁,后续如果公司渡过难关后补起来比较容易,很不幸,每一次评估下来都是测 试人员。有个声音在我脑海里越来越清晰:不能这样,我们团队不能总是做可取代性强的 工作!!所以测试的发展方向是什么?我要有什么样的技能才能改观老板对我们的认知??我开始在网上找,当然也在51testing这样专业的网站上找寻,我找寻的结果是:未来的 测试应该是以自动化为主,手动测试为辅。所以测试人员必须要学会编程,因为测试是一 个无穷尽的工作,如何体现测试人员的价值,就是在单位时间内能有更多的产出,有让老 板瞠目结舌的产出!! 怎么学习Python在第二类问题中有详细说明,期间遇到的困难实在太多了,首要的 问题就是团队的信心不足,我们离开coding实在太久了,这个困难,我只能说,受到的 打击越大,越深,信心就会越足,容许我先哭一会~~ 除了这些形而上的困难,当然也有 实实在在的困难,我举一个实际且非常具体的问题:电脑1开发的脚本,可以正常运行,移植到电脑2就无法运行? 我们在开发时遇到上述问题,开发者开始一直纠结是电脑环境的问题,问题一直在发散,一直在发散,最后问题越来越复杂,搞到最后不可收拾......,最后他告诉我,这个开发任务无法进行@_@,这个小伙子成功在他的小主管的心里留下了:解决实际问题差的印象...... 他的问题在于没有回到问题的本质:Python的作用是定位,操作;就首先回到确认 窗口是否定位的思路上(当时他竟然还质疑他的小主管:窗口肯定定位了,因为在他的开 发电脑上都是定位的好好的*_*):真的发现窗口没有被成功定位。开发者就很困惑,为什么在电脑1是好的,电脑2就不行。他根本没想到是定位出的问题,所以连简单的确认动作也没做!然后再网上一通乱搜,真的越搜越晕,越搜问题越发散。

python_webdriver_自动化测试实战

python webdriver 项目实战

第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试 通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 脚本二

通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少容是重复的;于是就有了下面的改进。 login.py quit.py 测试用例:

注意,上面代码并非完整代码,不能运行。 通过上面的代码发现,我们可以把脚本中相同的部分独立出来,形成模块或库;当脚本需要进行调用。这样做有两个好处: 一方面提高了开发效率,不用重复的编写相同的脚本;另一方面提高了代码的复用。 数据驱动 数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。这显然是一个非常高级的概念和想法。 其实,我们能做到的是下面的形式。 d:\abc\data.txt

图4.x #coding=utf-8 from selenium import webdriver import os,time source = open("D:\\abc\\data.txt", "r") values = source.readlines() source.close() #执行循环 for serch in values: driver = webdriver.Firefox() driver.get(".xxxx.") driver.find_element_by_id("kw").send_keys(serch) ..... 不管我们读取的是txt 文件,还是csv、excel 文件的之类,又或者是数组、字典函数。我们实现了数据与脚本的分离,换句话说,我们实现了参数化。我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。 同样的脚本执行不同的数据从而得到了不同的结构。是不是增强的脚本的复用性呢! 其实,这对开发来说是完全没有什么技术含量的;对于当初QTP 自动化工具来说确是一个买点,因为它面对的大多是不懂开发的测试。

PYTHON自动化测试框架

之前有介绍过selenium的自动化测试框架,随着Python这种脚本语言的强大功能越来越被广大的程序员所重视,这种之前在国内流行度不高的语言近来气势高涨。各种第三方模块层出不穷。这里Jason介绍下之前用过的python自动化测试的一个框架PAMIE,留下点memory。 PAMIE(Python Automated Module For Internet Explorer),PAMIE它与selenium差不多,能让你如同写JS一样来操作IE浏览器。包括自动启动,访问链接,设置文本框值,获取按钮,执行点击事件,甚至执行页面JS方法等等。 首先我们需要PAMIE Package和您python版本对应的python win32扩展。 PAMIE我们能从这里下载。 python win32扩展我们能从这里下载。 在PAMIE压缩包中有相关的docs文件,介绍了PAMIE的API使用说明。2.X版本与3.x版本在引用的时候有稍许差异。这里简单的举个例子。 打开网页相关的网页: ie.navigate(‘url’) doc化ie frame然后运行相应的脚本 mainFrame=ie.getFrame(‘main’) pwindow=mainFrame.document.parentWindow pwindow.execScript(‘XXXX’) 通过DOM得到或者设置相应的值 doc.getElementById(‘XXXX’).value=XXXXX 填文本框 ie.setTextBox(‘firstname’,'FirstName’) ie.setTextBox(‘lastname’,'LastName’) 选择下拉菜单: ie.selectListBox(‘state’,”MS”) 方形选择框: ie.setCheckBox(‘cxbx’,1)#123或*号等都是“勾选”的意思”空字符串代表取消选择 圆形选择框: 这里选择Jazz ie.setRadioButton(“music”,”Jazz”)#music是这个选择列表的名字,从网页源代码里找出 最后提交按钮 ie.clickButton(“Submit”)

使用Python进行Selenium自动化测试

Selenium RC支持多种编程语言驱动客户端浏览器,这里主要介绍使用Python在Windows下驱动Selenium RC。Python是一种面向对象的解释性的计算机程序设计语言。 1、准备工作: 下载Java:目前是1.6 update7,下载地址:https://www.wendangku.net/doc/ca14520580.html,/zh_CN/ 下载Python:目前稳定版本为2.5.2,下载地址: https://www.wendangku.net/doc/ca14520580.html,/download/,Python的相关信息参见: https://www.wendangku.net/doc/ca14520580.html,/ 下载Selenium RC:目前是1.0 Beta1版本,下载地址: https://www.wendangku.net/doc/ca14520580.html,/download.html,Selenium RC相关信息参见:https://www.wendangku.net/doc/ca14520580.html,/ 2、开始运行 首先启动Selenium Server,把下载的Selenium RC解压后,会有一个selenium-server-1.0-beta-1的文件夹,就是Selenium Server的存放目录,通过命令行Java -jar selenium-server.jar来启动Selenium Server端的服务,

以在Google上搜索Hello World为例,Python的脚本如下: "*firefox"是指支持的浏览器或是通过Selenium RC调用的浏览器,Selenium 支持以下的浏览器类型, Supported browsers include: *iexplore *konqueror *firefox

python实现手机自动化测试

Python实例 -- 实现手机自动化测试 Python实现手机自动化测试,文章中仅包含了简单的测试:安装,运行,卸载的测试,运行完成后会截张图,待脚本运行完成后可以查看图片验证安装运行成功与否,此文章包括介绍了JDK,SDK,Python的配置,图文并茂希望能帮助到需要的人。随后会发布介绍如何python手机自动化测试功能模块,包括验证操作是否预期等。 步骤一安装JDK并配置环境变量 百度搜索JDK下载安装包,我下载的JDK1.8版本,双击EXE文件进行安装,点击下一步。 选择安装目录安装过程中会出现两次安装提示。第一次是安装jdk ,第二次是安装jre。

选择安装目录后点击下一步,等待安装成功。 配置环境变量: 1. 计算机→属性→高级系统设置→高级→环境变量

2. 系统变量→新建 JAVA_HOME 变量。变量值填写jdk的安装目录(我的是默认安装路径 C:\Program Files(x86)\Java\jdk1.8.0_66)

3. 系统变量→寻找 Path 变量→编辑→新建(win10系统)。变量值填写jdk的安装目录文件下的jre→bin的路径。(注意win7xp等系统下原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入路径)

4. 系统变量→新建 CLASSPATH 变量,变量值填写jdk的安装目录文件下的lib文件下tools.jar的路径。配置完毕。 5. 验证配置是否成功,运行cmd ,输入 java –version,如图中显示则配置成功。

步骤二:配置sdk 1. 去百度上搜索下载SDK 文件包并解压好后就可以进行配置了,进入计算机→属性→高级系统设置→高级→环境变量。 2. 系统变量→新建 ANDROID_HOME 变量,变量值填写SDK解压的文件路径。 3. 系统变量→寻找 Path 变量→编辑→新建,变量值分别填写SDK 下的platform-tools和tools的目录路径。

Python自动化测试面试题

1、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区 别?为什么要使用 super?请举例说明。 答: ?super 用于继承父类的方法、属性。 ?super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。 ?使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。 ?代码举例: 1.class baseClass: 2.def test1(self, num): 3.print(num) 4. 5.class sonClass(baseClass): 6.def test2(self): 7.super().test1(num) 8. 9.son = sonClass() 10.son.test1(11) 2、阅读以下代码,推导最后结果: 1.def add(n, i): 2.return n+i 3. 4.def test(): 5.for i in range(4): 6.yield i 7. 8.g = test() 9. 10.for n in [1, 10, 5]: 11. g = (add(n, i) for i in g) 12. 13.print(list(g)) # 结果是 [15, 16, 17, 18] 答:所有的结果都是生成器表达式,不调用它,不从里面取值,就不干活。附上我的推导过程: 1.n = 1 2.g = (add(n,i) for i in test()) 3.# print(list(g)) # [1, 2, 3, 4] 4. 5.n = 10 6.g = (add(n,i) for i in (add(n,i) for i in test())) 7.# print(list(g)) # [20, 21, 22, 23]

Python 自动化测试技术面试真题

本文为霍格沃兹测试学院学员面试某公司测试开发/自动化测试工程师时的面试题笔记。 全部笔试内容没有全部写全,只贴通用性的技术相关的笔试面试题,至于测试理论和团队管理的问题,都是大同小异,也没什么实际的参考价值。 Python 自动化测试面试题 1.直接手写一个Python 类 2.直接手写一个构造函数 3.紧接着上面的代码,直接手写,补充完整代码,要求: 对列表中的人进行排序,并筛选出分数大于80的人的名单,组成一个新的列表显示出来。 代码如下: 4.Python 的高阶函数有哪些,分别都有什么作用? 5.简单说说生成器,迭代器,装饰器是什么,都有哪些作用? 6.Python 中,如何将字符串转化为整型? 7.TCP 三次握手和四次挥手,请分别直接写出来 8.HTTP 常见的状态码有哪些?都是什么含义?

9.webdriver 的核心原理是什么? 10. A ppium 是什么?主要用来做什么的?它的核心原理是什么? 11. s elenium1 和selenium2 的区别是什么,为何要抛弃selenium1? 它有什 么缺陷? 12. 常见的元素定位方法有哪些? 13. 直接手写一个冒泡排序和快速排序,时间复杂度是多少?空间复杂度是多 少?是否稳定? 14. 如何查询Linux 后台日志,直接写出命令 15. 如何查看当前进程? 16. D ockerfile 是什么?如何去创建一个Dockerfile? 17. P ython 有没有垃圾回收机制?它又是通过什么来的? 18. 熟悉TestNG?那请说一下用法? 19. 熟悉Java,那请直接手写一个单例模式? 20. 数据库增删改查,手写SQL 21. R edis 是做什么用的?ElasticSearch是什么?做什么用的? 22. 接口测试怎么做的?如果存在接口依赖关系,怎么做? 23. 元组和列表的区别是什么? 24. P ython中,*arg 和*kwarg 分别代表什么含义,都有哪些作用? 25. 写过爬虫吗?那请说一下常见的反爬机制有哪些?如果是动态加载的页面, 看不到数据,如何去进行爬取?

人工智能时代如何使用Python进行自动化测试

人工智能时代如何使用Python进行自动化测试Python在自动化测试中用途很广,人工智能时代的到来又给Python带来了很大的提升空间,那么在人工智能跨速发展的今天,又是如何使用Python 进行自动化测试呢?今天简单的跟大家介绍一下Python自动化测试,这里主要介绍一些Python测试框架。 1.单元测试 2.使用python进行windows GUI测试 3.使用python进行Web自动化测试 4.使用python进行性能测试 Python对服务器端的自动化测试

Python对web的自动化测试 Python对数据库的自动化测试 Python对GUI的自动化测试 Python高性能网络测试框架欧诺个 Python实现远程性能监控 Python实现自动化性能测试 Python对Android APP的自动化测试 Python对Java代码做单元测试 用python做测试的优点: 学习难度小,开发周期短。对目前国内大多数测试人员来说,编码经验不足,python是个很好的入门语言。胶水语言,能与C++, Java, COM, and .NET,Object-C 整合。 测试部门要做单元测试,接口测试,因为人员比例的关系,不可能让测试人员同时掌握多门语言,python可以对C/C++, Java, Object-C进行接口封装后,实现单元测试。语法简约,清晰。减少后期维护的难度。

跨平台 大量可用的库(但python的库有个缺点是,不像perl一样,有个CPAN 类库集中地,大部分集中在SourceForge,其实有google这些都不是问题)成熟的框架。web: django,zope。高性能网络框架:twisted,gevent 丰富python测试工具。此系列文章主要关注于python在测试中的应用。这里有很全面的测试工具介绍 自动化测试框架PyUnit Python游戏开发 Pygame 使写游戏变简单的python库 pyQt专有的GUI库进行图形界面开发 但PyQt虽然可以开发界面,但不是专门用来写游戏的,需要对它加以封装。

python+Appium自动化测试应用教程及实例(APP测试)

篇1 安卓app自动化测试-appium环境篇 1.1概要 本篇主旨是介绍安卓app自动化测试,就不在这里扯些无关的废话,有机会再在以后的文章中慢慢阐述一些理论的东西。有关智能机(Android/IOS)上app的自动化测试原理一句话:通过python脚本利用appium第三方库实现。(另:多说一句,其他语言或其他工具同样能够做,这里不做优劣,好坏评判。我讲的是python)我后面一系列的文章都会有个主基调—实战为主。 1.2 环境篇—环境准备 操作系统windows10 64位,本篇只涉及windows的环境安装,至于MAC的系统会在以后的文章中涉及(毕竟你想要做ios的app自动化测试必须要在苹果机上装环境,而MAC 的环境安装可以说是噩梦!)所以大家在准备环境时,一定要看清楚自己的电脑是64位还是32位,因为有些软件的安装要按照自身的系统选择版本!涉及到时候我会提醒大家。 准备及安装步骤: python的安装 有关python的安装(已经有环境的筒子略过),目前可供选择的版本Python 3.6.0 - Python 2.7.13。简单说2.7比较成熟老套,3.0以后就是比较时尚。至于 选择安装哪个版本自行决断。我的是2.7 的版本。 提醒:python的安装是傻瓜式的,一步步next就好,别瞎去改安装路径,最后 记得勾选配置环境变量(也就是说安装的时候就自动把环境变量给你配置好, 省的自己再去配置) 完成安装后,运行—cmd—输入python 看到这个没报错,显示以上信息表示python的运行环境ok了。简单点输入 print 1+1回车,结果应该是命令窗返回2 (1)node.js的安装

PYTHON实现手机自动化测试

Python实例--实现手机自动化测试 Python实现手机自动化测试,文章中仅包含了简单的测试:安装,运行,卸载的测试,运行完成后会截张图,待脚本运行完成后可以查看图片验证安装运行成功与否,此文章包括介绍了JDK,SDK,Python的配置,图文并茂希望能帮助到需要的人。随后会发布介绍如何python手机自动化测试功能模块,包括验证操作是否预期等。 步骤一安装JDK并配置环境变量 百度搜索JDK下载安装包,我下载的JDK1.8版本,双击EXE文件进行安装,点击下一步。 选择安装目录安装过程中会出现两次安装提示。第一次是安装jdk,第二次是安装jre。

选择安装目录后点击下一步,等待安装成功。 配置环境变量: 1.计算机→属性→高级系统设置→高级→环境变量

2.系统变量→新建JAVA_HOME变量。变量值填写jdk的安装目录(我的是默认安装路径C:\Program Files(x86)\Java\jdk1.8.0_66)

3.系统变量→寻找Path变量→编辑→新建(win10系统)。变量值填写jdk的安装目录文件下的jre→bin的路径。(注意win7xp等系统下原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入路径)

4.系统变量→新建CLASSPATH变量,变量值填写jdk的安装目录文件下的lib文件下tools.jar的路径。配置完毕。 5.验证配置是否成功,运行cmd,输入java–version,如图中显示则配置成功。

步骤二:配置sdk 1.去百度上搜索下载SDK文件包并解压好后就可以进行配置了,进入计算机→属性→高级系统设置→高级→环境变量。 2.系统变量→新建ANDROID_HOME变量,变量值填写SDK解压的文件路径。 3.系统变量→寻找Path变量→编辑→新建,变量值分别填写SDK 下的platform-tools和tools的目录路径。

相关文档
相关文档 最新文档