WEB自动化测试
自动化测试理论概念
什么是自动化?
由机器设备代替人工自动完成指定目标的过程
优点:
- 减少人工劳动力
- 提高工作效率
- 产品规格统一标准
- 规模化(批量生产)
什么是自动化测试?
让程序代替人工去验证系统功能的过程
自动化测试能解决什么?
- 回归测试
- 压力测试
- 兼容性测试
- 提高测试效率,保证产品质量
自动化测试的优点:
- 较少的时间内运行更多的测试用例
- 自动化脚本可重复运行
- 减少人为的错误
- 克服手工测试的局限性
误区:
- 自动化测试可以完全替代手工测试
- 自动化测试一定比手工测试厉害
- 自动化测试可以发掘更多的BUG
- 自动化测试适用于任何功能
自动化测试分类:
- WEB自动化测试
- 移动自动化测试
- 接口自动化测试
- 单元测试-自动化测试
什么WEB项目适合做自动化测试?
- 需求变动不频繁
- 项目周期长
- 项目需要回归测试
WEB自动化测试所属分类:
1.黑盒测试(功能测试)
2.白盒测试(单元测试)
3.灰盒测试(接口测试)
主流的WEB自动化测试工具
- QTP 一个商业化的功能测试工具,收费,支持WEB,桌面自动化测试
- Selenium 一个开源的web自动化测试工具,免费,主要做功能测试
- Robot framework 一个基于Python可拓展地关键字驱动的测试自动化框架
selenium 1.0
- selenium IDE(录制浏览器操作,自动化代码工具)
- selenium Grid(分布式工具:同时启动多个浏览器)
- selenium RC(通过JS模拟浏览器,实现自动化方式)
selenium 2.0
- selenium1.0+WebDriver
- 基于调用WebDriver Api来模拟用户操作
- 支持更多编程语言
- WebDriver的速度更快,因为它直接交互使用
selenium 3.0
- 1.去掉了selenium RC的支持
- 全面拥抱java8
- 支持macOS.支持官方的safaridriver
- 支持ie9.0版本以上
- 通过Mozilla官方的geckodriver来支持firefox
安装selenium包
pip工具
安装:
pip install selenium
pip install selenium==2.48.0
查看:
pip show selenium
卸载:
pip uninstall selenium
chrome 驱动:https://chromedriver.storage.googleapis.com/index.html
火狐48版本以上要安装 驱动:https://github.com/mozilla/geckodriver/releases/
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
url = 'http://www.baidu.com'
driver.get(url)
sleep(3)
driver.quit()
元素定位
1.selenium提供了8种定位元素的方式:
- id(通过标签的id)
- name(通过标签的name)
- class_name(通过标签的class)
- tag_name(通过标签种类)
- link_text(通过定位a标签的内容)
- partial_link_text(定位超链接a标签的部分内容)
- CSS(通过标签的样式选择器)
- XPath(通过元素的路径)
掌握id、name、class_name、tag_name、link_text、partial_link_text、XPath、CSS定位方式的使用
id定位方法
id一般不重复
element1 = driver.find_element_by_id()
element = send_keys()//传输值,输入值
name定位方法
name可重复
driver.find_element_by_name()
class定位方法
class可重复
driver.find_element_by_class_name()
标签名定位方法
driver.find_element_by_tag_name()
a标签内容定位方法
driver.find_element_by_link_text()
a标签部分内容定位方法
driver.find_element_by_partial_link_text()
CSS定位方法
driver.find_element_by_css_selector()
XPath定位方法
driver.find_element_by_xpath()
1.XPath即为XML Path的简称,它是一门在XML文档中查找元素信息的语言
快速找到元素的XPath
Chrome:
- 选择要定位的元素,右键——检查——复制——复制完整XPath
Firefox:
- 选择要定位的元素,右键——使用firebug查看元素,在对应的元素右键——在firepath面板中查看
- 复制XPath路径
XPath定位策略(方式)
- 路径——定位
- 利用元素属性-定位
- 属性与逻辑结合——定位
- 层级与属性结合——定位
路径——定位
绝对路径
如获得新用户注册a元素:/html/body/div/div/div[2]/div/a[@href=“register.html”]
相对路径
相对路径由//开头
//div[@class=“box”]/a[@href=“register.html”]
在标签添加属性
[@]
//*[text()="xxx"] 文本内容是xxx的元素
//*[contains(@attribute,"xxx")] 属性中有xxx的元素
//*[starts-with(@attribute,"xxx")] 属性为xxx开头的元素
操作浏览器
1.元素操作
2.浏览器常见操作API
3.鼠标及键盘的操作
4.元素等待【重点】
元素常用操作方法
- click() 单击元素
- send_keys(value) 模拟输入值
- clear() 清除文本
操作浏览器常用方法
- maximize_window() 浏览器窗口最大化
- minimize_window() 浏览器窗口最小化
- set_window_size(width,height) 设置窗口大小
- set_window_postion(x,y) 设置窗口位置,当x,y为整数时,窗口向右下移动
- back() 模拟浏览器返回按钮
- forward() 模拟浏览器前进按钮
- refresh() 刷新页面
- close() 关闭当前窗口,模拟点击浏览器关闭按钮
- quit() 关闭浏览器驱动对象,关闭所有程序启动的窗口
- title 获取页面title
- current_url 获取当前网页的url
title和current_url一般用于判断上一步的操作是否正确
获取元素的信息的常用方法
- size 返回元素的大小
- text 返回元素的文本内容
- get_attribute(“xxx”) 获取属性值,传递的参数为元素的属性名
- is_displayed() 判断元素是否可见
- is_enabled() 判断元素是否可用
- is_selected() 判断元素是否被选中,用于检查
鼠标操作方法
在selenium中把所有的鼠标操作封装在actionchains类中
实例化对象
action = ActionChains(driver)
方法:
- context_click(element) 鼠标右击
- double_click(element) 鼠标双击
- drag_and_drop(source,target) 鼠标拖动 ,source为要拖动的元素,target为拖动后的元素位置
- drag_and_drop_by_offset(source,x_offset,y_offset)
- move_to_element(element) 鼠标悬停
- perform() 执行
键盘操作
模拟键盘一些按键或组合键的输入,如CTRL+C,CTRL+V
封装在keys类中
常用的键盘操作
1.send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
2.send_keys(Keys.SPACE) 空格键(Space)
3.send_keys(Keys.TAB) 制表键(TAB)
4.send_keys(Keys.ESCAPE) 回退键(ESC)
5.send_keys(Keys.ENTER) 回车键(Enter)
6.send_keys(Keys.COTROL,‘a’) 全选(ctrl+A)
7.send_keys(Keys.COTROL,‘c’) 复制(ctrl+c)
send_keys() 有三个功能
1.输入文本
2.上传文件
元素等待
在定位页面元素的过程中,会在指定时间内一直等待的过程
定位元素时,如果找得到元素,则不等待,若找不到元素,则等待指定的时间,若时间过了还找不到,则抛出异常
元素等待类型:
1.隐式等待
只需要设置一次,就会作用于所有元素
driver.implicitly_wait(timeout)
timeout:等待最长时间,单位秒
2.显式等待
正对单个元素设置等待
定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待,如果不能定位到该元素,则间隔一段时间后再去定位元素,如果在达到最大时还没找到指定元素,则抛出异常TimeoutException
实现方法:
导包: from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5)
- driver:浏览器驱动对象
- timeout:超时的时长,单位秒
- poll_frequency:检测间隔时间,默认为0.5秒
调用方法:
until(method):直到…时
- method:函数名称,该函数用来实现对元素的定位
- 一般使用匿名函数来实现:lambda x:x.find_element_by_id(“userA”)
element = WebDriverWait(driver,5,0.5).until(lambda x:x.find_element_by_id(“userA”))
until()函数执行后返回的是一个元素
上传文件
element.send_keys(location)
element为上传文件的按钮元素
location:要上传的文件路径
下拉选择框
方法一:通过CSS直接定位下拉框的option元素并使用click方法
例如:find_element_by_css_selector(“option[value=‘105’]”)).click()
方法二:select类
select类是selenium为操作下拉框标签特殊封装的
实例化对象:
select = Select(element)
element:标签对应的元素
操作方法:
1.select_by_index(index) 根据option索引来定位,从0开始
2.select_by_value(value) 根据option属性value来定位
3.select_by_visible_text(text) 根据option属性的文本内容来定位
弹出框
网页常见的弹出框:
1.alert
2.prompt
3.confirm
弹出框处理方法:
1.获取弹出框对象
alert = driver.switch_to.alert
2.调用
alert.text() 返回alert/confirm/prompt中的文字信息
alert.accept() 接受对话框选项
alert.dismiss() 取消对话框选项
滚动条操作
selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们为您可以通过JavaScript脚本来达到操作滚动条的目的
1.设置JavaScript脚本控制滚动条
js = “window.scrollTo(0,1000)”
(0:左边距 1000:上边距,单位:像素)
2.selenium调用执行JavaScript脚本的方法
driver.execute_script(js)
frame表单切换
在selenium中封装了如何切换frame框架的方法
方法:
1.driver.switch_to.frame(frame_reference) 切换到指定frame的方法
frame_reference : 可以为frame框架的name、id或者定位到的frame元素
2.driver.switch_to.default_content() 恢复默认页面方法
多窗口切换
在selenium中封装了获取当前窗口句柄,获取所有窗口句柄和切换到指定句柄窗口的方法
句柄:英文handle,窗口的唯一识别码
方法:
1.driver.current_window_handle 获取当前窗口句柄
2.driver.window_handles 获取所有窗口句柄
3.driver.switch_to.window(handle) 切换指定句柄窗口
窗口截图
在selenium中截图方法:
driver.get_screenshot_as_file(imgname)
imgname: 要保存的图片名字,要有.png后缀,例如"截图.png",可设置文件路径,比如"…/img/"保存在当前python项目中
driver.get_screenshot_as_file("%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
验证码处理
1.去掉验证码 (测试环境-采用)
2.设置万能验证码 (生产环境和测试环境-采用)
3.验证码识别技术 (通过Python-tesseract来识别图片验证码,识别率很难达到100%)
4.记录cookie (通过cookie进行跳过登录)
操作cookie
方法:
1.get_cookie(name) name:为cookie的名称
2.get_cookies() 获取本网站所有本地cookies
3.add_cookie(cookie_dict) 添加cookie
cookie_dict: 一个字典对象,必选的键包括:“name” and “value”
操作步骤:
1.登录要测试的网页,并记录登录所需要的cookie和相应的value
2.先打开要测试的网站,再添加cookie
3.使用add_cookie() 格式例如:
add_cookie({“name” : “JSESSIONID”,“value”:“D9AC37834D99D4913B263DCCA655D74F”})
4.添加完refresh()可看到结果
UnitTest框架
核心要素
1.TestCase (测试用例)
2.TestSuite 测试套件(解决多个测试用例执行)
3.TestRunner (以文本的形式运行测试用例)
4.TestLoader (批量执行测试用例-搜索指定文件夹内指定字母开头的模块)
5.Fixture (固定装置)两个固定的函数,一个初始化时使用,一个结束时使用