Selenium+Python 自动化测试模型

上一篇 / 下一篇  2016-11-10 15:05:14 / 个人分类:python

学习Selenium+Python,最终的目的是为了实现自动化测试的操作。 
前面几篇文章,详细介绍了搭建环境、如何准确定位测试对象以及几个常用web 控件的脚本使用,基本可以实现关于网站的登录、注册等自动化操作。 
今天开始学习自动化测试模型的介绍,包括模块化,数据驱动以及数据驱动参数化。自动化测试模型是自动化测试架构的基础。

1.模块化与类库 
我们 测试过程中,即使自动化测试,写的脚本,很多内容是重复性的;于是我们就可以考虑将其重复的部分,写成一个公共的模块,需要的时候进行调用,这样就大大提高了我们编写脚本的效率。 
下面以百度云网站的登录,退出为例。 
分析: 
百度云网站的登录,那么需要登录部分的脚本,用于自动输入用户名,密码以及点击登录按钮。将此脚本命名为Login.py 退出该网页,只需要简单的quit()函数即可实现,将此脚本命名为Quit_OS.py 
首先,写login.py的内容如下:

fromseleniumimportwebdriverfromselenium.webdirver.common.action_chainsimportActionChainsimporttimedeflogin():browser=webdriver.Chrome()
    browser.find_element_by_name("userName").clear()
    browser.find_element_by_name("userName").send_keys("alu***")
    browser.find_element_by_name("userName").send_keys(Keys.TAB)
    browser.find_element_by_name("password").send_keys("*****")
    browser.find_element_by_css_selector("input[value='登录']").click()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其次,写Quit_OS.py 脚本

fromseleniumimportwebdriverfromselenium.webdirver.common.action_chainsimportActionChainsimporttimedefquit_OS():browser=webdriver.Chrome()
    browser.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后,整合Login.py与Quit_OS.py 集成一个完整的,可重复性使用的。

#coding=utf-8from selenium import webdriver
from selenium.webdirver.common.action_chains import ActionChains
import time
import Login,Quit_OS#调用Login,Quit_OS模块browser=webdriver.Chrome()
url="http://yun.baidu.com/"browser.get(url)# 调用登录模块Login.login()#注意大小写,调用模块名字与函数名字的书写time.sleep(10)# 调用退出模块Quit_OS.quit_OS()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这样做的优点是提高了开发效率,不用重复的编写相同的脚本;假如,我已经写好一个登录模块,我后续需要做的就是在需要的地方调用,不同重复写脚本。同时,方便了代码的维护,假如登录模块发生了变化,我只用修改 login.py 文件中登录模块的代码即可,那么所有调用登录模块的脚本不用做任何修改。

2.数据驱动 
这点与QTP中的DataTable的功能类似。可以理解成参数化,输入数据的不同从而引起输出结果的变化。 
测试案例:以搜狗搜索为例,自动搜索5次不同的关键字。 
测试脚本:

fromselenium import webdriverfromselenium.webdriver.common.action_chains import ActionChains
importtimevalues=['Selenium','QTP','Loadrunner','Python','Ruby']forkeyinvalues: 
    browser=webdriver.Chrome()
    url="https://www.sogou.com/"browser.get(url)
    browser.find_element_by_name("query").clear()
    browser.find_element_by_name("query").send_keys(key)
    browser.find_element_by_css_selector("input[value='搜狗搜索']").click()time.sleep(4)
    browser.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这样可以做到,不管我们读取的是数组,还是字典、函数,又或者是 csv、txt 文件。实现了数据与脚本的分离,实现了参数化。传100个数据,通过脚本的执行,可以返回100个结果出来。

3.数据驱动(**.txt)参数化 
在上一段的数据驱动中介绍了如何通过 python 定的数组对sogou输入数据进行参数化设置,将其它循环的读取 vlalues 数组中每一个数据。这里我们将通过读取 txt 文件中的数据来实现参数化。 
在C:\Python3.4目录下,创建一个test.txt,在里面输入: 
这里写图片描述 
测试案例:应用搜狗搜索,即通过读取tes.txt的数据,得到相应的搜索网页结果。 
搜狗输入编辑框的定位: 
这里写图片描述 
测试脚本:

source=open("test.txt","r")
keys=source.readlines()
source.close()
for keyinkeys:
    browser=webdriver.Chrome()
    url="https://www.sogou.com/"browser.get(url)
    browser.find_element_by_name("query").clear()
    browser.find_element_by_name("query").send_keys(key)
    browser.find_element_by_css_selector("input[value='搜狗搜索']").click()
    time.sleep(4)
    browser.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.数据驱动(**.csv)参数化 
如果我有自动化脚本中要参数化一张表单,表单需要填写用户名、网址,城市等信息,使用上面的方法就很难来解决这个问题,那么,可以通过读取 .csv 文件的方法来解决这个问题。 
这里写图片描述 
**.csv文件是通过Excel或者WPS来创建,创建后,另存为CSV类型。 
测试脚本:

#coding=utf-8importcsv#加载csv模块withopen('test.csv')asf:
    data = csv.reader(f)foruserindata:print(user[0])print(user[1])print(user[2])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

F5,运行得到: 
这里写图片描述


TAG: 模型

 

评分:0

我来说两句

Open Toolbar