软件测试进阶篇----自动化测试概述

自动化测试

第一层:功能测试,要求懂软件测试基础理论,Linux、数据库及其他计算机相关的知识

  • 软件测试行业的最底层(技术层面)
  • 行业知识领域的拓展(行业测试层面)
  • 初级测试

第二层:接口测试,相对功能难一点,相比自动化简单一些

  • 企业最急需的技术要求
  • 性价比最高的(技术简单、薪资较高)
  • 初中级测试

第三层:自动化测试,是属于中级软件测试的层次,可以定位高级测试

  • 定位中高级
  • 技术难度较高,性价比差点
  • 分类
    • UI自动化测试(通过浏览器访问UI页面的测试类型)-大测试
      • APP
      • web
      • 小程序
    • 接口自动化测试(后台服务器接口)-中测试
    • 单元测试(代码级的)-小测试

第四层:个人持续发展

  • 测试开发岗位,需要在自动化测试脚本的基础上,结合vue、flask等框架进行测试工具的开发、二次开发等
  • 性能测试方向:测试需求分析、性能测试指标、性能测试工具使用,测试场景执行和简单测试结果分析
  • 安全测试方向:软件安全测试(代码级别安全扫描和分析)和网络安全测试(渗透测试)
  • ……

一、自动化测试概述

1、定义

自动化测试就是用脚本模拟手工测试过程的一种类型,用程序来测试程序的过程

概念中的第一个程序:

  • Python:一种语言开发脚本
  • PyCharm:IDE继承开发工具软件
  • Selenium:自动化测试框架工具

2、自动化测试的特点

覆盖性特点:自动化测试可以实现手工测试无法完成的覆盖要求

时效性特点:在短时间内完成大量的工作、长时间的进行测试

重复性特点:对于重复性工作、简单的工作,交给自动化,测试工程师就可以做更加有价值的事情了

适用于回归测试阶段,目的是提高测试执行的效率。

自动化测试是为了发现更多新的bug嘛?能发现bug嘛?

系统持续迭代更新的时候适合使用自动化,但是需求频繁变更则不适用

3、自动化测试工具

uft(通用功能性测试),是cs、bs架构系统通用的自动化测试工具,现在属于microfocus公司,属于商业软件

selenium(硒),只支持bs架构的,是一种开源软件

公司自研软件:测试开发的一个方向

二、自动化测试流程

你上家公司是怎么做自动化测试的?自动化测试的流程是什么?你在自动化测试中参与了什么工作内容?

软件测试进阶篇----自动化测试概述_第1张图片

1、确定自动化测试的介入点

前提是项目需要开展自动化测试了(而是项目负责人或者BOSS认为需要开始做自动化了)

系统级测试完成之后的回归测试阶段介入自动化测试。(系统比较稳定、迭代的需求)

2、需求分析和测试计划阶段

技术可行性分析:当前团队中的技术是否满足要求,需要采样分析。

需求分析:可以复用功能测试阶段的分析结果

测试计划:5w1h

3、测试设计

自动化测试用例设计(模板和功能测试的有差别,但也不大),不是一成不变的,需要不断地维护(增加、修改、删除),版本管理。

自动化测试环境搭建:

  • 被测系统
  • Python3
  • pycharm
  • selenium
  • unittest/pytest
  • git分布式版本管理工具/svn集中式版本管理工具
  • jenkins:持续集成工具

自动化脚本开发:版本管理和脚本的合并

4、测试执行

要求:无人值守的测试执行、输出可视化的报告(html格式)、邮件自动发送等

准备:异常处理(在测试用例的适当位置添加异常处理)、场景还原(每次执行脚本需要还原一次数据库)

5、输出测试报告、测试总结

输出一个可视化的报告即可

6、持续改进

pdca质量环(戴明环)

把本轮测试的经验、教训进行汇总、分析、研讨、作为下一次执行经验使用

