自动化测试简介:
*自动化的应用范围和测试用例设计:
(1)自动化测试适用于项目周期长,界面元素稳定、需求变动不频繁的项目。
(2)自动化测试用例的流程不要太长,不要有太多的分支。
(3)自动化测试脚本是把手工测试过的用例转换成脚本,但是不是所有的手工用例都能转换成脚本,转换率一般要达到70%以上。
(4)自动化测试适用于回归测试。
Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。 ---- 摘自 百度百科
此次分享主要是讲基于python的selenium自动化测试,所以,关于python语言编程的部分,我认为以够用为标准,以在工作中能用得上为导向进行学习,直接进入主题,以求达到快速入门,并能灵活运用的目的。
1. Python基础
Python目前通用的有两个版本,Python2和Python3,现在大多数使用的是Python3版本,因为官网之前说过对于Python2到一定时间就不会再更新了,所以如果要学习的话,推荐从Python3开始学习。
我就说一下我学习Python语言基础的步骤:
学习Python和学习其他语言一样,都是从打印hello world开始,接着是了解Python的数据类型,分为整型(int)、字符串(str)、浮点型(float),然后学习if(else)语句、while循环、for循环、数组和字典,接下来是函数、类、类的继承、方法等等,最后是模块的引用和调用。
在这里顺便说一下现在比较流行的Python编辑器:
1. pycharm(我用的就是这个,还比较容易上手,收费的,但是网上找破解码可以破解)。
2. ATom(开源的,我没用过)。
3. Sublime(开源的,比较出名的编辑器)
2. selenium自动化元素定位
selenium是一种web的自动化测试工具,可以用来做PC/h5 web自动化。
在学习元素定位之前,先看下我演示的网址页面..........
通过360浏览器的审查元素或者谷歌的F12,我们看可以看到页面上的元素都是由一行一行的代码组成。它们之间有层级的组织起来,每个元素有不同的标签名和属性值。
那么在Selenium 当中就是通过这信息来找到不同的元素的。:
总结一下HTML页面中:
1. 所有的内容都是以标签的形式展现
2. 绝大多数标签以标签对的形式出现
3. 一般以什么开头,就用这个做标签名
4. 每个标签都有自己的属性
webdriver 提供了八种元素定位方法:
l id
l name
l class name
l tag name (标签名)
l link text (文本链接)
l partial link text (部分文本链接)
l xpath
l css selector
在Python 语言中对应的定位方法如下:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
以上一共有八种元素定位方式,具体用什么哪种方式定位,要看具体情况,哪种方便用哪种,有name的尽量用name定位,因为这个元素属性值一般不会变(我用的最多的就是name和id定位,看起来比较简单,当然最偷懒的就是直接在谷歌浏览器上copy出Css或者Xpath,定位成功率能达到80%以上)。
这里重点讲一下比较难的Xpath和Css定位元素。
Xpath是通过元素的绝对路径定位:
例如: /html/body/input
如果body下面有多个input标签,要找第三个input标签
就是 /html/body/input【3】
通过元素属性定位:
//标签名【@type(属性名)=‘属性值’】
通过层级和元素属性结合定位:
//父标签名【@type(属性名)=‘属性值’】/子标签名
Css使用选择器来为页面元素绑定属性:
其中.表示class,#表示id,例如:
find_element_by_css_selector('#moduleid_12').click()
对于web 自动化来说,学会元素的定位,那么,自动化测试已经半入门了,剩下的就selenim的WebDriver中所提供的各种方法的使用,如鼠标模拟、鼠标操作等。
基于目前我做的一个CRM项目中登录新增账号的自动化测试脚本:
登录Login:
from selenium import webdriver
from time import sleep
#初始化浏览器,打开浏览器
dr = webdriver.Chrome()
#通过xpath绝对路径定位登录过程
def login(self):
d =self.dr
d.get("http://************") # 打开网站
d.maximize_window() # 窗口最大化
d.find_element_by_xpath('//*[@id="userName"]').clear()
d.find_element_by_xpath('//*[@id="userName"]').send_keys(100023)
d.find_element_by_xpath('//*[@id="userPwd"]').clear()
d.find_element_by_xpath('//*[@id="userPwd"]').send_keys(123456)
d.find_element_by_xpath('//*[@id="Login"]').click()
sleep(2) #休眠2秒
新增帐号:
import unittest
from selenium import webdriver
from time import sleep
from study import CRMlogin1
class CrmTest(unittest.TestCase):
def setUp(self): #每条用例之前执行以下内容
self.expLoginResult ='登录系统'
self.expaddResult ='新增帐号'
self.dr = webdriver.Chrome()
# self.dr.implicitly_wait(10)
self.url = 'http://weixin-test.kemai.com.cn:6200' #定义访问的网址url
def testadd(self):
dr =self.dr
dr.get(self.url) #访问刚才定义的网址
#登录系统
CRMlogin1.login(self)
dr.implicitly_wait(5) #设置隐式等待(5秒内找不到元素就抛出异常)
# 通过id定位元素进入首页
dr.find_element_by_id('lis_1').click()
dr.find_element_by_css_selector('#moduleid_12').click() #进入帐号管理页面
# 创建帐号过程
dr.find_element_by_css_selector('#contenter > div > div > div > div.mainHdBox > div > input.newAddIco').click()
dr.find_element_by_css_selector('#add-user > form > div.form-body > div:nth-child(2) > div > input').send_keys(1)
dr.find_element_by_xpath('//*[@id="add-user"]/form/div[1]/div[3]/div/input').send_keys(18665379495)
dr.find_element_by_xpath('//*[@id="add-user"]/form/div[1]/div[4]/div/input').send_keys('361891084@qq.com')
dr.find_element_by_xpath('//*[@id="js_select_branch"]').click()
dr.find_element_by_xpath('//*[@id="mCSB_7_container"]/div/ul/li/div').click()
dr.find_element_by_xpath('//*[@id="1"]').click()
dr.find_element_by_xpath('//*[@id="savebranch"]').click()
dr.find_element_by_xpath('//*[@id="add-user"]/form/div[1]/div[6]/div/div/label[1]/input').click()
dr.find_element_by_xpath('//*[@id="add-user"]/form/div[1]/div[7]/div/div/label/input').click()
dr.find_element_by_xpath('//*[@id="add-user"]/form/div[2]/input[2]').click()
rus = dr.find_element_by_xpath('//*[@class="xcConfirm"]/div[2]/div[1]/span').text #获取弹窗中的文本内容
dr.get_screenshot_as_file(r'E:\CRM自动化截图\新增帐号.png')
self.assertIn('成功',rus)
dr.find_element_by_xpath('//*[@class="xcConfirm"]/div[2]/div[3]/div/a').click()
def tearDown(self): #每条用例之后执行以下内容
sleep(3)
self.dr.close()
if __name__ == '__main__':
unittest.main()
生成测试报告:
import unittest,time #导入单元测试框架、时间
from HTMLTestRunner import HTMLTestRunner #调入这个模块的报告样式
if __name__ == "__main__":
#定义测试用例的存放路径
test_dir = (r'E:\untitled\study')
#匹配测试用例组成测试套件
discover = unittest.defaultTestLoader.discover(test_dir,"*1.py") #匹配以1结尾的py文件
#定义测试报告的存放路径
testReportDir = (r'E:\report')
#定义测试报告的名字
nowTime = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime()) #当前时间
fileName = nowTime + ".html" #文件名
# 定义测试路径和测试报告名字
report_Name = testReportDir + fileName #文件存放地址+文件名
#打开文件,并赋予可写权限
fp = open( report_Name,"wb")
#把测试结果写进测试报告,并装载到HTHMLTestRunner模块
runner = HTMLTestRunner(stream = fp ,title = "CRM自动化测试报告",description="用例执行情况")
#运行测试用例
runner.run(discover)
#关闭文件
fp.close()
一起学习,共同进步!
2017.11.18
By Tiger