定义
selenium 是一个用于web应用程序自动化测试的工具;
selenium功能:测试与浏览器的兼容性;测试系统功能;
可以模拟人的输入操作、从web界面上获取信息;
比如:通过它我们可以写出自动化程序,像人一样在浏览器中进行操作,简化了大批量的测试工作。网站登录界面的账户密码的验证工作,测试大批量的账户信息,如果单纯靠人力输入,效率会十分低下,如果采用自动化测试的手段,会大大提升工作效率。需要从网站上获取信息,比如从官网公布的疫情模块获取当日疫情的信息。
selenium提供了多种编程语言,包括java、python、js等。
selenium工作原理
自动化测试涉及三个部分,自动化测试程序、浏览器驱动、浏览器。
自动化测试程序 = Selenium客户端,测试工程师编写的代码调用selenium客户端函数,它会发出客户端请求给浏览器驱动;
浏览器驱动 = 因为自动化测试程序与浏览器之间交互语言不同,浏览器驱动起到桥梁转接的作用,将自动化测试程序输出的HTTP请求转化成浏览器可以识别的数据格式;独立的程序,由浏览器厂商提供,不同浏览器需要不同的驱动;
浏览器 = 根据浏览器驱动发送的信息 执行相应的操作 并返回给自动化测试程序;
自动化测试过程
自动化程序调用Selenium客户端函数;
客户端库会发送请求给浏览器驱动;
浏览器驱动程序接收到命令后,驱动浏览器执行命令;
浏览器执行命令;
浏览器驱动程序获取命令执行的结果,返回给自动化测试程序;
自动化程序对结果进行处理;
Selenium环境安装
需要安装客户端库和浏览器驱动。
组成
主要的组件有:Selenium IDE 、 Selenium WebDriver、SeleniumGrid 。
Selenium IDE是一个Firefox/Chrome插件,用于记录和回放用户与浏览器的交互,实现脚本录制;
Selenium WebDriver,实现对浏览器的各种操作,是API包,测试人员通过调用这些接口,访问浏览器驱动,浏览器驱动再访问浏览器;
SeleniumGrid,分布式自动化工具,用例可以在多个浏览器同时执行,提高测试效率;
概述
它是浏览器Firefox/Chrome的插件,可以将用户与浏览器的交互信息记录。
概念
Selenium WebDriver 是客户端API接口,测试人员通过调用这些接口,来访问浏览器驱动,浏览器驱动再访问浏览器。
远程测试——通过ip地址和端口号的方式,来访问驱动从而驱动浏览器;
分布式测试——使用Selenium Server 或 Selenium Grid进行测试。
浏览器驱动存放位置
D:\soft\googletool\chromedriver_win32
概念
专门用于并行运行多个测试用例在不同的浏览器上、操作系统和机器上;
有八种定位方式:
id、name、class、tag_name、xpath、css、link、partail_link_text。
概念
XPath (XML Path Language)是由国际标准化组织W3C指定的,用来在XML和HTML文档中选择节点的语言。
主流浏览器都支持XPath方法选择元素,它有两个版本,分别是1和2,目前浏览器只支持xpath1的语法。
出现原因
有些场景使用css选择web元素很麻烦;
Xpath可以使用到其他领域,比如爬虫框架Scrapy、手机App框架Appium。
绝对路径语法
相对路径语法
案例:百度页面测试
格式:[@属性名 = ‘属性值’]
属性名前面一定要有@
属性值一定要使用引号,单引号或者双引号;
# id属性来选择
obj = wb.find_element('xpath','//div[@id = "china"]')
# class属性来选择
obj = wb.find_element('xpath','//select[@class = "single_choice"]')
# 属性值包含某个元素
obj = wb.find_element('xpath','//*[contains(@style,"color")]')
# 属性值以某个元素开头
obj = wb.find_element('xpath','//*[starts-with(@value,"小")]')
# 属性值以某个字符串结尾
obj = wb.find_element('xpath','//*[starts-end(@class,"e")]')
# 该语法不支持;xpath1.0不支持;是xpath2.0的语法;
替换的相同内容是:
obj = wb.find_element('xpath',"//input[substring(@autocomplete,2) = 'ff']")
substring(a,b); ==> 表示将字符串a从第b个字符开始,截取到末尾。
索引的下是从1开始的。
# 表示找div下的所有子节点;
wb.find_element('xpath','//div/*')
text使用报错 不知道因为什么。只是126邮箱页面中“登录邮箱”这个文本出现问题,换成“扫码登录”之后就没有问题了。
注意
要先使用By.xx的形式,需要导入包
from selenium.webdriver.common.by import By
class属性定位
标签定位tag_name
id属性定位
子元素 和 后代元素
选择直接子元素的语法: 元素1 > 元素2
支持多层选择:元素1 > 元素2 > 元素3 > 元素4
选择后代元素的语法:元素1 元素2
支持多层选择:元素1 元素2 元素3 元素4
其他元素
语法使用:[属性名 = 属性的值]
验证选择元素的css语句是否正确
Chrome浏览器→f12→选择elements→ctrl+f
正数第n个子元素→语法是使用nth-child(n)
倒数第n个子元素→语法是使用nth-last-child(n)
第n个某类型的子元素→语法是使用nth-of-type(n)
倒数第n个某类型的子元素→ 语法是使用nth-last-of-type(n)
选中子元素的偶数位置→nth-child(even)
选中子元素的奇数位置→nth-child(odd)
选中某类型子元素的偶数位置→nth-of-type(even)
选中某类型子元素的奇数位置→nth-of-type(odd)
兄弟关系
相邻兄弟节点选择 使用+
后续所有兄弟节点选择 使用~
有些元素它是不可见(style = ‘display:none’)
有些元素是隐藏的(hidden)
有些元素不可以用的(disabled = disabled) 灰色
有些元素是不可以编辑的(readobly = readonly)
需求
获取某个网页。
代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 指定浏览器驱动位置 需要导入上面的包
# 创建webdriver对象,.Chrome表示使用Chrome浏览器驱动;
wd = webdriver.Chrome(service=Service(r'xxx\chromedriver_win32\chromedriver.exe'))
# 这句话 = selenium客户端库会找到chromedriver这个驱动运行,再运行Chrome浏览器;
# 保证三个程序在运行,一个是自己的客户端程序;第二个是浏览器驱动;第三个是浏览器;
input()
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址。
wd.get('https://www.baidu.com')
# 这句话底层执行流程:
# 自动化程序通过selenium客户端程序库创建一个HTTP请求,将请求发送给浏览器驱动,再传给浏览器;
# 浏览器处理该请求后再将处理结果返回给浏览器驱动,浏览器驱动再将结果返回给selenium客户端库;
# webdriver对象的get方法 发送完HTTP请求之后,会再等待接收请求。
备注
代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from time import sleep
def test():
wb = webdriver.Chrome(service=Service(r'D:\soft\googletool\chromedriver_win32\chromedriver.exe'))
wb.get('http://www.baidu.com')
sleep(1)
# 暂停一秒钟 线程阻塞。
wb.find_element('id','kw').send_keys('selenium')
# 通过属性id的值kw 找到元素,send_keys在输入框里面输入一些内容;
sleep(1)
wb.find_element('id','su').click()
# click方法表示单机 让他执行;
sleep(3)
wb.quit()
# 表示让webdriver关闭浏览器。
def test1():
import subprocess
p = subprocess.Popen(r'D:\soft\googletool\chromedriver_win32\chromedriver.exe')
p.communicate()
# 代码的封装
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome(service=Service(r'D:\soft\googletool\chromedriver_win32\chromedriver.exe'))
def test(self):
self.driver.get('http://www.baidu.com')
sleep(1)
self.driver.find_element('id','kw').send_keys('java')
sleep(1)
self.driver.find_element('su').click()
sleep(3)
self.driver.quit()
if __name__ == '__main__':
ob = TestCase()
ob.test()
分析
find_element问题
selenium4.0已经不再支持find_element_by_id这个方法;
取而代之的是find_element(by,value)和find_elements(by,value) 两种定位方式;
by的值介绍如下:
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
问题1
代码:
wb.find_element('name','email')
Unable to locate element: {“method”:“css selector”,“selector”:“[name=“email”]”} (Session info: chrome=105.0.5195.54)
错误的原因是:定位不到元素,说使用的是css 定位,但是代码书写并不是css模式定位;
本质原因是:name = email元素在iframe标签中。
解决方式1
通过定位子框架。切换进入iframe标签。
wb.switch_to.frame('reference');
参数可以是属性值id、name、element。
调回主框架
wb.switch_to.default_content()
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from time import sleep
class Test(unittest.TestCase):
def test_01_login(self):
# 打开浏览器
wb = webdriver.Chrome(service = Service(r'D:\soft\googletool\chromedriver_win32\chromedriver.exe'))
# 加一个隐式等待
wb.implicitly_wait(10)
# 加载网页
wb.get('https://www.126.com/')
# # 输入用户名 通过定位元素 然后再输入 参数只能是id、name、element
wb.switch_to.frame(wb.find_element('xpath',"//iframe[starts-with(@id,'x-URS-iframe')]"))
value = wb.find_element('name','email').send_keys('1111')
# print(value)
sleep(5)
iframe标签
作用:
HTML中的内联框架元素,表示嵌套的浏览器上下文,可以有效的将一个HTML页面嵌入到当前页面中。
HTML中有三种结构特征:树结构、层次结构、框结构。而iframe就是框结构。
参考1
概念
框架 = 开发牛人定制研发的应用骨架,是一个半成品,对基础代码进行了封装,并且提供一个API接口。其他的开发者只需要直接调用封装好的API接口即可。
自动化框架 = 自动化测试leader为了对一个系统做自动化测试而封装的一个代码主骨架,其他的自动化测试工程师只需要去调用这个骨架里面的方法就可以实施自动化测试,这个代码骨架就是自动化框架;
unittest = 是python自带的单元测试框架,对软件中的最小可测试单元进行检查和验证;
单元测试框架
作用:体用用例组织及执行;提供丰富的断言方法;提供丰富的日志与测试结果;
unittest 四个核心要素
TestCase = 测试用例; 完整的测试单元;
包括:setUp=预设条件;run = 运行脚本;tearDown = 结束条件;
TestSuite = 测试用例集;业务流程;
TextTestRunner = 用来执行测试用例的;
Fixture = 测试用例环境的搭建和销毁;
unittest.main()书写在 → if name == ‘main’:
通过继承unittest.TestCase类来定义测试类 → class LoginCase(unittest.TestCase):
测试用例类中有:
setUp方法 = 初始化工作,一般包括找到浏览器驱动、以及打开浏览器;
testXX方法 = 测试点;
tearDown方法 = 退出清理工作;
一个测试用例类下面可以放多个测试方法(test)或者测试点;
测试用例类中以test开头的才是测试方法;
断言是测试用例的核心,assertEqual()来判断预期结果;
测试结果输出:
F表示一个fail,F前的点表示一个通过,有E的话表示程序自身异常。
单元测试是对程序中最小的可测试模块(函数)来进行测试;
单个测试用例:setup→testcase1→teardown
多个测试用例:setup→testcase1→teardown→setup→testcase2→teardown→setup→testcase3→teardown→…
概念
Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理。
作用
编译代码
项目打包
实现项目模块化
在线管理依赖,项目依赖很方便获取
提供了一些丰富的插件,方便项目持续集成
概述
IDEA 默认的插件Maven 版本是3.6.1 自己使用的IDEA 版本是19.3.3
概念
软件测试 = 在一定的条件下对程序进行操作,可能会发现一些问题,这时就需要衡量软件的质量,进而判断是否符合用户需求;
软件开发 = 开发人员根据用户需求设计应用软件或系统的过程;
测试开发 = 本质是测试,通过开发的手段提升测试性能以及效率;
关系
软件测试和软件开发是同样重要的,具有相辅相成的关系;
软件测试是同时站在开发和用户的角度去看待项目的,一方面在开发过程中协助开发人员修正开发过程可能会出现的问题;另一方面测试人员可以有效减少用户验收项目时出现于前期需求不配的矛盾。
软件测试的方法 = 使用人工或自动的手段来运行或测试某个软件系统的过程;
软件开发流程分类:4个
单元测试:对软件组成的单位进行测试,即方法或函数进行测试;
集成测试:模块按照合适的策略组合之后针对软件的功能和接口进行正确性以及功能性测试;
系统测试:将软件看成一个整体,对软件的界面、功能、性能、安全性、易用性、兼容性等测试;
验收测试:软件项目部署之前的最后一个测试,验证软件是否符合需求规格说明书;
是否查看代码分类:3个
黑盒测试:检测软件功能是否实现、是否按照软件需求说明书进行;不关注软件代码,只关注软件的输入输出数据;
白盒测试:基于代码进行测试,包括逻辑测试、结构测试;
灰盒测试:既有功能测试、又有结构测试;
是否运行代码分类:2个
静态测试:不运行代码;(代码)查看测试代码是否符合相应的标准、(界面)查看软件的实际界面与需求中的说明是否相符、(文档)看测试用户和需求说明是否符合用户的实际需求;
动态测试:运行代码,查看程序的预期运行结果与实际运行结果是否一致,并对软件功能的正确性和健壮性进行分析;
测试对象分类:11个
界面测试:看界面与设计图是否保持一致、界面是否好看、界面按钮大小、设计风格是否保持一致;
功能测试:主要针对软件的功能进行测试,比如登录功能等;
性能测试:检查软件是否符合需求分析说明书;包括压力测试、负载测试、并发测试;
易用性测试:软件是否从用户的角度去设计,交互性怎么样;
安全性测试:渗透测试、DOS攻击、跨域攻击、SQL注入、暴力破解、软件权限、数据安全等;
兼容性测试:看不同软件之间是否可以协同工作,是否会影响其他软硬件的性能发挥;
安装测试:检测软件是否可以正常安装 和 卸载;
稳定性测试:对软件产品在高负载、重压、不同环境下进行稳定性测试,寻找软件的崩溃节点;
文档测试:检查软件的开发文档、用户文档、管理文档是否完好健全;
本地化测试:检测不同环境下,软件的使用是否正常;
APP专项测试:弱网测试、场景交互测试、资源挣网测试、权限测试、安装卸载更新测试、离线测试、消息推送测试、资源监控测试等。
是否人工测试:2个
手动测试:通过测试人员手动输入测试用例进行测试;
自动测试:由机器参与的,由程序自动读取数据进行测试;
测试实施组织:3个
α测试:用户在开发环境中的测试;一般是程序员将软件开发出来后,自己进行测试;
β测试:最终的用户在不同场景下的测试;
第三方测试:将开发出来的软件交由第三方机构进行测试,看软件是否好用;
其他分类:2个
冒烟测试:针对不同版本的修改,在正式测试之前先进行验收测试;
回归测试:修改代码之后,看是否引入新的问题;
软件测试的流程分为:测试计划设立阶段、测试准备阶段、测试执行阶段、测试总结阶段。
需求文档的评审需要考虑六个方面,分别是:正确性、完整性、一致性、准确性、限制性、优先级;
正确性 = 文档是否正确描述用户需求;
完整性 = 文档是否完整描述用户需求;
一致性 = 文档前后的描述信息是否一致;
准确性 = 文档的描述是否准确;
限制性 = 文档的描述是否规定该做什么,不该做什么;
优先级 = 文档的测试模块是否标明优先级;
项目职责与划分
项目主要涉及人员包括:项目经理、开发人员、测试人员;
项目经理负责对项目的整体功能进行分析,并撰写产品需求文档;开发人员根据需求分析报告完成相应的功能;测试人员根据需求分析报告构建需求分析思维导图,进而构建测试点和功能点完成测试;
测试流程概述
1 阅读项目相关文档,包括产品需求文档PRD、产品流程图、UI界面设计图等;
2 与项目经理、开发人员一同参加需求评审会议,针对项目确立需求分析文档并编写测试计划;
3 根据需求分析文档构建测试需求分析思维导图,找出功能点和测试点,并构建测试用例;
4 与项目经理、开发人员、测试同组人员一起参加用例评审会议,看测试用例是否符合项目需求;
5 开发人员提交程序代码之后,搭建测试环境,使用测试用例进行自动化测试,并记录问题;
6 验证bug与回归测试,编写测试报告;
7 产品上线。
该阶段最重要的是建立需求分析文档;
通过阅读项目的产品流程图、产品需求文档PRD,了解项目初步需求;
与项目经理、开发人员一同参加需求评审会议,针对项目确立需求分析文档并编写测试计划,包括对项目组人员的数量以及职责的安排部署;
测试概要
根据项目需求分析文档,制定测试策略并对测试工作量进行评估,进行人员安排;
划定测试范围(如产品的功能模块)、搭建测试环境等;
测试策略
冒烟测试:在正式测试之前,先进行的验收测试;
第一轮功能测试:执行测试用例、兼容性测试、易用性测试等;
第二轮功能测试:bug复测以及功能验证;
回归测试:针对软件修改的部分,再进行测试,看是否又引入新的问题;
性能测试:确定具体的性能测试方案和工具;
验收测试:在项目正式部署之前的最后一个测试;
测试风险评估
突发情况的处理是否有应对解决方案,比如测试人员、开发人员由于特殊原因请假导致人员不够的问题怎么解决;
项目突然提前了有什么响应的应对方案;
项目的优先级是否足够高,如果有优先级更高的项目中途打断该项目的开发,是否有相应的解决方案;
测试预期
拟定测试目标(如软件开发产品的预设);
等价类——有效等价类、无效等价类。
有效等价类 = 针对测试项是正确的内容;无效等价类 = 测试项不正确的内容;
边界值分析法——上点、离点、内点
流程图分析
画出流程图,根据流程图提取测试路径,利用等价类和边界值方法为每一条路径设计测试用例;
涉及概念:基本流、备选流、异常流。
正交实验
获取因子以及其水平数(因子 = 影响实验结果的条件、水平数=每个因子可能的取值)
选择正交表;
使用等价类和边界值为每一条规则设计测试用例。
状态迁移
主要关注测试状态转移上的正确性,验证给定的条件下是否能够产生需要的状态变化;
具体步骤:分析对象的状态、绘制状态迁移树、提取测试路径;
判定表
参考
当测试人员提交一个bug的时候,bug就有了生命,生命周期就是从此刻到它最后被解决。
测试提交的bug单
概要 = 简要描述bug;
被检测模块 = 产生该bug是针对哪个模块进行的测试;
测试人 = 测试人员的名字;
提交给的开发人员 = 开发此模块的开发人员;
单子的创建时间 = bug单子的创建时间;
bug的详细描述 = 测试项目、前置条件、执行操作、预期结果、实际结果;
附件上传 = 发现bug的实时截图;
bug基本概念
定义:不符合产品需求的、程序报错、不符合用户习惯的;
项目概要
项目介绍、参与测试人员以及开发人员、测试的周期;
测试结论
是否达到发布标准,是否可发布;
测试环境,测试设备
用到哪些测试软件,客户端环境,浏览器;
需求大纲
当前这个版本,包含哪些需求点;
测试用例报告
报告用例情况,测试用例的预期结果与真实结果是否一致;
Bug数据分析
对bug进行级别的分类和统计,分类包括:崩溃级别的bug、模块的bug、功能bug等;
风险分析
查看有哪些已知的测试风险被排查、以及是否有发现未知的测试风险;
测试总结
从测试角度,对版本存在的问题,提出建议,以方便开发人员进行修改;
根据测试人员书写的测试报告,看是否达到上线标准;
如果达到上线标准,书写上线报告单;
上线报告单:
迭代的版本号;发布的pool名;遗留的bug编号;性能测试是否通过;war包;上线发布(替换配置文件、在线上执行sql)。
前端的三大部分是 html、css、js
js = JavaScript 可以插入HTML页面的编程代码;
用来改进设计、验证表单、检测浏览器、创建cookies等;
位于标签之间的,一般位于之间 可以在中;
接口测试分类
内部接口:被测系统各个子模块的接口,或者 被测系统提供给内部系统使用的接口;
外部接口:被测系统调用外部的接口;系统对外提供的接口;
接口测试重点
检查接口参数传递的正确性;
接口功能的正确性;
输出结构的正确性;
对各种异常情况的容错处理;
权限控制;
接口架构设计
基于SOAP架构;基于XML规范。基于WebService协议。特点:接口地址以?wsd结尾;
基于RPC架构;基于doubbo协议、thrift协议、SpringCloud微服务;
基于RestFul架构;基于http协议,基于json规范;
RestFul规则:
接口地址:http://127.0.0.1/user get(查询用户)、post(新增用户)、put(修改用户)、delete(删除用户);
Json数据格式:有两种;
键值对 = {key:value}
数组 = [arr1,arr2]
Fiddler Web Debugger,能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能强大,是web调试的有效工具。
http请求消息 = 请求行、请求头、请求正文;
请求行 = 请求方式、请求的路径、请求的协议;
请求头 = accept数据格式、x-requested-with异步请求、user-agent客户端类型、content-type内容类型、cookieCookie信息(客户端发送给服务器端的Cookie);
http响应消息 = 响应行、响应头、响应正文;
响应行 = 响应协议,响应码,响应的信息;
响应头 = set-Cookie(服务器发送给客户端的Cookie)
Jmeter+Ant+Git+Jenkins。
Postman+Newman+Git+Jenkins。
Jmeter = 基于Java语言压力测试工具,可以做接口测试,也可以做性能测试;