什么是自动化测试?
自动化测试是将人为驱动的测试行为来转化为机器执行的过程.作为一个测试人员,做自动化一般是指接口自动化与UI自动化。
常见的自动化测试工具:selenium,jmeter,Loadrunner等
selenium是一个web的自动化测试工具
自动化测试的优缺点?
优点:
1.对程序的回归测试更加方便
2.可以运行更多更加繁琐的测试,可以在较短的时间内进行更多的测试
3.可以执行一些手工测试困难或者并不可能进行的测试.比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的 .
4.可以更好的利用资源,节省时间和人力,提高测试的复用性和一致性.
缺点:
1.并不可以完全取代手工测试,手工测试比自动化测试发现的bug多
2.自动化测试对于测试质量的依赖性大,得在程序相对稳定时应用
3.自动化测试比手动测试更加存脆弱,需要实时进行维护
自动化测试的意义,开始之前需要做哪些工作?
意义:结合优点来说
1.方便对程序进行回归测试
2.可以执行手工测试困难或者不可能实现的测试环节
3.能够更好的利用资源,节省人力和时间
准备:
执行自动化测试之前首先要判断该项目是否适合推广自动化测试,
实施自动化测试的前提条件:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用
之后对项目进行需求分析,指定测试计划,搭建自动化测试框架,设计测试用例,执行测试,进行测试评估
自动化测试的两个类型?
1.接口自动化 实施阶段:后端开发完成之后实施
2.UI自动化 实施阶段:前端开发完成之后实施
共同点:都得在项目功能相对稳定的情况下实施,保证自动化脚本的复用性
selenium
selenium是一个web的自动化测试工具,支持多平台、多浏览器、多语言去实现自动化测试.
selenium的优点?
1.免费,小巧
2.支持多语言:支持C,java,ruby,python,C#等
3.支持多平台:windows,linux,Mac
4.支持多浏览器:ie,chrome,forefix,safari
5.支持分布式测试用例的执行,selenium grid
selenium2(selenium1+WebDriver)
Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素.
Selenium IDE也将支持 WebDriver API,包括将录制生成的测试用例 导出为 WebDriver 所支持的各种编程语言(Ruby、Python、C# 和 Java)(仅个人使用,实际开发中很少使用)
WebDriver工作原理?
出租车司机的例子:司机不知道路线,乘客指挥司机,司机驱动出租车
脚本(乘客)将指令传递给webdriver(司机),webdriver促使浏览器(出租车)执行脚本命令.
元素的定位(自动化测试的核心)
使用元素定位:要求元素拥有该属性并且全局唯一
定位元素的一系列方法:
- id
- name
- class name
- tag name
- link text
- xpath
- css selector
#要想使用selenium 的webdriver 里的函数,首先把包导进
from selenium import webdriver
import time
#选定对应的浏览器及对应网址
driver = webdriver.Firefox()
driver .get("https://www.baidu.com/")
#放大浏览器窗口
driver.maximize_window()
time.sleep(3)
#脚本书写元素定位
#使用元素定位:要求元素拥有该属性并且全局唯一
# #通过id定位
driver.find_element_by_id("kw").send_keys("三十而已")
driver.find_element_by_id("su").click()
#使用name来定位,并不是所有界面的元素都有id和name
#所有元素的id如果有,就一定是唯一的
driver.find_element_by_name("wd").send_keys("yamy")
driver.find_element_by_id("su").click()
#使用classname来定位
#此class属性在全局不唯一,会冲突,所以定位不到,失败
driver.find_element_by_class_name("s_ipt nobg_s_fm_hover").send_keys("王一博")
driver.find_element_by_class_name("btn self-btn bg s_btn btn_h btnhover").click()
#使用linktest 源码的开头是a
#加u开头表示这是一串汉字,保证不会产生乱码
driver.find_element_by_link_text(u"关于百度").click()
#部分连接定位,如果页面只有一个关于字段,则可以定位到,若页面有多个关于字段,就无法定位到
driver.find_element_by_partial_link_text("关于").click()
#使用 tag name来定位
driver.find_element_by_tag_name("input").send_keys("苏轼")
driver.find_element_by_id("su").click()
#使用Xpath来定位 检查--> copy--> Xpath 注意复制过来之后引号要对应
#Xpath永远可以定位到,因为他是唯一的
#Xpath是该元素在页面上的路径,//省略前面的路径,后面根据id,name或者...来唯一定位
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("李白")
driver.find_element_by_xpath('//*[@id="su"]').click()
#css定位
driver.find_element_by_css_selector('#kw').send_keys("杜甫")
driver.find_element_by_css_selector('#su').click()
time.sleep(3)
#自动关闭浏览器,
#quit方法不仅关闭窗口,还会彻底的退出webdriver
# quit是更加彻底的close,quit会更好的释放资源
driver.quit()
操作测试对象
- click 点击对象
- send_keys 在对象上模拟按键输入
- clear 清楚对象中的内容
- submit 提交表单 在源码中如果type = submit,那么submit 提交 == 点击 click 效果相同
- text 用于获取元素的文本信息
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
#放大浏览器窗口
driver.maximize_window()
time.sleep(3)
#操作测试对象练习
driver.find_element_by_id("kw").send_keys("白起")
driver.find_element_by_id("su").click()
#不想搜索白起了,想换一个搜,现将白起clean(),再进行后续操作
#clean():清除百度搜索框中的内容
time.sleep(3)
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("张飞")
driver.find_element_by_id("su").click()
#在源码中如果type = submit,那么
#submit 提交 == 点击 click 效果相同
driver.find_element_by_id("kw").send_keys("白起")
driver.find_element_by_id("su").submit()
#text 获取元素文本
text = driver.find_element_by_class_name("s-bottom-layer-left").text
print("text内容为:"+text)
time.sleep(3)
#关闭浏览器
driver.quit()
添加等待
需要引入time包: import time
两种等待的区别:
- 固定等待:time.sleep() //设置等待几秒钟,设置几秒等待几秒
- 智能等待:implicatiy_wait(6) //等待0-6秒中,页面需要几秒打开就等待几秒,打开成功就不等待了,超过6秒还没打开就会报错
#添加等待
#固定等待:time.sleep() 设置等待几秒钟
#智能等待:implicity_wait(6) 等待的时间为0-6秒
driver.find_element_by_id("kw").send_keys("白起")
driver.find_element_by_id("su").submit()
#智能等待一下,脚本的执行时间比页面的时间要快
#等待0-10秒,页面需要几秒就几秒打开,页面加载成功就不等待了,10秒加载不完就会报错
driver.implicitly_wait(10)
driver.find_element_by_link_text(u"人物生平").click()
打印信息 打印tile及url
#打印信息 title 和 url
title = driver.title
print("title=" + title)
#打印的是上一个页面,不是当前页面(挺奇怪但不深究)
url = driver.current_url
print("url =" +url)
浏览器操作
- 浏览器最大化
- 设置浏览器宽,高
- 控制浏览器滚动条
#浏览器的缩小
driver.minimize_window()
time.sleep(6)
#设置浏览器的宽和高,宽400,高800
driver.set_window_size(400,800)
#控制浏览器的滚动条,通过js来控制的
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
键盘按键用法
要调用键盘按键先引入keys包
#需要引入key包
from selenium.webdriver.common.keys import Keys
通过send_keys()调用按键:
- send_keys(Keys.TAB) # TAB
- send_keys(Keys.ENTER) # 回车
driver.find_element_by_id("kw").send_keys("关羽")
driver.find_element_by_id("su").click()
#ctrl+a 选中
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
time.sleep(3)
#ctrl + x 剪贴
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
time.sleep(3)
#重新再输入框中输入想查询的内容
driver.find_element_by_id("kw").send_keys("李商隐")
driver.find_element_by_id("su").click()
鼠标事件
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 移动
#鼠标事件:
driver.find_element_by_id("kw").send_keys("孙尚香")
#定位一下"百度一下"按钮
su1 = driver.find_element_by_id("su")
#右击
ActionChains(driver).context_click(su1).perform()
time.sleep(6)
#双击
ActionChains(driver).double_click(su1).perform()
注意一个点:
在类似于邮箱登录编写自动化测试脚本时,id值都是随机变化生成的,只能写对应的API语句,无法真正的进行自动化测试.这样设计的目的是为了防止密码泄露,暴力解析密码.