自动化测试是一种机器测试,能一定程度减轻测试人员的测试负担,以此来提高软件的测试质量。
自动化测试主要用于回归测试(测试新版本和旧版本功能,使旧版本兼容新版本),使其不因代码或功能的改变而影响用户体验。
测试分类
1. web前端:包括界面的所有元素(字体,颜色,边框.....)和接口(请求参数,请求体,响应内容,状态码...)
2.客户端:同样包括界面和接口
测试投入
测试投入指的是我们在测试中不同类型所投入的时间与收获比
一般来说,单元测试 > 接口测试 > ui自动化测试 > 手工/探索性测试
单元测试一般是程序员进行,而后者则是测试人员。
驱动工具webdriver
- 我们知道,鼠标可以通过驱动程序实现屏幕交互,而我们的自动化测试同样需要工具来对网页的各种元素进行鼠标类似鼠标点点点的操作。selenium恰好提供了这一功能。
- 不同版本不同浏览器需要对应的驱动工具(webdriver),浏览器是会更新的,每次单独下载驱动工具费时费力,而通过selenium里的webdriver-manager工具包即可管理驱动。
在pycharm下载好这两个包后即可开始了:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import ServiceChromeIns = ChromeDriverManager().install()#安装驱动
driver = webdriver.Chrome(service=Service(ChromeIns))#创建驱动浏览器实例
driver.get("http://baidu.com")#请求打开网站
driver.quit()#退出浏览器
接下来我们要通过百度搜索框输入内容并点击搜索按钮,通过css方法可以定位到元素
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪迦")#找到搜索栏并输入数据
time.sleep(2)
driver.find_element(By.CSS_SELECTOR,"#su").click() #click按钮
#也可以接收返回值.click()
time.sleep(2)
查找多个元素
查找元素方式:选择器,xpath,id,classname
在控制台输入ctrl+F键可以找到下方有十条相同类型的信息,我们可以使用 find_elements来查找
注意查找方式中存在单个\时要注意转义,否则查找不到元素。(是\而不是/)
xpath定位元素
有的时候直接复制元素类型不能解决问题,需要手动定位标签和子标签
//* 获取页面中所有节点
//*[@id="kw"] 找到百度输入框元素,同理,可以通过id找到其他元素
方法
1.send_keys :[拼接元素](如果 在当前输入框重复输入则向后拼接元素)
2.clear: 清空输入的元素
3.text : 打印文本信息
4.get_attribute :获取属性值
在前端页面中有些文本不是以txt类型出现在代码中的,而是已【key = keyvalue】的格式,这类文字属性不能直接通过text方法获得,必须通过get_attribute进行打印
在页面中我们无法定位网页的标题和url,可以通过 5.title 和 6.current_url方法获取
7.有时候我们点击按钮会增加并跳转到一个新标签页,此时driver对象指向的仍是原标签页,如果想在新标签页获取数据必须切换窗口(如果跳转后没有增加新标签,则无需切换)一般时候我们可以通过修改get请求来更换网址,很少用到两个网址间的切换。
cur = driver.current_window_handle#当前标签句柄
allHandle = driver.window_handles#所有句柄
for handle in allHandle:if handle != cur:driver.switch_to.window(handle)#切换标签
注意暂停时间,否则会出现程序执行速度大于页面渲染速度导致仍然显示原标题。
8.窗口大小设置(了解即可)
9.屏幕截图 driver.save_screenshot
strftime:文件名不能包含空格,用来格式化日期。
10.driver.close 关闭当前句柄所在的窗口 关闭窗口后如果想使用driver对象必须切换窗口句柄。
弹窗
弹窗是页面无法定位的元素,包括确认弹窗,警告弹窗和提示弹窗。所以当弹窗出现后我们需要定位弹窗的位置
driver.find_element(...).click()#唤起弹窗alert = driver.switch_to.alert#切换弹窗
alert.click()#提示窗口输入
alert.dismiss()#取消弹窗
alert.accept()#确认弹窗
- 警告弹窗只有确认按钮,所以通过dismiss或accept都可关闭弹窗。
- 提示弹窗可以输入文本,输入后若点击取消不会发生任何事
隐式等待
driver.implicit_wait()
隐式等待能很好解决渲染与程序执行速度不匹配的问题 ,作用于全局,只用设置一次。在规定时间内查找元素【只能用于查找元素】直到规定的时间没找到后报错。
显式等待
指定某个对象等待,并提供expected_conditions在规定时间内执行对应条件,满足则执行后续代码。相比于隐式等待可以判断的条件更全面灵活,也更为复杂,例如在查找弹窗时可以用显式等待。
注:显式等待不要和隐式等待一起使用,会有不可预知的结果
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWaitdriver.find_element(By.CSS_SELECTOR,"#tooltip").click()#弹窗
wait = WebDriverWait(driver,2)
wait.until(EC.alert_is_present())
visibility/invisibility:元素是否可见
页面功能元素
driver.back()#前进
driver.forward()#后退
driver.refresh()#刷新
上传文件
这里选择文件虽然是个按钮,但是弹窗确是系统的,无法对此进行send_keys操作,所以这里直接对"选择文件“进行send_keys操作。
注意路径的写法:c:\\text 注意包含文件名
无头模式&有头模式
无头的意思就是让浏览器在后台运行而不显示可视化界面,有头模式则正好相反,用户可以看到界面和窗口的操作过程。默认是在有头模式下进行的。
#安装驱动
ChromeIns = ChromeDriverManager().install()
#浏览器参数设置
options = webdriver.ChromeOptions()
#设置无头模式
options.add_argument('headless')
#添加options,创建驱动
driver = webdriver.Chrome(service=Service(ChromeIns),options=options)
页面加载策略