自动化测试:自动化测试是把以人为驱动的测试行为转化成机器执行的一种过程,通常在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较,再此过程中,为了节省人力,时间或硬件资源,提高测试效率,便引用了自动化测试的概念Selenium:是一套代码库,提供了各种驱动浏览器的方法,利用 python+selenium 结合。实现驱动浏览器代替我们手工测试,实现机器自己执行测试的功能Selenium 是属于 web 自动化也叫 ui 自动化,也叫功能自动化,只能驱动 pc 端的项目,不能驱动 app
元素定位:
元素定位是自动化测试的核心,想要操作一个元素,首先应该识别这个元素
Webdriver 提供了一系列的元素定位方法,常见的定位方法有以下几种
Find_element_by_id(‘属性值’)#利用 id 属性定位
Find_element_by_class_name()#利用 class,name 属性定位
Find_element_by_link_text()#利用连接名称定位
Find_element_by_partial_link_text()#利用部分链接名称定位
Find_element_by_name()#利用 name 属性定位
Find_element_by_tag_name()#利用标签名定位
Find_element_by_xpath()#利用标签路径定位
Find_element_by_css_selector()#利用 css 元素定位
元素操作:
Driver.find_element_by_id(‘’).click()#点击
Driver.find_element_by_id(‘’).send_keys(‘输入值’)#输入
Driver.find_element_by_id(‘’).clear()#清除内容
Driver.refresh()#刷新页面Driver.forward()#页面前进
Driver.back()#页面后退
Driver.quit():退出当前页面
Xpath 的绝对路径定位:
从 html 标签开始一级一级往下查找目标节点
#xpath 相对路径定位
相对路径使用方法:你可以不用 html 开始往下写路径,先找到一个可以确定的标签,从确
定的节点开始找你的目标路径
查找相对路径的下级目录:
//*[@id=’id 属性值’]/路径
定位 id
Driver.find_element_by_xpath(‘//*[@id=’id 属性值’]/路径’).click()
查找相对路径的上级目录
//*[@属性名=’属性值’]/../
查找相对路径的兄弟目录
//*[@属性名=’属性值’]/../div[1]
Css 定位
#根据 id 定位
Driver.find_element_by_css_selector(‘#id 值’).send_keys(‘值’)
#根据 class 定位
Driver.find_element_by_css_selector(‘.class 值’).send_keys(‘值’)
#通过属性来定位
Driver.find_element_by_css_selector(‘[属性=”属性值”]’).send_keys(‘值’)
自动化的测试流程:
针对项目流程设计测试用例(主要针对主流程的正向用例)编写测试脚本(把用例转化成自动化脚本)
导入测试框架(可以批量执行脚本)
生成测试报告(脚本自动生成报告)
鼠标悬停:
From selenium.webdriver.common.action_chains import ActionChains
#先导入模拟鼠标操作
变量=driver.find_element_by_link_text(‘属性值’)
#定位鼠标需要悬停的位置
ActionChains(浏览器驱动).move_to_element(变量).perform()
#模拟鼠标悬停
操作浏览器滚动条
变量=’window.scrollto(左右,上下)’
#控制滚动条位置
浏览器驱动.execute_script(变量)
#让你的滚动条跳转到指定位置
浏览器窗口最大化
浏览器驱动.maximize_window()
浏览器窗口设置指定大小
浏览器驱动.set_window_size(高度,宽度)
获取元素文本:
变量=标签定位语句
变量.text
例句:a=driver.find_element_by_id(‘xxx’)
Return a.text #抛出标签内容语法获取属性值:
变量=标签定位语句 #定位需要获取属性的标签
变量=变量.get_attribute(‘属性名’) #获取想要的属性值,赋给变量
get_attribute(属性):
例句:a=driver.find_element_by_id(‘xxx’) #把需要获取属性的标签赋给变量
B=A.get_attribute(‘属性名’) #输出标签的 name 属性
下拉菜单元素定位:
From selenium.webdriver.support.ui import Select
#导入下拉框定位方法 Select(S 要大写)
变量名=Select(driver.find_element_by_id(‘属性值’))
#定位选项框 Select(s 要大写)
s.select_by_values(‘values 值’) #选择 values=’20’的项:通过 values 属性定位
s.select_by_index(索引值) #选择第一项选项:通过选项的顺序选择,第一个为 0
s.select_by_visible_text(‘选项名’) #根据选项名称定位
下拉框的标签是<select>标签
Frame 嵌套页面元素定位
当你定位元素,各种语法都正确,就是定位不到元素时,可以考虑他是不是 frame 嵌套页面
在 F12(开发者选项中)搜索 iframe 标签,如果你要定位的内容在 iframe 标签内,那么就说
明你要定位的内容是嵌套页面
语法:
变量=driver.find_element_by_id(xx)
#定位 frame 嵌套页面
浏览器驱动.switch_to.frame(变量)
#进入嵌套页面
浏览器驱动.switch_to.default_content()#退出嵌套页面
页面等待:
1,强制等待:sleep(),不建议使用这种等待方式,太死板,严重影响程序执行的速度,
一般在调试脚本时使用
2,隐性等待:implicitly_wait()隐性等待对整个 driver 的周期都起作
用,所以只需要设置一次即可 driver.implicitly_wait()
3,显性等待:只等待一个元素,等到元素加载出来后,脚本才会运行,元素出来的早,脚
本运行的早,元素出来的晚,脚本就会等元素出来后在运行
使用显性等待需要先导入模块:
From selenium.webdriver.support import expected_conditions as EC
#判断元素是否存在
From selenium.webdriver.support.wait import WebDriverWait
#导入显性等待
From selenium.webdriver.common.by import By
#导入 BY 操作元素方法
WebDriverWait ( 浏 览 器 驱 动 , 最 长 等 待 时 间 , 刷 新 间 隔 ) .until
(EC.visibility_of_element_located((By.ID,’属性值’)))
by.定位法包括:By.ID By.XPATHBy.CSS_SELECTOR 等(id xpath 等。需要大写)
页面切换:当你的软件会打开新的页面时,你需要切换页面才能定位新窗口的内容
变量=driver.window_handles
#获取所有窗口句柄,获取到句柄组
driver.switch_to.window(变量[索引])
#切换到当前最新打开的窗口
页面截图:当你需要保留截图的时候,即可增加页面截图
driver.get_screenshot_as_file(filename):截取当前窗口
实例:driver.get_screenshot_as_file(‘d:\\aa\\bb\\xxx.jpg’)
你可以在脚本最后增加截图,保留测试结果
上传文件
就是在你需要上传文件的地方,利用 send_key()方法,写入文件所在路径实现上传功能
driver.find_element_by_css_selector(上传的文件的元素).send_keys(文件路径)
警告弹窗处理
先使用 driver.switch_to.alert 切换到警告弹窗上面(注意,有时候切换前需要加个等待)
accept()方法相当于点击确定
dismiss()相当于取消
send_keys()相当于在弹窗上的输入框输入文本
当你碰到页面弹出窗口,且窗口定位不到时,那么窗口一般就是警告弹窗
代码:
a=driver.switch_to.alert #切换 alert
a.send_keys(‘值’) #在弹窗的输入框中输入文本内容
a.accept() #确认,相当于点击确认按钮
a.dismiss() #取消,相当于点击取消按钮
unittest 三大功能:
testcase,此模块的作用是将用户导入的脚本转化成一个又一个测试用例
testsuite:此模块的作用是将转化后的用例,增加至同一测试组内
texttestrunner:此模块的作用是运行脚本,通过运行测试组,来实现批量执行测试用例
unittest 案例:
from 脚本模块 import 脚本
import unittest #导入 unittest 单元测试框架
class 用例类名(unittest.TestCase):
创建类,继承 testcase 的方法,用于把脚本转化成用例
def 用例名(self):
a=脚本类名()
a.脚本函数名()
if __name__==’__main__’: #if 下的代码只有在当前页面会运行
变量 1=unittest.TestSuite() #获取测试组
变量 1.addTest(用例类名(‘用例名’))#把测试用例增加至测试组中
变量 2=unittest.TextTestRunner()#继承运行模块
变量 2.run(变量 1)#运行测试组
setUp 函数:写在 setUp 下面的代码,会在每个用例执行前执行一次
tearDown:下载 tearDown 下的代码,会在每个用例执行后执行一次
断言:你可以提前让脚本抛出可以证明运行成功的值,在 unittest 的用例下增加断言如果实
际结果抛出的值和我们添加的预期结果符合判断,那么就证明脚本运行成功,否则就证明脚
本运行出错
self.assertEqual(值 1,值 2)#验证值 1=值 2,不等于则 fail
self.assertNotEqual(值 1,值 2)#验证值 1!=值 2,相等则 fail
self.assertIn(值 1,值 2)#值 1 包含在值 2 中
self.assertNotIn(值 1,值 2)#值 1 不包含在值 2 中
当你需要把写脚本,转化用例,生成测试报告一起编写的自动化脚本的过程,也就是自动化
完整的测试流程
第一步:首先根据需求设计回归用例(主要针对主功能进行正向用例设计)
第二步:根据设计的用例利用各种元素定位方法编写脚本,在编写脚本时,要让脚本抛出可
以证明运行成功的证明,如页面文本或指定属性,如有必要还要保留截图,且需要优化脚本,
把强制等待换成显性等待
第三步:把你写的脚本转入到 unittest 的 testcase 框架下,转化成测试用例,且每个用例下
增加响应断言用于判断执行结果
第四步:导入测试报告,创建空测试报告,把转换后的用例增加到测试组内,运行测试组且
把运行结果写进测试报告内,运行完毕后,直接去查看测试报告的结果即可,因为提前增加
了断言所以查看报告时也只需要重点关注报错的信息即可
在编写脚本,保存文件时,需要分开保存
创建文件夹:用于保存脚本
在额外创建文件夹:保存报告
在额外创建文件夹:保存截图