三、Selenium基础

  1. selenium简介

    selenium是一个验收工具(回归测试工具,是运行在Chrome、firefox、edge、safari常见浏览器上的)

    selenium最早版本是js开发的,慢慢地支持多种语言平台,python、java

  2. selenium的版本

    • selenium1.0:selenium ide、selenium rc(rc:remote control远程控制,js脚本控制浏览器)、selenium grid

      • selenium rc工具是用js开发的,直接操作浏览器的元素
      • 浏览的类型不同、版本不同,直接导致脚本不稳定
    • selenium2.0:selenium ide、selenium rc、selenium grid、webdriver(是Google的一个产品)

      • webdriver工具,使用浏览器驱动来屏蔽掉浏览器的区别、差异,
      • 作为自动化测试工程师,只需要关注自动化脚本的开发即可(客户端代码)
      • 提升了代码的稳定性
    • selenium4.0:selenium ide、selenium grid(分布式执行)、webdriver(是Google的一个产品)

  3. selenium IDE

    火狐浏览器的一个插件,是可以直接录制自动化脚本、结合不同的开发语言导出脚本的工具

    selenium ide是入门级自动化测试工程师、业务相关人员用的,适用于语言能力较差、不能自己写代码的。

    1. 安装ide插件

    2. ide工具的基本使用

      启动录制脚本,默认打开浏览器对应的baseurl地址

      下面将在页面上进行业务操作了,代码会被录制下来,直到关闭浏览器。

      回到selenium ide界面,停止录制

      输入脚本名称,点击ok,就完成百度搜索的脚本录制了

    3. 查看录制的脚本

      每一句代码都是由三部分组成的(关键字脚本开发):

      • command:步骤中对页面元素的操作的动作、命令、事件等
      • target:操作的对象是页面元素,通过各种页面元素属性来定位(id、name、class等)
      • value:有一些对象是需要值的,有的不需要
    4. 运行脚本

      调整下运行速度适中

    5. 通过关键字开发脚本

      加上断言步骤

    6. 导出测试脚本

      选中脚本名右侧三个点,弹出菜单选择export,选择Python pytest框架的脚本

    7. 导出后文件可以直接运行或者改造

    • katalon是和selenium ide类似的一个工具,可以导出python+unittest框架的代码

      作为练习,自己做一下。

  4. selenium客户端环境配置

    我们选择的是python客户端,python语言下结合selenium实现脚本开发

    1. 安装Python3
    2. 安装selenium4.12.0
    3. 安装浏览器驱动(server端)
      1. 下载驱动文件,解压到Python的安装根目录下即可。
    4. 写一个简单的自动化测试代码
      • 打开火狐浏览器
      • 打开百度首页
      • 输入“CSDN叫我王同学”
      • 点击百度一下
      • 关闭浏览器

四、webdriver api常见的用法

selenium4=selenium ide+grid+webdriver

selenium是标准的C/S架构的系统:

  • c-client:指的就是webdriver开发的自动化脚本
  • s-server:浏览器
  • 原理:使用C端的自动化脚本来操作S端浏览器上的页面元素的过程就是自动化,驱动屏蔽掉了浏览器的差异化

一、页面元素及操作

1、页面元素

html页面上的各种标签:

  • input标签
    • password
    • text
    • radio
    • check box
    • button
    • ….
  • button标签
  • img标签
  • a标签
  • h标签
  • p段标签
  • span标签
  • div标签
  • select下拉列表
  • option
  • form标签

知道对象是什么了,如何去定位到这个对象

2、定位元素

from selenium.webdriver.common.by import By

