python+selenium自动化测试封装

测试框架就是一个集成的体系,包括测试功能的函数库(如导入的包),测试数据源(测试数据),测试对象识别标准(webdriver的各个api),以及可充用的模块(结构优化),自动化测试框架主要经过  模块驱动测试--》数据驱动测试--》对象驱动测试几个过程。

一.模块驱动测试

模块驱动主要发展过程:线性测试(一个用例对应一个脚本,数据和脚本混合)---》模块化与类库(重复的部分写成公共的模块,需要的时候进行调用)

模块化多用于登录和退出模块,或者多处共用的模块

好处:1.提高了开发效率,一处写,多处用   2.方便脚本维护,不必改一处,处处动,类似与环境变量设置的   %home%

下面我们进行登录和退出的模块化,在这之前先了解一下 python的类和方法

def关键字用来创建函数,add为方法名。a和b为参数;class关键字用来创建类,Counter为方法名,特别注意,类下创建方法第一个参数必须为self,但是使用时不必赋值

self:self指对象本身,创建类和方法时实例化得到对象 self,调用时自动执行 类.方法(对象self,参数a,参数b)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> def add(a,b):
     c = a + b
     print c
 
     
>>> add( 2 , 3 )
5
>>> def add1(a = 1 ,b = 12 ):
     c = a + b
     return c
 
>>> d = add1()
>>> print d
13
>>> 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.subtract( 7 , 2 )
5

登录输入用户名,密码的操作单独放到一个脚本中  login.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#coding=utf-8
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import unittest
from time import sleep
 
#登录网址
def login( self ):
     driver = self .driver()
     dr.maxmize_window()
     dr.find_element_by_name( "username" ).send_keys( "dingxin" )
     dr.find_element_by_name( "password" ).send_keys( "admin" )
     dr.find_element_by_id( "loginInBtn" ).click()
     sleep( 3 )

登录后进行其他操作放到 test_login.py中得到:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#coding=utf-8
from selenium import webdriver
from time import sleep
from selenium.common.exceptions import NoSuchElementException
import unittest
import login
#Login类继承TestCase类,告诉unittest,这是一个案例
class Login(unittest.TestCase):
#初始化数据
     def setUp( self ):
         self .driver = webdriver.Chrome()
         self .driver.implcitly_wait( 30 )
         self .url = "http://dhw.lxhbysn.com/pages/E02/login.jsp"
         self .verificationErrors = []
         self .accept_next_alert = True
#登录
     def test_login( self ):
         driver = self .driver
         driver.get( self .url)
#调用登录模块
     login.login( self )
     sleep( 3 )
     lis = driver.find_elements_by_class_name( "li" )
     for li in lis:
         if li.get_attribute( "role" ) = = "presentation" :
             print li.text
#           
     def tearDown( self ):
         self .driver.quit()
             self .assertEqual([], self .verificationErrors)
 
if _name_ = = "_main_" :
     unittest.main() 

 (注意缩进,要不然调试不出来)

二.数据驱动测试(即参数化,输入数据的不同导致结果也不同)

实例1:百度搜索逐个多个字段

创建data.txt

?
1
2
3
4
selenium
go die
WFU
appium

创建search.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#coding=utf-8
from selenium import webdriver
from time import sleep
import os
 
#打开数据文件并读取
source = open ( "C:\\Users\\DELL\\Desktop\\data.txt" , "r" )
values = source.readlines()
source.close()
 
#登录网址
for search in values:
     dr = webdriver.Chrome()
     dr.get( "http://www.baidu.com" )
     dr.find_element_by_id( "kw" ).send_keys(search)
     dr.find_element_by_id( "su" ).click()
     sleep( 3 )

open是以只读方式打开,readlines()逐行读取文件内容

实例2:登录时多个用户名和密码

python读取文件只有整个读取,逐行,逐个字节进行读取,没有一次读取两条数据

(1)思路:可以创建两个txt,一个放登录名,一个放密码,缺点是无法实现循环

(2)使用函数

?
1
2
3
4
5
def  fun(name = "admin" , pass = 123 "):
    return  name, pass
 
#正式的登录页面调用该函数
us,pw = info.fun() 

(3)python字典(键值对)创建字典用{},keys()返回键值列表,values()返回值列表,

?
1
2
3
4
5
6
7
8
9
>>> data = { 'user' : 'dong' , 'apassword' : '489330019' }
>>> print data
{ 'user' : 'dong' , 'apassword' : '489330019' }
>>> data.keys()
[ 'user' , 'apassword' ]
>>> data.values()
[ 'dong' , '489330019' ]
>>> data.items()
[( 'user' , 'dong' ), ( 'apassword' , '489330019' )]

函数获取data(整个文件)后期可以用以下循环取出:

?
1
2
for user, pass in  info.items():
  # (将user,pass传入到send_keys()中)

实例三:表单参数化,多条表单信息(姓名,性别,邮箱,号码),保存成excel,转为csv,可用于创建订单或添加联系人

具体实现:

创建xls文件转化为csv格式,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#coding=utf-8
#导入csv包
import csv
 
#csv.reader读取csv文件
w_file = 'C:\\Users\\DELL\\Desktop\\info.csv'
data = csv.reader( file (w_file, 'rb' ))
 
#循环输出每一行信息
 
for user in data:
     print user[ 0 ]
     print user[ 1 ]
     print user[ 2 ]
     print user[ 3 ]

结果如下:user[0]表示第一列的数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = RESTART = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>
test
test@ 163.com
18
test2
test2@ 163.com
21
test3
test3@ 163.com
11

实例四:可以通过xml文件进行参数化,一般来说 csv和xml比较灵活。

三.对象驱动测试

对象驱动测试其实包括数据和关键字驱动测试,关键字驱动即类似与selenium IDE 的 command,target 和value 组合进行测试。

你可能感兴趣的:(自动化测试)