web端的自动化测试,基本就是模拟手工测试人员做功能测试。用脚本的自动执行代替人的操作。
基于用户登录的自动化测试思路:使用python+selenium+pytest框架来编写登录的所有测试用例,使用PO模式实现数据和代码分层,使用allure测试报告,并使用邮件和钉钉告知项目组的相关人员。
web端呈现的产品有2个方向可以做自动化测试:接口层和界面层,且接口层自动化的比例要高于界面层。
界面层主要对产品稳定的功能进行自动化测试,主要用于产品的核心功能冒烟测试、回归测试。从系统最核心的功能开始做,再根据情况慢慢铺开。
Web自动化测试是从UI(用户界面)层面进行的自动化测试,测试人员通过编程自动化程序(测试用例脚本)来打开浏览器测试网站的业务逻辑。
Selenium是一个开源的web自动化测试框架,支持多种编程语言开发自动化测试脚本,支持跨浏览器平台进行测试
WebDriver
ChromeDriver
WebElement
WebDriverWait
FirefoxDriver
findElement():查找一个页面元素,只会返回一个WebElement对象
findElements():查找页面上所有符合匹配的元素,返回元素集合。
可以使用submit方法,前提是input元素的type为submit
1、保证网络畅通
2、浏览器不卡
3、最好使用独立的测试环境,防止数据被使用
4、最好使用独立的测试账号,防止数据被其他人占用
5、提前准备好测试数据
6、使用显性等待+隐形等待
7、采用xpath相对定位表达式,尽量不要使用动态定位方式
8、可以是一些主流程、比较频繁的测试用例
9、减少不必要的操作
10、使用多线程实现并发执行测试用例
11、减少不必要的操作,例如经过三四步才能打开我们要测试的页面的话,直接通过网址打开。
可以使用元素的 is_selected() 方法,如果返回的是true则说明被选择,否则表明未选中。
获取alert弹窗:alert=driver.switch_to.alert
获取alert弹窗上的文本:alert.text
alert弹窗文本输入:alert.send_keys()
取消弹窗:alert.dismiss()
确认弹窗:alert.accept()
driver.quit():关闭整个浏览器
driver.close():关闭当前正在操作的窗口
与windows窗口进行交互。采用pywinauto
def switch_frame(frame_el):
driver.switch_to.frame(frame_el)
el=driver.find_element_by_xpath('//input[@id="kw"]')
el.input('kobe')
frame_el=driver.find_element_by_xpath('//iframe[@name="baidu"]')
switch_frame(frame_el)
iframe切换回主页面和父级iframe
driver.switch_to.default_content()
在一个iframe中,如果还嵌套了另一个iframe-------了解
进入:一个一个的进,先进第一层的iframe,一层一层的进
如果出呢:一层一层的出
以百度浏览器测试:
search_window=driver.current_window_handle
driver.find_element_by_xpath('//a[text()="hao123"]').click()
time.sleep(2)
all_handles=driver.window_handles
for handle in all_handles:
if handle!=search_window:
driver.switch_to.window(handle)
driver.find_element_by_xpath('//a[text()="网易"]').click()
driver.switch_to.window(search_window)
先修改关闭readonly属性,然后再操作元素。
action=ActionChains(driver)
action.context_click(元素对象).perform()
driver.save_screenshot(图片路径)
通过捕获异常去截图
web 自动化测试数据需要的前置数据实现方式有很多,大体的原则就是尽量减少成本和复杂度。实际操作可以根据实现的难易程度采取以下措施:
1、手工提前准备好测试数据,比如登录过程中需要用到的测试账号。这种情况适合在自动化运行过程中不需要频繁修改的数据。
2、调用接口得到。当通过页面进行操作从而得到数据的成本比较高时,可以通过调用对应的接口得到数据。
3、直接操作数据库得到。如果调用接口不方便,也可以通过直接操作数据库的方式获取。
selenium是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器。
selenium client 与浏览器驱动之间,走的是http通信协议,定义了一套json格式的webdriver通信协议。
前后端联调完成,做接口自动化测试
目的:防止后端的一个bug给前端带来多个bug,提高系统的稳定性、安全性、健壮性。
功能测试完成,产品稳定后,可以实施UI自动化测试,用于回归测试,提审效率,解放测试人员
区别:
1、appium是用来实现移动端app的自动化测试,selenium是实现web网页自动化测试。
关系:
1、appium并没有重新造轮子,直接延用了selenium的底层通信协议标准,并在它的基础上增加了移动端自动化通信协议。
2、在代码层,继承了selenium中的webdriver
3、在元素定位上继承了selenium的定位类,并在它的基础上添加移动端的定位方法。
1、测试环境,最好使用独立的测试环境,避免环境出错、或者数据丢失
2、网络,流畅的网络是操作更畅通,网络问题导致脚本报错
3、浏览器或者电脑卡顿,卡顿导致脚本报错
4、元素定位方式,使用xpath元素相对定位最好,不使用元素的动态表达式。
5、显性等待、隐形等待结合使用,提升效率。
1、元素定位表达式错误
2、不在指定的frame
3、没有加入显性等待和隐形等待
4、该元素是动态变化的
5、可能识别了元素,但是不能操作,比如不可用、不可写等。需要使用js先把前置的操作完成
6、不在指定的窗口中
数据层与代码层分离
业务逻辑与测试逻辑层分离
公共方法与业务方法分离
元素定位表达式和业务方法分离
css更加简洁,xpath相对会复杂一点
css解析速度更快
xpath支持的函数更多,功能更强大
css不支持text文本定位
find_element_by_xpath
find_element_by_id
find_element_by_name
find_element_by_class
find_element_by_tag_name
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_css_selector
同问:ui自动化测试有那些可以优化的地方?
1、将web自动化的用例分成若干个任务,使用多线程去执行,可以大大的减少运行时间。前提是,用例之间没有关联关系。
2、优化定位表达式,能使用css定位表达的尽量使用css,css元素定位的效率比xpath更快。
1、总结引起用例失败的原因,可能是测试环境的问题、测试数据的问题
2、采用xpath的相对定位表达式,定位表达式不选择动态元素
3、采用显性等待、隐形等待
4、保证网络不卡、浏览器不卡
5、最好是在一个独立的测试环境中,避免出现环境出现问题
6、最好是独立的测试账号,避免数据出现问题
7、不要选择太复杂的测试逻辑,按照用户的正常操作去操作一个业务即可。
8、多线程执行用例的时候,减少用例的耦合度
9、多用try捕获,处理异常
10、测试数据、测试用例问题。
可以优化代码中的造数据方式,改成接口或者数据库等方式,快速稳定的造数据。
考察的是自动化当中,数据准备和数据清理。
在每次自动化的前置当中,重新创建一个用户账号,用这个新账号去购买商品
在自动化执行完成之后的后置当中,根据系统逻辑去删除当前用户的购买记录,恢复到自动化执行之前的状态。
app自动化,主要是使用了appium开源库,pytest测试框架,allure测试报告搭建的自动化框架,对app页面通用的操作封装成了basepage,加入了日志记录用例执行过程,和失败截图的功能。
跨平台
跨语言
开源
劣势:
反应较慢
1、元素等位表达式,针对经常变化的元素
2、自动化测试是否稳定运行
每个页面为一个类,属性为页面元素定位表达式,方法为类的函数
可以利用javaScript去修改当前元素的背景颜色来达到高亮的效果
冒烟测试和回归测试
回归测试主要是写一些功能稳定、容易实现的场景,节约测试时间
比如从打开浏览器操作一个完整业务,到关闭浏览器。
或者是比较繁琐的用例
核心业务的自动化覆盖率:100%
Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才能定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的
1、利用PO模式,将测试逻辑和业务逻辑分离
2、独立维护元素定位方式,把元素定位方式和页面操作隔离
a、通过text文本查找
def select(el):
s=Select(el) #初始化Select对象
s.select_by_visible_text('kobe')
el=driver.find_element_by_xpath('//select[@id="faver"]')
b、通过value值查找
def select(el):
s=Select(el)
s.select_by_value('double')
el=driver.find_element_by_xpath('//select[@id="faver"]')
alert切换
窗口切换
iframe切换
方法一:
使用find_element,如果元素存在,不会触发异常;如果元素不存在,会触发异常。
方法二:
使用find_elements,该方法返回一个列表。判断长度,如果列表长度等于0,则没有找到元素;如果列表长度大于0,则表示元素存在。
移动端:
权限、安装运行卸载、UI、功能、性能、中断、兼容性、安全性、回归、升级更新、用户体验
服务端:
接口测试、性能测试、安全测试、兼容性测试
PageObject是页面对象,是ui自动化中一种设计模式,一般称为po模式,简单来说就是将页面封装成类,定义页面属性,功能。在测试代码中调用它,从而达到测试逻辑和页面逻辑解耦的效果,提高代码复用性,扩展性,便于维护。
action=ActionChains(driver)
action.move_to_element(el)
action.perform()
在实际测试过程中都会用到
1、不能完全取代手工测试,或者代价太大
2、提高效率会影响稳定性
selenium无法操作隐藏元素,但是能正常定位到,selenium也能提供了一个入口可以执行js脚本。
比如在python语言中,就是通过execute_script(js语句,参数)来执行js语句的。
js查找html元素常用的方法:
1、通过id查找html元素:document.getElementById(“id”);
2、通过标签查找html元素:document.getElementByTagName(“tagname”);
driver.back()
driver.forward()
driver.current_url
el=driver.find_element_by_xpath(元素定位表达式)
el.get_attribute(“value”)
el=driver.find_element_by_xpath(元素定位表达式)
el.clear()
driver.get(‘url’)
Selenium是没有关于测试用例和测试套件管理和执行的模块。我们需要借助第三方单元测试框架来实现用例管理和用例的执行。例如Java中有Junit或者testNG,Python中有unittest单元测试框架。
没有,这里需要第三方工具,openpyxl
selenium IDE:IDE只支持安装在火狐上的一个插件,支持录制自动化脚本
selenium webdriver:使用编程语言和webdriver编写自动化测试用例
selenium grid:分布式执行自动化脚本
1、处理基于web的软件,selenium不支持桌面软件自动化测试
2、软件测试报告,和用例管理只能依赖于第三方插件,例如unittest、pytest
3、selenium入门门槛可能比较高,需要具备一定编程语言基础才能玩转
NoSuchElementException:没有该元素
TimeoutException:超时异常
ElementNotVisibleException:元素不可见异常
NoSuchAttributeException:没有这样的属性异常
NoSuchFrameException:没有iframe中
我可以使用隐式等待。
driver.implicitly_wait(秒);
如果执行驱动程序没有立即在页面中找到元素,它将自动等待,在指定的秒内找到元素了就自动往下执行。此代码将自动附加到脚本的每一行。每次都不需要写,打开浏览器后只需要编写一次。
方法一:用try…except…
方法二:用elements定义一组元素方法,判断元素市场存在,存在返回True,不存在返回False
1、声明driver对象(也就是你将要启动什么浏览器)
2、driver去打开浏览器,并输入你要测试的网页地址
3、找到你要操作的元素
4、对元素进行输入、点击、断言
5、关闭浏览器,释放资源
1、使用四种分层思想
即:业务逻辑和测试逻辑分离(po模式)
测试数据和测试脚本分离
业务方法和公共方法分离
业务方法和元素定位表达式分离
2、采用xpath的相对方法定位元素
3、采用显性等待加隐形等待的方式,提升效率
4、采用截图save_screeshop()方法,方便排除错误
5、采用allure报告,形象查看测试用例执行结果
6、采用钉钉+邮件的方式输出测试报告,方便其他人读取
7、采用主流程、核心业务、也可以是比较繁琐的操作进行脚本设计
8、最优先安装用户的操作从打开一个浏览器到操作一个完整的业务再到关闭浏览器,进行脚本设计。
9、减少用例的耦合度
10、减少不必要的操作,例如提前准备好数据,避免在脚本中调接口插件数据,影响脚本的稳定性
11、采用日志,如有报错,可以在日志中获取报错结果
12、如果用例之间没有关联,可以使用多线程进行执行用例
1、可以利用分布式的技术,将自动化分布在多台设备上同时执行;
2、检查代码中可以优化的部分,比如是否可以智能等待
3、有些前后置是否可以用接口或者数据操作去完成
1、采用xpath的相对定位表达式
2、采用显性等待和隐形等待相结合的方式
3、保证网络的稳定
4、保证浏览器不要卡顿
5、需要在指定的frame和窗口中
6、需要在指定窗口句柄中
7、在对元素操作之前,比如click,如果该元素未display (非hidden),就需要先滚动到该元素,然后进行click操作;
8、被点击的元素一定要占一定的空间,因为selenium默认会去点击元素的中心点,不占空间的元素计算不出中心点;
9、被点击元素不能被其它元素遮挡;
10、判断元素是否可以被点击。
隐藏的元素通常会使用hidden属性或者通过css控制display=none等实现。这些元素在selenium中通常是不能直接定位的,只有当他们能在界面中可见时,才能被定位。
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
title=driver.title
if title == '百度一下,你就知道':
print('success')
else:
print('fail')
driver.quit()
断言:测试将会在检查失败的时候停止,并不运行后续的检查。
可以直接了当的看到检查是否通过。缺点:校验失败后,后续检查不会执行。
验证:将不会终止测试。
DOM是文档对象模型,是操作页面的各种元素的一套接口,是一颗DOM树。
在DOM中,每一个元素看成一个节点,而每一个节点就是一个对象,也就是我们在操作元素时,把每一个元素节点看成一个对象,然后使用这个对象的属性和方法进行相关操作。
首先触发动态事件,让元素加载出来,然后再进行定位
1、提前进入项目,先熟悉需求,把不懂的地方标出来
2、测试用例的覆盖率,必须保证需求的100%覆盖
3、不同的测试类型的结合,功能,性能,兼容性等,增加测试覆盖面,确保测试质量
4、提前思考会影响到那些功能模块,能影响到的模块进行接口和UI自动化测试
5、接口测试用例准备精细,因为后端的一个bug可能会影响到前端n多个bug
6、上线前的回归测试、交叉测试
7、上线后的线上测试
8、利用UI自动化测试跑下主业务流程、以及按用户的操作来说,从登录开始到操作完一个业务,到最后的关闭页面整个流程跑自动化,让更多的人参与到逻辑比较复杂的业务中。
1、确定元素表达式是否正确,采用xpath相对定位的表达式
2、元素是否在指定的frame中,切换到指定的frame
3、元素是动态变化的,避开动态元素定位方法,是在哪不行采用多个表达式,if条件判断,总会有一个符合要求