driver.find_element(By.xx,“yy”)

  1. id属性定位

    id是标签的唯一性属性(h5技术中的一个强制要求),而且要求每个标签都应该有id属性。

    如果标签有id属性,定位元素的第一选择就是id属性定位。

    driver.find_element(By.ID,“”)

  2. name属性定位

    h5未做强制的唯一性的要求,属性要求必须具备,可以作为第二选择

    find_element(By.NAME,””)

  3. tag name标签名属性定位

    在一个页面上相同标签名的标签会有很多,就很难做到唯一性定位元素了。

    • find_element(By.TAG_NAME,“”):返回的是页面元素对象,返回页面第一个出现指定标签的元素
    • find_elements(By.TAG_NAME,“”):返回的是页面元素对象的列表
  4. class名属性定位

    把相同、相似功能标签,划分在同一个类中,一个类属性一定对应这个标签。

    • find_element(By.CLASS_NAME,“”):返回的是页面元素对象,返回页面第一个出现指定标签的元素
    • find_elements(By.CLASS_NAME,“”):返回的是页面元素对象的列表
  5. 标签的文本信息定位

    适用于超链接和按钮元素,

    使用的定位方式是:xxxx< /a>

    • link text:要求文本信息必须是完整的
    • partial link text:部分信息就可以定位
  6. xpath定位

    xml文件:现在主要是作为一些配置文件中使用

    xpath:路径,是最早在xml文档中用于标签定位的一种语法,被html引入并使用

    xpath其实就是一种根据html页面的结构树(DOM),通过标签所在的位置进行定位的一种技术

    方式1:绝对路径表示法:从HTML根节点开始定位

    ​ /:表示根节点,父节点和子节点之间的连接符

    ​ []:同名的兄弟节点关系,索引号是从1开始的,不写默认为1(出现的第一个同名节点)百度文本框的绝对路径:

    方式2:相对路径结合属性定位

    ​ //:中间任意节点

    ​ 表示一个id属性为kw的任意input标签://input[@id=”kw”]

    ​ 表示一个name属性为wd的任意标签://*[@name=“wd”]

    方式3:相对路径定位

    ​ //form[@id=“form”]/span/input

    方式4:直接浏览器上复制

    相对路径://*[@id=“su”]

    绝对路径:/html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[2]/input

  7. CSS select定位

    css_selector:层叠样式选择器定位方法,定位的效率要比xpath要高、css的语法结构要比xpath更简洁

    • 类选择器:**.**类名

    • id选择器:**#**id名

    • 标签选择器:input input**.**aa input#bb

    • >:表示父子节点关系

    • +:表示同级别兄弟节点关系

    • [属性=“属性值”]:比较通用,[id=“id值”]

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      import time
      
      # 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
      driver = webdriver.Chrome()
      
      # 打开百度首页
      driver.get("https://www.baidu.com")
      
      # 通过标签结合类属性的css定位百度文本框并输入字符串
      # driver.find_element(By.CSS_SELECTOR, 'input.s_ipt').send_keys('CSDN叫我王同学')
      # driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('CSDN叫我王同学')
      # driver.find_element(By.CSS_SELECTOR, 'form#form > span > input').send_keys('CSDN叫我王同学')
      driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('CSDN叫我王同学')
      time.sleep(2)
      
      # 定位百度一下并点击
      # driver.find_element(By.ID, 'su').click()
      driver.find_element(By.CSS_SELECTOR, 'form#form>span+span>input').click()
      time.sleep(2)
      
      
      # 关闭浏览器对象
      driver.quit()
      
  8. 定位器的选择方式

    • 只要有id属性就用id定位
    • 如果是超链接,就用link text定位
    • 如果没有属性,可以使用xpath
    • 如果xpath和css之间要选择css
3、页面元素操作

定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框)。

webdriver中最常用的几个方法:

  • clear():清除文本

  • send_keys(value):模拟按键输入,还可以输入组合键和功能键,可以用于上传文件(标签必须是input)

  • click():单击元素。例如按钮、超链接操作

  • current_url:返回当前页面的url地址

  • title:返回当前页面的title

  • text:获取页面(提示框、警告框)显示的文字

  • get_attribute(name):获得属性值,文本框中的值用value属性名

  • is_displayed():检查该元素是否用户可见

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    
    # 创建浏览器对象
    driver=webdriver.Chrome()
    
    # 打开百度首页
    driver.get('https://www.baidu.com')
    
    # 获取当前页面的url,并打印出来(driver.current_url)
    cURL = driver.current_url
    print(cURL)
    
    # 获取当前页面的title,并打印出来(driver.title)
    cTitle = driver.title
    print(cTitle)
    
    # 获取百度首页底部的链接文本信息:把百度设为主页关于百度About  Baidu百度推广
    cText=driver.find_element(By.CSS_SELECTOR,'#bottom-layer > div').text
    print(cText)
    
    # 百度“selenium”,点击百度一下
    driver.find_element(By.ID,'kw').send_keys('selenium')
    
    # 判断页面中的“百度一下”按钮是否正常显示,是则打印“正常显示按钮”
    if(driver.find_element(By.ID,'su').is_displayed()):
        driver.find_element(By.ID,'su').click()
        print('正常显示按钮')
    time.sleep(2)
    
    # 获取文本框中的文字,并打印出来
    # get_attribute():可以获取一个元素对象的属性的值,如果参数给value,则返回的是数据
    cValue = driver.find_element(By.ID,'kw').get_attribute('value')
    cId = driver.find_element(By.ID,'kw').get_attribute('id')
    cName = driver.find_element(By.ID,'kw').get_attribute('name')
    print(cValue)
    print(cId)
    print(cName)
    
    # 清除百度文本框中内容
    driver.find_element(By.ID,'kw').clear()
    cValue1 = driver.find_element(By.ID,'kw').get_attribute('value')
    print(cValue1)
    time.sleep(2)
    
    # 关闭浏览器
    driver.close()
    

二、浏览器操作

1、基本操作

