第一层:功能测试,要求懂软件测试基础理论,Linux、数据库及其他计算机相关的知识
第二层:接口测试,相对功能难一点,相比自动化简单一些
第三层:自动化测试,是属于中级软件测试的层次,可以定位高级测试
第四层:个人持续发展
自动化测试就是用脚本模拟手工测试过程的一种类型,用程序来测试程序的过程
概念中的第一个程序:
覆盖性特点:自动化测试可以实现手工测试无法完成的覆盖要求
时效性特点:在短时间内完成大量的工作、长时间的进行测试
重复性特点:对于重复性工作、简单的工作,交给自动化,测试工程师就可以做更加有价值的事情了
适用于回归测试阶段,目的是提高测试执行的效率。
自动化测试是为了发现更多新的bug嘛?能发现bug嘛?
系统持续迭代更新的时候适合使用自动化,但是需求频繁变更则不适用
uft(通用功能性测试),是cs、bs架构系统通用的自动化测试工具,现在属于microfocus公司,属于商业软件
selenium(硒),只支持bs架构的,是一种开源软件
公司自研软件:测试开发的一个方向
你上家公司是怎么做自动化测试的?自动化测试的流程是什么?你在自动化测试中参与了什么工作内容?
前提是项目需要开展自动化测试了(而是项目负责人或者BOSS认为需要开始做自动化了)
系统级测试完成之后的回归测试阶段介入自动化测试。(系统比较稳定、迭代的需求)
技术可行性分析:当前团队中的技术是否满足要求,需要采样分析。
需求分析:可以复用功能测试阶段的分析结果
测试计划:5w1h
自动化测试用例设计(模板和功能测试的有差别,但也不大),不是一成不变的,需要不断地维护(增加、修改、删除),版本管理。
自动化测试环境搭建:
自动化脚本开发:版本管理和脚本的合并
要求:无人值守的测试执行、输出可视化的报告(html格式)、邮件自动发送等
准备:异常处理(在测试用例的适当位置添加异常处理)、场景还原(每次执行脚本需要还原一次数据库)
输出一个可视化的报告即可
pdca质量环(戴明环)
把本轮测试的经验、教训进行汇总、分析、研讨、作为下一次执行经验使用
selenium简介
selenium是一个验收工具(回归测试工具,是运行在Chrome、firefox、edge、safari常见浏览器上的)
selenium最早版本是js开发的,慢慢地支持多种语言平台,python、java
selenium的版本
selenium1.0:selenium ide、selenium rc(rc:remote control远程控制,js脚本控制浏览器)、selenium grid
selenium2.0:selenium ide、selenium rc、selenium grid、webdriver(是Google的一个产品)
selenium4.0:selenium ide、selenium grid(分布式执行)、webdriver(是Google的一个产品)
selenium IDE
是火狐浏览器的一个插件,是可以直接录制自动化脚本、结合不同的开发语言导出脚本的工具
selenium ide是入门级自动化测试工程师、业务相关人员用的,适用于语言能力较差、不能自己写代码的。
安装ide插件
ide工具的基本使用
启动录制脚本,默认打开浏览器对应的baseurl地址
下面将在页面上进行业务操作了,代码会被录制下来,直到关闭浏览器。
回到selenium ide界面,停止录制
输入脚本名称,点击ok,就完成百度搜索的脚本录制了
查看录制的脚本
每一句代码都是由三部分组成的(关键字脚本开发):
运行脚本
调整下运行速度适中
通过关键字开发脚本
加上断言步骤
导出测试脚本
选中脚本名右侧三个点,弹出菜单选择export,选择Python pytest框架的脚本
导出后文件可以直接运行或者改造
katalon是和selenium ide类似的一个工具,可以导出python+unittest框架的代码
作为练习,自己做一下。
selenium客户端环境配置
我们选择的是python客户端,python语言下结合selenium实现脚本开发
selenium4=selenium ide+grid+webdriver
selenium是标准的C/S架构的系统:
html页面上的各种标签:
知道对象是什么了,如何去定位到这个对象
from selenium.webdriver.common.by import By
driver.find_element(By.xx,“yy”)
id属性定位
id是标签的唯一性属性(h5技术中的一个强制要求),而且要求每个标签都应该有id属性。
如果标签有id属性,定位元素的第一选择就是id属性定位。
driver.find_element(By.ID,“”)
name属性定位
h5未做强制的唯一性的要求,属性要求必须具备,可以作为第二选择。
find_element(By.NAME,””)
tag name标签名属性定位
在一个页面上相同标签名的标签会有很多,就很难做到唯一性定位元素了。
class名属性定位
把相同、相似功能标签,划分在同一个类中,一个类属性一定对应这个标签。
标签的文本信息定位
适用于超链接和按钮元素,
使用的定位方式是:xxxx< /a>
xpath定位
xml文件:现在主要是作为一些配置文件中使用
xpath:路径,是最早在xml文档中用于标签定位的一种语法,被html引入并使用
xpath其实就是一种根据html页面的结构树(DOM),通过标签所在的位置进行定位的一种技术
方式1:绝对路径表示法:从HTML根节点开始定位
/:表示根节点,父节点和子节点之间的连接符
[]:同名的兄弟节点关系,索引号是从1开始的,不写默认为1(出现的第一个同名节点)百度文本框的绝对路径:
方式2:相对路径结合属性定位
//:中间任意节点
表示一个id属性为kw的任意input标签://input[@id=”kw”]
表示一个name属性为wd的任意标签://*[@name=“wd”]
方式3:相对路径定位
//form[@id=“form”]/span/input
方式4:直接浏览器上复制
相对路径://*[@id=“su”]
绝对路径:/html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[2]/input
CSS select定位
css_selector:层叠样式选择器定位方法,定位的效率要比xpath要高、css的语法结构要比xpath更简洁
类选择器:**.**类名
id选择器:**#**id名
标签选择器:input input**.**aa input#bb
>:表示父子节点关系
+:表示同级别兄弟节点关系
[属性=“属性值”]:比较通用,[id=“id值”]
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
driver = webdriver.Chrome()
# 打开百度首页
driver.get("https://www.baidu.com")
# 通过标签结合类属性的css定位百度文本框并输入字符串
# driver.find_element(By.CSS_SELECTOR, 'input.s_ipt').send_keys('CSDN叫我王同学')
# driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('CSDN叫我王同学')
# driver.find_element(By.CSS_SELECTOR, 'form#form > span > input').send_keys('CSDN叫我王同学')
driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('CSDN叫我王同学')
time.sleep(2)
# 定位百度一下并点击
# driver.find_element(By.ID, 'su').click()
driver.find_element(By.CSS_SELECTOR, 'form#form>span+span>input').click()
time.sleep(2)
# 关闭浏览器对象
driver.quit()
定位器的选择方式
定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框)。
webdriver中最常用的几个方法:
clear():清除文本
send_keys(value):模拟按键输入,还可以输入组合键和功能键,可以用于上传文件(标签必须是input)
click():单击元素。例如按钮、超链接操作
current_url:返回当前页面的url地址
title:返回当前页面的title
text:获取页面(提示框、警告框)显示的文字
get_attribute(name):获得属性值,文本框中的值用value属性名
is_displayed():检查该元素是否用户可见
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 创建浏览器对象
driver=webdriver.Chrome()
# 打开百度首页
driver.get('https://www.baidu.com')
# 获取当前页面的url,并打印出来(driver.current_url)
cURL = driver.current_url
print(cURL)
# 获取当前页面的title,并打印出来(driver.title)
cTitle = driver.title
print(cTitle)
# 获取百度首页底部的链接文本信息:把百度设为主页关于百度About Baidu百度推广
cText=driver.find_element(By.CSS_SELECTOR,'#bottom-layer > div').text
print(cText)
# 百度“selenium”,点击百度一下
driver.find_element(By.ID,'kw').send_keys('selenium')
# 判断页面中的“百度一下”按钮是否正常显示,是则打印“正常显示按钮”
if(driver.find_element(By.ID,'su').is_displayed()):
driver.find_element(By.ID,'su').click()
print('正常显示按钮')
time.sleep(2)
# 获取文本框中的文字,并打印出来
# get_attribute():可以获取一个元素对象的属性的值,如果参数给value,则返回的是数据
cValue = driver.find_element(By.ID,'kw').get_attribute('value')
cId = driver.find_element(By.ID,'kw').get_attribute('id')
cName = driver.find_element(By.ID,'kw').get_attribute('name')
print(cValue)
print(cId)
print(cName)
# 清除百度文本框中内容
driver.find_element(By.ID,'kw').clear()
cValue1 = driver.find_element(By.ID,'kw').get_attribute('value')
print(cValue1)
time.sleep(2)
# 关闭浏览器
driver.close()
对浏览器的窗口的大小、浏览器的位置、前进、后退、刷新、截屏、关闭等操作。
窗口大小操作
窗口的位置操作:set_window_position(x,y)
前进:forward()
后退:back()
刷新:refresh()
截屏:save_screenshot()
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
driver = webdriver.Chrome()
# 可以调整浏览器窗口的大小和位置
# driver.set_window_size(500,500)
# 建议创建完driver对象之后,立马最大化、最小化显示
driver.maximize_window()
time.sleep(2)
# driver.minimize_window()
# time.sleep(5)
# 调整位置
# driver.set_window_position(500,500)
# 打开百度首页
driver.get("https://www.baidu.com")
driver.find_element(By.ID, 'kw').send_keys('CSDN叫我王同学')
driver.find_element(By.ID, 'su').click()
time.sleep(2)
# 先后退到百度首页
driver.back()
time.sleep(2)
# 再前进到搜索页
driver.forward()
time.sleep(2)
# 刷新下页面
driver.refresh()
time.sleep(2)
# 截图保存到本地
driver.save_screenshot(r'd:\aa.png')
# 关闭浏览器对象
driver.quit()
浏览器中多于一个窗口的时候就是多窗口,这时候如何操作不同窗口的页面元素的
# 百度首页,通过id属性定位百度文本框和百度一下按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
driver = webdriver.Chrome()
# 打开百度首页
driver.get("https://www.baidu.com")
# 点击新闻按钮
driver.find_element(By.LINK_TEXT, '新闻').click()
time.sleep(2)
# 查看当前窗口(只有一个)的句柄名
# current_window_handle
cHandle = driver.current_window_handle
print(cHandle)
# 3867737E15CEC331B212F81402762A39
cHandle1 = driver.current_window_handle
print(cHandle1)
# window_handles:返回所有窗口句柄的集合
handles = driver.window_handles
print(handles)
# driver对象能处理的窗口是第一个打开的哪个窗口,每个窗口其实是有名字的(句柄handle)
# 将driver对象切换给第二个窗口,进行操作
# switch_to.window(句柄名)
driver.switch_to.window(handles[1])
# 在此处截屏
time.sleep(4)
driver.save_screenshot(r'd:\bb.png')
driver.find_element(By.LINK_TEXT, '河北两座特高压变电站扩建工程同时开工').click()
time.sleep(2)
# 关闭浏览器对象
driver.quit()
鼠标和键盘操作都是应用在浏览器中,是webdriver中提供的使用方法。
主要是为了实现更丰富的交互,有鼠标点击、鼠标悬浮、鼠标右键、双击、拖动。
实现步骤:
案例1:鼠标的点击功能
# 使用鼠标的点击功能,点击百度首页的新闻按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')
# 封装要操作的对象
on_element = driver.find_element(By.LINK_TEXT, '新闻')
ActionChains(driver).click(on_element).perform()
time.sleep(3)
# 关闭浏览器
driver.close()
案例2:鼠标的悬浮功能
# 使用鼠标的悬浮功能,将鼠标悬浮在百度首页的设置按钮上
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')
# 封装要操作的对象
to_element = driver.find_element(By.ID, 's-usersetting-top')
ActionChains(driver).move_to_element(to_element).perform()
time.sleep(3)
driver.find_element(By.LINK_TEXT, '搜索设置').click()
time.sleep(3)
# 关闭浏览器
driver.close()
案例3:鼠标的拖拽功能
# 使用鼠标的拖拽功能,鼠标将一个元素拖拽到另一个原宿舍
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('xxx')
# 拖拽方法功能
source = driver.find_element(By.ID, 'xxx')
targe = driver.find_element(By.ID, 'xxx')
# ActionChains(driver).drag_and_drop(source,targe).perform()
ActionChains(driver).drag_and_drop_by_offset(source, 270, 200).perform()
time.sleep(3)
# 关闭浏览器
# driver.quit()
driver.close()
在webdriver中有keys模块(Keys类),定义大量类变量,每个变量表示一个键盘按键
都是采用**send_keys()**来键入键盘上的按键,可以单个字符键,也可以是组合键和功能键。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入键盘操作的模块
from selenium.webdriver.common.keys import Keys
import time
# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')
# 键盘事件案例:
# 1、百度“selenium”
driver.find_element(By.ID, 'kw').send_keys('seleniumm')
time.sleep(1)
# 2、删除多输入的m
driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE)
time.sleep(1)
# 3、再输入“空格 教程”
driver.find_element(By.ID, 'kw').send_keys(Keys.SPACE)
time.sleep(1)
driver.find_element(By.ID, 'kw').send_keys('教程')
time.sleep(1)
# 4、ctrl+a,全选文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)
# 5、ctrl+x,剪切文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'x')
time.sleep(1)
# 6、ctrl+v,粘贴文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'v')
time.sleep(1)
# 7、回车代替单击,完成搜索
driver.find_element(By.ID, 'kw').send_keys(Keys.ENTER)
time.sleep(3)
# 8、退出浏览器
driver.quit()
浏览器中的弹框,基本都是JavaScript处理的,常见的有三类:
对于软件测试来说,处理方式都一样(这些弹框不能被页面元素定位):
需要将driver切换给弹框:driver.switch_to.alert
对弹窗的处理方式:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')
# 封装要操作的对象
to_element = driver.find_element(By.ID, 's-usersetting-top')
ActionChains(driver).move_to_element(to_element).perform()
time.sleep(3)
driver.find_element(By.LINK_TEXT, '搜索设置').click()
time.sleep(3)
# 修改设置
driver.find_element(By.ID, 's1_2').click()
time.sleep(2)
# 保存设置
driver.find_element(By.LINK_TEXT, '保存设置').click()
time.sleep(2)
# 先获取警告框上的文本,再点警告框的确认按钮
# driver对象切到警告框
a = driver.switch_to.alert
# 获取文本
textS = a.text
print(textS)
# 点击确定按钮
a.accept()
time.sleep(2)
# 关闭浏览器
driver.quit()
frame/iframe是h5中的一个标签,可以实现页面的嵌套,如果想操作嵌套页面就需要切换:driver.switch_to.frame()
三种切换方式:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.qq.com')
# 基本版按钮是属于外层页面的,直接可以操作
# 想要操作密码登录按钮,需要往里切两层
# 方式1:参数是frame标签对象
element = driver.find_element(By.CSS_SELECTOR, '#QQMailSdkTool_login_loginBox_qq > iframe')
driver.switch_to.frame(element)
# 方式2:再进入第三层,参数可以为name属性值
driver.switch_to.frame('ptlogin_iframe')
# 切换完成之后,就可以点击第三层的页面元素了
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(5)
# 此处点不了基本版超链接,需要再切出去
# 一层层往外切
# driver.switch_to.parent_frame()
# driver.switch_to.parent_frame()
# 一次性切出
driver.switch_to.default_content()
driver.find_element(By.LINK_TEXT, '基本版').click()
time.sleep(5)
driver.quit()
主要是解决由于网络加载慢、中间页面跳转或者异步加载情况下,页面元素定位不到的问题
是一种代码暂停运行的技术
time.sleep(2)
对整个页面中的所有元素有效,用到哪个元素都可以按照隐式等待时间进行等待。
好处:定义20s隐式等待,页面10s就加载完了,等10s;2s就加载完了等2s;25s还没加载完,就抛出超时异常
建议:定义完driver对象之后,最大化显示,再加上该隐式等待
# 创建浏览器对象
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 加入隐式等待的方法
self.driver.implicitly_wait(10)
针对页面上某一个特定的元素的等待。
WebdriverWait(driver,超时时间,刷新频率).util(条件)