稍微了解下自动化测试
自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。
常见的自动化测试工具:QTP、selenium、Rational Robot 、jmeter、appium、soapui、Loadrunner等等
自动化测试方法
- 测试对象:UI、接口、代码
- 测试过程:系统测试、集成测试、单元测试
- 执行人员:测试人员、开发人员
自动化测试可以在整个测试过程中任何一个阶段实施,前提功能相对稳定
测试人员一般在系统测试时进行自动化测试
集成测试阶段多进行自动构建、部署,以及冒烟测试的自动化
单元测试针对代码级别进行测试,可进行静态代码检查,或者执行单元测试用例,典型的框架比如junit,jmock等,该部分多由开发人员实施 - UI自动化
用例维护量大
页面相关性强,必须后期介入
UI测试适合与界面变动较小的项目 - 接口自动化
可在产品前期介入
用例维护量小
页面相关性小
适合接口变动较小,界面变动频繁的项目
区分冒烟测试和回归测试
1.冒烟测试就是在一个新版本出来的时候,将软件的全部功能过一遍,看有没有什么大问题。如果功能可以正常运行,不会影响测试进行,那么这个版本就可以真正开始测试了。如果功能有重大问题或影响测试进行,那么这个版本就是不合格的,不用进行进一步的测试。
2.回归测试就是以前版本中发现的bug在新的版本中验证是否存在且是否引发新的bug。
自动化测试的适用对象
实施自动化测试的前提条件:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用
1、需求变动频繁的项目,自动化脚本不能重复使用,维护成本太大,性价比低
2、项目周期短,自动化脚本编制完成后使用次数不多,性价比低
3、交互型较强的项目,需要人工干预的项目,自动化无法实施
Selenium WebDriver的工作原理
webdriver常用的API
元素的定位
对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
- id
- name
- class name
- link text
- partial link text
- tag name
- xpath
- css selector
根据id定位
from selenium import webdriver # 要想使用selenium 的webdriver 里的函数,首先把包导进来
import time # 导入time包
browser = webdriver.Chrome() # 选择操控的浏览器
browser.get("https://www.baidu.com") # 进入百度搜索网址
time.sleep(2)
browser.find_element_by_id("kw").send_keys("java") # 搜索框内输入java
browser.find_element_by_id("su").click() # 点击搜索
time.sleep(5)
browser.quit() # 关闭浏览器
根据name定位
browser.find_element_by_name("wd").send_keys("python")
根据class name定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
通过link text定位
有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link text定位
browser.find_element_by_link_text("hao123").click()
通过 partial link text定位
通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:
browser.find_element_by_partial_link_text("新").click() # 点开新闻
根据tag name(标签名)定位
browser.find_element_by_tag_name("input").send_keys("罗马") #定位不到输入框,因为页面input太多了
通过xpath定位
XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。
browser.find_element_by_xpath("//*[@id='kw']").send_keys("古希腊")
通过css selector定位
CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略。
browser.find_element_by_css_selector("#kw").send_keys("css")
操作测试对象
鼠标点击:click()
模拟键盘输入:send_keys
清除输入框内容(可以的话)clear
获取元素的文本信息text
提交内容submit
browser.find_element_by_id("kw").send_keys("java") # 模拟按键输入
browser.find_element_by_id("su").submit() # 提交内容
time.sleep(1)
text = browser.find_element_by_id("s-bottom-layer-right").text
print(text)
等待
前提导入import time
time.sleep(3)
智能等待
broswer.implicitly_wait(5)
打印信息
打印tile及url
from selenium import webdriver
import time
broswer = webdriver.Chrome()
broswer.get("https://www.baidu.com")
broswer.find_element_by_id("kw").send_keys("java") # 模拟按键输入
print(broswer.title)
print(broswer.current_url)
broswer.quit()
根据执行结果可以看到页面被正常打开了
浏览器操作
浏览器最大化browser.maximize_window()
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
print("浏览器最大化")
browser.maximize_window() # 将浏览器最大化显示
time.sleep(2)
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
设置浏览器宽、高
browser.set_window_size(800, 800)# 设置浏览器宽高800,800
浏览器的前进与后退
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(2)
browser.back()# 浏览器后退
time.sleep(2)
browser.forward()# 浏览器前进
time.sleep(3)
browser.quit()
控制浏览器滚动条
from selenium import webdriver
import time
#访问百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(3)
driver.quit()
execute_script(script, *args)
,在当前窗口/框架同步执行javaScript
键盘事件
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys("鹿鸣")
time.sleep(3)
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a') # 相当于ctrl+A
time.sleep(2)
browser.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x') # 相当于ctrl+x
time.sleep(2)
browser.quit()
自动化登陆脚本:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Chrome()
browser.get("http://127.0.0.1:88/biz/user-login-L2Jpei8=.html")
browser.implicitly_wait(10)
browser.find_element_by_id("account").send_keys("admin")
browser.implicitly_wait(10)
browser.find_element_by_id("account").send_keys(Keys.TAB) # 换行
browser.implicitly_wait(10)
browser.find_element_by_name("password").send_keys("Lljh")
time.sleep(2)
browser.find_element_by_id("submit").click()
time.sleep(2)
browser.quit()
鼠标事件
ActionChains 类
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 移动
//登陆脚本
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
browser = webdriver.Chrome()
browser.get("http://127.0.0.1:88/biz/user-login-L2Jpei8=.html")
browser.implicitly_wait(10)
t1 = browser.find_element_by_id("account")
t1.send_keys("admin")
time.sleep(5)
t2 = browser.find_element_by_name("password")
ActionChains(browser).move_to_element(t2).perform() # 将鼠标从用户名框移动到密码框
t2.send_keys("Lljh")
browser.find_element_by_id("submit").click()
time.sleep(2)
browser.quit()
定位一组元素
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的checkbox 都勾上
先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('../html/test.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements_by_tag_name('input')
# for input in inputs:
# if input.get_attribute('type') == 'checkbox':
#
# input.click()
inputs[1].click() # 勾选数组下标为1的元素
time.sleep(2)
dr.quit()
多层框架/窗口定位
import time
import os
browser = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('../html/t2.html')
browser.get(file_path)
browser.implicitly_wait(30)
# 先找到到ifrome1(id = f1)
browser.switch_to.frame("f1")
# 再找到其下面的ifrome2(id =f2)
browser.switch_to.frame("f2")
# 下面就可以正常的操作元素了
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
下拉列表处理
通过脚本选择下拉列表里的$10.69
import os
import time
from selenium import webdriver
browser = webdriver.Chrome()
path = 'file:///' + os.path.abspath("../html/t4.html")
browser.get(path)
# 先定位到下拉框
# m=browser.find_element_by_id("ShippingMethod")
# # 再点击下拉框下的选项
# m.find_element_by_xpath("//option[@value='10.69']").click()
lists = browser.find_elements_by_tag_name("option")
lists[2].click()
上传文件操作
上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。
#coding=utf-8
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
#脚本要与upload_file.html 同一目录
file_path = 'file:///' + os.path.abspath('upload.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\PycharmProjects\\test\\upload.txt')
time.sleep(2)
driver.quit()
alert、confirm、prompt 的处理
- text 返回alert/confirm/prompt 中的文字信息
- accept 点击确认按钮
- dismiss 点击取消按钮,如果有的话
- send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错
unittest框架
python的单元测试框架
优点:
- 能够组织多个用例去执行
- 提供丰富的断言方法
- 提供丰富的日志与测试结果
UnitTest核心要素
- test fixture
初始化和清理测试环境,比如创建临时的数据库,文件和目录,其中setUp()和setDown()最常用方法。 - test case
单元测试用例,TestCase 是编写单元测试用例最常用的类 - test suit
单元测试用例的集合,TestSuite 是最常用的类 - test runner
执行单元测试 - test report
生成测试报告