对浏览器的窗口的大小、浏览器的位置、前进、后退、刷新、截屏、关闭等操作。

  • 窗口大小操作

    • set_window_size()
    • maximize_window()
    • minimize_window()
  • 窗口的位置操作:set_window_position(x,y)

  • 前进:forward()

  • 后退:back()

  • 刷新:refresh()

  • 截屏:save_screenshot()

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    
    # 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
    driver = webdriver.Chrome()
    # 可以调整浏览器窗口的大小和位置
    # driver.set_window_size(500,500)
    
    # 建议创建完driver对象之后,立马最大化、最小化显示
    driver.maximize_window()
    time.sleep(2)
    # driver.minimize_window()
    # time.sleep(5)
    
    # 调整位置
    # driver.set_window_position(500,500)
    
    # 打开百度首页
    driver.get("https://www.baidu.com")
    driver.find_element(By.ID, 'kw').send_keys('CSDN叫我王同学')
    driver.find_element(By.ID, 'su').click()
    time.sleep(2)
    # 先后退到百度首页
    driver.back()
    time.sleep(2)
    # 再前进到搜索页
    driver.forward()
    time.sleep(2)
    
    # 刷新下页面
    driver.refresh()
    time.sleep(2)
    
    # 截图保存到本地
    driver.save_screenshot(r'd:\aa.png')
    
    # 关闭浏览器对象
    driver.quit()
    
2、多窗口操作

浏览器中多于一个窗口的时候就是多窗口,这时候如何操作不同窗口的页面元素的

# 百度首页,通过id属性定位百度文本框和百度一下按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
driver = webdriver.Chrome()

# 打开百度首页
driver.get("https://www.baidu.com")

# 点击新闻按钮
driver.find_element(By.LINK_TEXT, '新闻').click()
time.sleep(2)

# 查看当前窗口(只有一个)的句柄名
# current_window_handle
cHandle = driver.current_window_handle
print(cHandle)
# 3867737E15CEC331B212F81402762A39

cHandle1 = driver.current_window_handle
print(cHandle1)

# window_handles:返回所有窗口句柄的集合
handles = driver.window_handles
print(handles)

# driver对象能处理的窗口是第一个打开的哪个窗口,每个窗口其实是有名字的(句柄handle)
# 将driver对象切换给第二个窗口,进行操作
# switch_to.window(句柄名)
driver.switch_to.window(handles[1])

# 在此处截屏
time.sleep(4)
driver.save_screenshot(r'd:\bb.png')
driver.find_element(By.LINK_TEXT, '河北两座特高压变电站扩建工程同时开工').click()
time.sleep(2)


# 关闭浏览器对象
driver.quit()

三、鼠标和键盘操作

鼠标和键盘操作都是应用在浏览器中,是webdriver中提供的使用方法。

1、鼠标操作

主要是为了实现更丰富的交互,有鼠标点击、鼠标悬浮、鼠标右键、双击、拖动

实现步骤:

  • 先导包:from selenium.webdriver.common.action_chains import ActionChains
  • 绑定鼠标对象和浏览器,鼠标只能操作当前浏览器:ActionChains(driver)
  • 封装鼠标对象的动作:click()、move_to_element()、drag_and_drop()
  • 具体实现动作:perform()

案例1:鼠标的点击功能

# 使用鼠标的点击功能,点击百度首页的新闻按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')

# 封装要操作的对象
on_element = driver.find_element(By.LINK_TEXT, '新闻')
ActionChains(driver).click(on_element).perform()

time.sleep(3)

# 关闭浏览器
driver.close()

案例2:鼠标的悬浮功能

# 使用鼠标的悬浮功能,将鼠标悬浮在百度首页的设置按钮上
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')

# 封装要操作的对象
to_element = driver.find_element(By.ID, 's-usersetting-top')
ActionChains(driver).move_to_element(to_element).perform()

time.sleep(3)

driver.find_element(By.LINK_TEXT, '搜索设置').click()
time.sleep(3)

# 关闭浏览器
driver.close()

案例3:鼠标的拖拽功能

# 使用鼠标的拖拽功能,鼠标将一个元素拖拽到另一个原宿舍
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('xxx')

# 拖拽方法功能
source = driver.find_element(By.ID, 'xxx')
targe = driver.find_element(By.ID, 'xxx')
# ActionChains(driver).drag_and_drop(source,targe).perform()
ActionChains(driver).drag_and_drop_by_offset(source, 270, 200).perform()

time.sleep(3)

# 关闭浏览器
# driver.quit()
driver.close()
2、键盘操作

在webdriver中有keys模块(Keys类),定义大量类变量,每个变量表示一个键盘按键

都是采用**send_keys()**来键入键盘上的按键,可以单个字符键,也可以是组合键和功能键。

