一.自动化测试
大中型项目或长期项目可以采用自动化测试:
自动化功能测试:
1)单元测试
程序员搞定
2)功能测试
3)接口测试
自动化性能测试:
Loadrunner、Jmeter等,对软件进行压力测试、负载测试、强度测试等
测试一个web站点的服务能力,需要模拟上千上万的请求
二.自动化测试条件和使用范围
使用自动化的前提条件:
1.手动测试已完成,不影响后期进度逐渐实现自动化
2.项目周期长,重复性大
3.需求稳定,项目变动不大
4.自动化脚本不复杂
5.可重复利用
使用自动化测试的场景:
1.频繁的回归测试
2.冒烟测试
3.互联网迭代
4.需求变化不大,应用频繁
5.性能测试
三.web自动化常用工具
1.QTP
2.Selenium
3.RFT
4.Watir
5.Sahi
四.元素定位
工具:CSS选择器,xpath
补充:
//*[text()=“x’x’x”] 文本内容是xxx的元素
//*[starts-with(@attribute,’xxx’)] 属性以xxx开头的元素
//*[contains(@attribute,’xxxxx’)] 属性中含有xxx的元素
//*[@attribute1=value1 and @attribute2=value2] 同时有两个属性值的元素
五.Selenium自动化测试框架
环境配置:
1.python3.6
2.Firefox35
3.selenium 2/3
4.浏览器驱动--必装
chrome
Phantomjs
ie
Firefox
seleniumAPI基础:
# 库的导入 from selenium import webdriver #创建浏览器对象 driver = webdriver.Firefox() #最大化 driver.maximize_window() #获取浏览器尺寸 driver.get_window_size() #设置浏览器尺寸 driver.set_window_size(700, 800) # 获取浏览器位置 driver.get_window_position() # 设置浏览器位置 driver.set_window_position(20,30) # 请求某个url对应的响应 driver.get("http://www.baidu.com") # 刷新页面操作 driver.refresh() # 回退到之前的页面 driver.back() # 前进到之后的页面 driver.forward() # 关闭当前标签/窗口 driver.close() # 关闭所有标签/窗口 driver.quit()
断言:
获取断言信息
current_url 获取当前访问页面url title 获取当前浏览器标题 get_screenshot_as_png() 保存图片 get_screenshot_as_file(file)直接保存 page_source 网页源码
元素定位:
直接调用型(推荐方式):
driver.find_element_by_xxx(value)
使用By类型(需要导入By):
from selenium.webdriver.common.by import By
driver.find_element(By.xxx,value)
定位一组元素:
driver.find_elements_by_xxx(value)
元素操作:element = driver.find_element_by_xxx(value)
点击和输入:
element.click() 点击操作
element.clear() 清空输入框
element.send_keys(data) 输入数据
element.submit() 提交
获取元素信息:
element.text获取文本内容(既开闭标签之间的内容)
element.get_attribute(value)获取属性值(获取element元素的value属性的值)
element.size获取元素尺寸(了解)
element.is_dispalyed()获取元素是否可见(了解)
多标签之间的切换:
获取所有窗口的句柄handles = driver.window_handlers()
通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
多表单切换:
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
直接使用id值切换进表单
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)
跳回最外层的页面
driver.switch_to.default_content()
跳回上层的页面
driver.switch_to.parent_frame()
鼠标和键盘操作:
鼠标操作:
导入动作链类,动作链可以储存鼠标的动作,并一起执行
from selenium.webdriver import ActionChains
ActionChains(driver)
执行ActionChains中储存的所有动作
perform()
鼠标右击
el = driver.find_element_by_xxx(value)
context_click(el)
对el执行右击
双击操作
el = driver.find_element_by_xxx(value)
ActionChains(driver).double_click(el).perform()
鼠标悬停
el = driver.find_element_by_xxx(value)
ActionChains(driver).move_to_element(el).perform()
键盘操作:
导入
from selenium.webdriver.common.key import Key
常用键盘操作
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
……
send_keys(Keys.F12) 键盘 F12
弹出框操作:
进入到弹出框中
driver.switch_to.alert()
接收警告
accept()
解散警告
dismiss()
发送文本到警告框
send_keys(data)
下拉框操作:
导入Select类
from selenium.webdriver.support.select import Select
将定位到的下拉框元素传入Select类中
selobj = Select(element) 下拉框元素已经定位到
调用响应方法选择下拉框中的选项
select_by_index() 通过索引选择,index 索引从 0 开始
select_by_value() 通过值选择(option标签的一个属性值)
select_by_visible_text() 通过文本选择(下拉框的值)
调用响应方法选择下拉框中的选项
all_selected_options 查看所有已选
first_selected_option 查看第一个已选
is_multiple 查看是否是多选
options 查看选项元素列表
取消选择
deselect_by_index()
deselect_by_value()
deselect_by_visible_text()
JS:
重要的js代码
* js = "window.scrollTo(x,y) "
x为水平拖动距离,y为垂直拖动举例
* js= "var q=document.documentElement.scrollTop=n"
n为从顶部往下移动滚动举例
2.driver.execute_script(js) 执行js代码
显式等待:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
隐式等待:
隐式等待是根据是件进行等待,等待特定时间
driver.implicitly_wait(n)
n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待
cookies操作:
selenium对cookies的操作
get_cookies() 获取所有cookies
get_cookie(key) 获取key对应的值
add_cookie(cookie_dict) 设置cookies
delete_cookie(name) 删除指定名称的cookie
delete_all_cookies() 删除所有cookie
封装:
对selenium的常用操作进行封装
1)封装开启关闭浏览器
2)封装定位操作
3)封装对元素的基本操作
六.unittest模块
Unittest单元测试框架是专门用来进行测试的框架
主要概念: test fixture: 代表了用例执行前的准备工作和用例执行之后的清理工作。 test case: 测试用例,这个相信大家都不陌生。是测试的最小单位,一般检查一组输入的响应(输出)是否符合预期。unittest模块提供了TestCase类来帮助我们创建测试用例; test suite: 经常被翻译成”测试套件”,也有人称为”测试套”,是测试用例或测试套件的集合,一般用来把需要一起执行的用例组合到一起; test runner: 用来执行测试用例并输出测试结果的组件。可以是图形界面或命令行界面;
unittest基本用法:
1.通过继承unittest.TestCase进行编写,继承unittest.TestCase的类会被框架识别为测试用例。 2.setUp和TearDown是用于事前和事后做相关处理动作的,就是前面说的Test Fixture,会在每个测试用例运行前后被框架自动调用 3.所有以test开头的方法会被框架自动识别为测试用例,并自动调用执行,不是以test开头的不会被调用 4.unittest.main()是最简单的测试执行方式 5.调用unittest.main()方法后,继承自unittest.TestCase类的类会被自动识别为测试用例并且被调用。
unittest断言:
断言是测试用例的核心。我们使用assertEqual()来判断预期结果,用assertTrue()和assertFalse来做是非判断。
unittest命令行接口:
unittest支持命令行接口,我们可以在命令行里指定运行具体的测试用例。
python -m unittest test.Tese1
unittest与selenium:
前面我们简单学习了unittest的用法,接下来我们将unittest与selenium融合在一起进行web自动化测试
1. Commonlib目录存放通用模块(我们封装的selenium模块)
2.创建Business目录 ,根据业务创建测试功能模块
3.创建Testcase目录存放测试用例