一、自动化测试概念
1、概念
java:TestNg
python:unittest pytest
2、自动化测试可行性
- 测试目的明确,需求不会频繁的变更
- 对于项目的自动化测试,要看项目的具体情况
- 一个产品需要在多个环境下部署
- 对于web GUI测试,需要测试用例在不同的浏览器上进行兼容性测试
- 移动端测试,同样的测试用例需要在多个不同的android和ios执行
- 对于一些企业级软件,不同的企业他需要按照对应的行业领域做定制化,但是各个定制版本的主题功能绝大多数是一致的,只是个别功能有轻微的差异
- 测试人员具备一定编程能力
二、selenium核心原理与机制
1、代码分析
需求:
(1)打开Chrome浏览器,在地址栏中输入百度的网址。
(2)在搜索输入框中输入关键词“自动化测试”并按Enter键。
(3)验证搜索结果页面的标题是否是“自动化测试_百度搜索”。
注意:把dirver放到本地的文件夹后,一定要配置到环境变量中
2、Selenium 1. 0的工作原理
Selenium 1. 0,又称SeleniumRC, 其中RC是Remote Control的缩写
Selenium RC服务器主要包括Seleniumcore,http proxy和 launcher三部分
- selenium core,是被注入浏览器页面中的js函数集合,用来实现界面元素的识别和操作
- HTTP Proxy,作为代理服务器修改js的源,以达到“欺骗”被测站点的目的
- Launcher,用来在启动测试浏览器时完成Selenium core的注入和浏览器代理的设置
3、Selenium 2. 0的工作原理
4、Selenium 3. 0的工作原理 2016
- 3. 0版本的API向下兼容2. 0
- JDK 环境需要升级到JDK 1.8或者以上。
- 移除了1. 0版本的RC,也就是说,Selenium 1. 0不再得到官方的支持。
- (2. 0版本的Firefox(不需要单独下载驱动)3. 0官方提供了一个geckodriver,具体用法类似于 ChromeDriver.
- 官方开始支持微软的(Edge)浏览器,但是需要下载对应的 Driver(Microsoft Web Driver.exe).
- 官方支持的最低版本为(IE9)
三、selenium安装
1、Selenium WebDriver
客户端API接口,测试人员通过调用这些接口(WebDriver源码),来访问浏览器驱动,浏览器驱动再访问浏览器
2、Selenium IDE
官网地址:https://www.selenium.dev/
Selenium IDE是一个浏览器插件,支持chrome浏览器和Firefox浏览器,可以将手动测试过程记录下来,并生成自动化测试脚本,可以实现回放。
使用方法
作用:以录屏的方式帮助异地开发重现bug
3、Selenim Grid
1)可以解决什么问题?
- 当web应用需要进行不同浏览器的兼容性测试时,首先需要准备很多机器或者模拟
机,并安装所需的不同测览器。
- 当web应用需要进行同一浏览器的不同版本的兼容性测试时,同样需要准备很多安装了同一浏览器的不同版本的测试执行机器
- 在GUI自动化测试用例的数量比较多的情况下,你不希望只用一台测试执行机器以串行的方式执行测试用例,而希望可以用上所有可用的测试执行机器,以并发的方式执行测试用例
2)Selenium Grid架构
四、Selenium开发环境搭建
1、安装python
https://www.python.org/官网下载python
2、安装pycharm
https://www.jetbrains.com/pycharm/download/#section=windows (使用社区版即可)
3、安装selenium
- 离线安装
下载指定的selenium版本;https://pypi.org/project/selenium/
解压文件;
使用cmd进入解压目录下执行命令:python setup.py install
- 使用pip在线安装:
pip installselenium
pip installselenium==指定版本号 如:pip install selenium==2.48.0
4、下载driver
- 如果不能科学上网,推荐使用国内镜像: https://npm.taobao.org/mirrors/chromedriver/
- 配置driver的环境变量
五、元素定位基础知识
<html>
<head>
.......
</head>
<body>
.......
</body>
</html>
1、HTML
<html></html> :
文档的根元素,所有的描述都在这里
<head></head> :
文档头信息,包含<title></title>、<script></script>、<style></style>标签
<body></body> :
文档正文,其信息会在浏览器中显示
可以包含文本标签,链接,图像标签,表格标签,框架标签等
2、Dom
一个页面是通过DOM构造、布局以及绘制页面三步完成
3、XML
- 什么是XML
XML指可扩展标记语言,与HTML类似,HTML最多是用来展示数据的,但是XML是为了
传输和存储数据而非显示数据
- 什么是XPath
XPath是在XML文档中查找信息的一种语言,Xpath可以用来在XML文档中对元素和属性
进行遍历
虽然XPath是用来查找XML节点,但同样可以查找HTML文档中的节点,因为HTML和XML
结构类似
- Xpath介绍//*[@id=”su”]
以//*[@id=”su”]为例(百度一下按钮)
/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input
4、元素定位的重要性
- 自动化测试的根本:准确的操作测试对象(元素)
- indElement和findElements方法
findElement()返回一个WebElement元素 findElements() 返回一个List,多个WebElement元素
六、Selenium实现元素定位
Selenium提供了定位元素的API,这些方法都被定义在WebDriver类中,这些方法都以find开头
- find_element_by_id 通过id定位元素
- find_element_by_name 通过控件名称定位
- find_element_by_tag_name 通过标签名称定位
- find_element_by_class_name 通过类名定位
- find_element_by_link_text 通过链接文本定位
- find_element_by_partial_link_text 通过部分链接文本定位
- find_element_by_xpath 通过xpath定位元素 通过xpath定位元素
- find_element_by_css_selector 通过css选择器
七、Selenium WebDriver属性
- driver.name 浏览器名称
- driver.current_url 当前url
- driver.title 当前页面标题
- driver.page_source 当前页面源码
- driver.current_window_handle 窗口句柄
- driver.window_handles 当前窗口所有句柄
八、Selenium WebDriver方法
- driver.back() 浏览器后退
- driver.forward() 浏览器前进
- driver.refresh() 浏览器刷新
- driver.close() 关闭当前窗口
- driver.quit() 退出浏览器
- driver.switch_to.window 切换窗口
- driver.switch_to.frame 切换到frame
- driver.switch_to.alert 切换到alert
- driver.switch_to.active_element 切换到活动元素
九、Selenium WebElement属性
- id ID
- size 宽高
- rect 宽高和坐标
- tag_name 标签名称
- text 文本内容
十、Selenium WebElement方法
- send_keys() 输入内容
- clear() 清空内容
- click() 单击
- get_attribute() 获得属性值
- is_selected() 是否被选中
- is_enabled() 是否可用
- is_displayed() 是否显示
- value_of_css_property() css属性值
十一、Selenium操作下拉列表
- select_by_value() 根据值选择
- select_by_index() 根据索引选择
- select_by_visible_text 根据文本选择
- deselect_by_value 根据值反选
- deselect_by_index 根据索引反选
- deselect_by_visible_text 根据文本反选
- deselect_all 反选所有
- options 所有选项
- all_selected_options 所有选中选项
- first_selected_options 第一个选择选项
十二、Selenium鼠标和键盘操作
- click(on_element=None) 单击鼠标左键
- click_and_hold(on_element=None) 点击鼠标左键,不松开
- context_click(on_element=None) 点击鼠标右键
- double_click(on_element=None) 双击鼠标左键
- drag_and_drop(source,target) 拖拽到某个元素然后松开
- darg_and_drop_by_offset(source,xoffset,yoffset) 拖拽到某个坐标然后松开
- move_by_offset(xoffset,yoffset) 鼠标从当前位置移动到某个坐标
- move_to_element(to_element) 鼠标移动到某个元素
- move_to_element_with_offset(to_element,xoffset,yoffset) 移动到距某个元素(左上角坐标)多少距离的位置
- perform() 执行所有操作
十三、元素等待
- 强制等待 sleep()
- 隐式等待 implicitly_wait(20)
- 显示等待
title_is 判断title是否出现
title_contains 判断title是否包含某些字符
presence_of_element_located 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located 判断某个元素是否被加到了dom树里并且可见,宽和高都大于0 visibility_of 判断元素是否可见,如果可见就返回这个元素
presence_of_all_elements_located 判断是否至少有1个元素存在于dom树中
visibility_of_any_elements_located 判断是否至少有1个元素在页面中可见
text_to_be_present_in_element 判断指定的元素中是否包含了预期的字符串
text_to_be_present_in_element_value 判断指定元素的属性值中是否包含了预期的字符串
frame_to_be_avaliable_and_switch_to_it 判断该frame是否可以switch进去
element_to_be_clickable 判断某个元素是否可见并且是可点击的
element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表
alert_is_present 判断页面上是否存在alert
十四、验证码的处理
1、验证码在自动化测试过程中如何处理
- 找开发屏蔽
- 找开发置为默认
- 使用pytesseract和Pillow实现验证码识别
使用pytesseract模块和Pillow模块解决 安装pytesseract模块 pip3 install pytesseract 安装Pillow pip3 install Pillow
2、网站验证码解决思路
- 截屏整个页面
- 获得验证码坐标数据
- 根据坐标数据抠图
- 使用pytesseract模块进行验证
3、POM模式 Page Object Model
- 在POM下,被测项目的每一个页面都有一个对应的page class
- 每一个page class维护着该web页的元素定位集和
- 每一个page class维护着该web页的操作这些元素的方法
十五、Pytest框架
1 、介绍:
pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高
2、 特点:
- 容易上手,入门简单,文档丰富
- 能够支持简单的单元测试和复杂的功能测试
- 支持参数化parametrize
- 强大的fixture自定义功能,这个是框架的核心亮点功能。
3、安装:pip install pytest
4、运行规则:
查找当前目录及其子目录下以test*.py或者*test.py的python文件
找到文件后,在文件中找到以test开头函数和方法并执行
5、编写规则:
- 测试文件以test开头(以test结尾也可以)
- 测试类以test开头,并且不能带有init方法
- 测试函数以test开头
- 断言使用基本的assert
6、pytest 参数化处理
- 在pytest中也可以使用参数化测试,即每组参数都独立执行一次测试
- pytest.mark.parametrize(argnames,argvalues)
7、fixture
- 定义fixture和定义普通函数差不多,唯一区别是在函数上加个装饰器@pytest.fixture()
- fixture命名不要以test开头,跟用例区分开,fixture是有返回值的,没有返回值默认为none
- 用例调用fixture的返回值,直接把fixture的函数名称当作变量名称
8、使用pytest重构项目
- 将__init__修改为setup_class
- 修改为python断言assert,(pytest用的就是python里面的断言)
- 使用pytest依赖插件(解决用例之间的依赖关系)pip install pytest-dependency
- pytest-ordering插件来强制指定用例执行顺序 pip install pytest-ordering
语法:@pytest.mark.run(order=xx)值越小, 优先级越高 0 1
9、pytest用例执行顺序
- 文件名称 按 ASCII 码排序
- 文件内部按代码先后顺序排序
十六、日志
1、日志的作用
- 程序调试
- 故障分析与问题定位
- 用户行为分析
2、日志的级别
- DEBUG 最详细的日志信息
- INFO 信息详细程序仅次于DEBUG,通常只记录关键点信息
- WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间低)
- ERROR 由于一个更严重错误导致某些功能不能正常运行时记录的信息
- CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
3、四大组件
组件名称 对应类名 功能描述
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送给合适的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志,丢弃哪条日志
格式器 Formatter 决定日志记录的最终输出格式
import logging
import logging.handlers
import datetime
def get_logger():
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
rf_handler = logging.handlers.TimedRotatingFileHandler('all.log',when='midnight', interval=1, backupCount=7,atTime=datetime.time(0, 0, 0, 0))
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s -%(message)s"))
f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s -%(filename)s[:%(lineno)d] - %(message)s"))
logger.addHandler(rf_handler)
logger.addHandler(f_handler)
return logger
十七、allure生成报告
- 安装JDK
- 安装:pip install allure-pytest
- 官方文档: https://docs.qameta.io/allure/
- allure可执行文件下载
https://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/
下载好后,将bin目录配置环境变量。比如:C:allureallure-2.7.0allure-2.7.0bin
- 注意生成测试报告,必须在命令行执行
pytest –alluredir ./reporttestxx.py ——在框架目录“reports”下生成report文件
allure serve ./reports ——-启动allure查看报告
文章版权声明
1 原创文章作者:拾忆少女的夢,如若转载,请注明出处: https://www.52hwl.com/35606.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别