from selenium import webdriver
from selenium.webdriver.common.by import By
# 导入键盘操作的模块
from selenium.webdriver.common.keys import Keys
import time

# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')

# 键盘事件案例:
# 1、百度“selenium”
driver.find_element(By.ID, 'kw').send_keys('seleniumm')
time.sleep(1)

# 2、删除多输入的m
driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE)
time.sleep(1)

# 3、再输入“空格  教程”
driver.find_element(By.ID, 'kw').send_keys(Keys.SPACE)
time.sleep(1)
driver.find_element(By.ID, 'kw').send_keys('教程')
time.sleep(1)

# 4、ctrl+a,全选文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)

# 5、ctrl+x,剪切文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'x')
time.sleep(1)

# 6、ctrl+v,粘贴文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'v')
time.sleep(1)

# 7、回车代替单击,完成搜索
driver.find_element(By.ID, 'kw').send_keys(Keys.ENTER)
time.sleep(3)

# 8、退出浏览器
driver.quit()

四、弹框处理

浏览器中的弹框,基本都是JavaScript处理的,常见的有三类:

  • alert:就只有一个确定按钮,也叫警告框
  • confirm:有确定和取消两个按钮,叫确认框
  • prompt:确认、取消还有一个文本框,消息框

对于软件测试来说,处理方式都一样(这些弹框不能被页面元素定位):

需要将driver切换给弹框:driver.switch_to.alert

对弹窗的处理方式:

  • accept():点弹框的确定按钮
  • dismiss():点取消按钮
  • text:获取弹框的提示信息
  • send_keys():给prompt这种弹框输入文字的
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

# 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com')

# 封装要操作的对象
to_element = driver.find_element(By.ID, 's-usersetting-top')
ActionChains(driver).move_to_element(to_element).perform()

time.sleep(3)

driver.find_element(By.LINK_TEXT, '搜索设置').click()
time.sleep(3)

# 修改设置
driver.find_element(By.ID, 's1_2').click()
time.sleep(2)
# 保存设置
driver.find_element(By.LINK_TEXT, '保存设置').click()
time.sleep(2)

# 先获取警告框上的文本,再点警告框的确认按钮
# driver对象切到警告框
a = driver.switch_to.alert
# 获取文本
textS = a.text
print(textS)

# 点击确定按钮
a.accept()
time.sleep(2)

# 关闭浏览器
driver.quit()

五、多frame嵌套的处理

frame/iframe是h5中的一个标签,可以实现页面的嵌套,如果想操作嵌套页面就需要切换:driver.switch_to.frame()

三种切换方式:

  • 一层层往里切:driver.switch_to.frame()
  • 一层层往外切:driver.switch_to.parent_frame()
  • 一次性往外切:driver.switch_to.default_content()
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.qq.com')
# 基本版按钮是属于外层页面的,直接可以操作
# 想要操作密码登录按钮,需要往里切两层
# 方式1:参数是frame标签对象
element = driver.find_element(By.CSS_SELECTOR, '#QQMailSdkTool_login_loginBox_qq > iframe')
driver.switch_to.frame(element)

# 方式2:再进入第三层,参数可以为name属性值
driver.switch_to.frame('ptlogin_iframe')

# 切换完成之后,就可以点击第三层的页面元素了
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(5)

# 此处点不了基本版超链接,需要再切出去
# 一层层往外切
# driver.switch_to.parent_frame()
# driver.switch_to.parent_frame()
# 一次性切出
driver.switch_to.default_content()

driver.find_element(By.LINK_TEXT, '基本版').click()

time.sleep(5)

driver.quit()

六、时间等待

主要是解决由于网络加载慢、中间页面跳转或者异步加载情况下,页面元素定位不到的问题

1、强制等待

是一种代码暂停运行的技术

time.sleep(2)

2、隐式等待

对整个页面中的所有元素有效,用到哪个元素都可以按照隐式等待时间进行等待。

好处:定义20s隐式等待,页面10s就加载完了,等10s;2s就加载完了等2s;25s还没加载完,就抛出超时异常

建议:定义完driver对象之后,最大化显示,再加上该隐式等待

# 创建浏览器对象
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 加入隐式等待的方法
self.driver.implicitly_wait(10)
3、显式等待

针对页面上某一个特定的元素的等待。

WebdriverWait(driver,超时时间,刷新频率).util(条件)

  • expect_conditions中提供的定位方法作为util的条件,可以为True或者False
  • 如果是True返回要定位的页面元素对象
  • 如果为False抛出超时异常

你可能感兴趣的:(软件测试,1024程序员节,自动化,selenium,测试工具)