当前位置: 首页 > news >正文

一、UI自动化测试01--认识和元素定位方法

目录

  • 一、自动化测试
    • 1. 自动化应用场景
    • 2. ⾃动化测试的优缺点
    • 3. ⾃动化测试的分类
  • 二、UI ⾃动测试
    • 1. 适合使用的项目
    • 2. 实现时机
    • 3. 常⻅的UI⾃动化测试⼯具
    • 4. Selenium 框架
    • 5. Web ⾃动化环境部署
    • 6. Web ⾃动化基本代码
  • 二、元素定位
    • 1. 浏览器开发者⼯具
      • ⽅法1: 直接获取信息
      • ⽅法 2: 启动开发者⼯具再获取信息
    • 2. 元素定位⽅法
      • 2.1 id ⽅法
      • 2.2 name ⽅法
      • 扩展: 确定元素定位特征值唯⼀性的⽅法
      • 2.3 class_name ⽅法
      • 2.4 tag_name ⽅法
      • 2.5 定位超链接元素⽅法

一、自动化测试

  • 说明: 利⽤[⼯具]或[代码]替代⼈⼯完成对软件项⽬的[测试过程]

1. 自动化应用场景

    1. 回归测试: 重复性⾼/执⾏频率⾼
    1. 压⼒测试: 多⽤户/⼿⼯测试不好实现
    1. 兼容性测试: 测试条件多/⼿⼯执⾏效率差
  • ⾃动化测试的作⽤: 提⾼测试效率, 保证软件产品质量

2. ⾃动化测试的优缺点

  • 优点:
      1. 较少的时间内运⾏更多的测试⽤例;
      1. ⾃动化脚本可重复运⾏;
      1. 减少⼈为的错误;
      1. 克服⼿⼯测试的局限性;
  • 缺点:
      1. ⾃动化测试可以完全替代⼿⼯测试: ⾃动化测试实现步骤要依赖⼿⼯实现
      1. ⾃动化测试⼀定⽐⼿⼯测试厉害: 只是存在⾼薪和⼊⻔⻔槛的原因导致的
      1. ⾃动化测试可以发掘更多的BUG: UI 界⾯布局⼀类的问题, ⾃动化测试⽆法解决
      1. ⾃动化测试适⽤于所有功能: 功能测试逻辑复杂的/涉及第三⽅交互的都不适合使⽤⾃动化测试实现

3. ⾃动化测试的分类

  1. 接⼝⾃动化
  2. 性能⾃动化
  3. UI ⾃动化(Web 项⽬/APP 项⽬)
  4. 单元测试⾃动化

二、UI ⾃动测试

  • 说明: 通过[代码]或[⼯具]对软件项⽬的[界⾯]进⾏的测试过程
  • 分类: Web ⾃动化和 APP ⾃动化

1. 适合使用的项目

    1. 需求需要稳定不能频繁变更
    1. 项⽬开发周期⻓
    1. 需要频繁实现回归测试(UI ⾃动化最⼤的应⽤场景)

2. 实现时机

    1. 功能测试结束
    1. 可以与功能测试同步实现:
    • 1> 公司具备⾃动化测试组
    • 2> 部署⾃动化测试环境/分析需求/编写⾃动化测试⽤例

3. 常⻅的UI⾃动化测试⼯具

    1. QTP: QTP是⼀个商业化的功能测试⼯具,收费,⽀持web,桌⾯⾃动化测试。
    1. Selenium : Selenium是⼀个开源的web⾃动化测试⼯具,免费,主要做功能测试。
    1. Robot framework : Robot Framework是⼀个基于Python可扩展地关键字驱动的测试⾃动化框架。

4. Selenium 框架

  • 说明: Selenium 是⼀个⽤于 Web 应⽤程序的⾃动化测试⼯具
  • 特点:
    • 1> 开源: 可以根据需求进⾏⼆次开发
      -2> 跨平台: Windows/macOS/Linux 都可以使⽤
    • 3> ⽀持多语⾔: Python/Java
    • 4> ⽀持常⻅的浏览器: ⾕歌浏览器/⽕狐浏览器/IE 浏览器/欧朋浏览器/Safari 浏览器

5. Web ⾃动化环境部署

  1. Python 开发环境: Python 解释器/Python IDE(PyCharm)
  2. 安装 Selenium 包: 使⽤ pip ⼯具
  3. 安装浏览器: 推荐使⽤⾕歌/⽕狐浏览器(兼容性好), Web ⾃动化不针对浏览器类型
  4. 安装浏览器驱动: 保证能够⽤程序驱动浏览器,实现⾃动化测试(需要对应浏览器品牌和版本)
  • 详细步骤参考 selenium安装-注意全程联网操作

6. Web ⾃动化基本代码

# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象: 类名()
driver = webdriver.Chrome() # ⾕歌浏览器
# driver = webdriver.Firefox() # ⽕狐浏览器# 3. 打开⽹⻚: 必须包含协议头
driver.get('http://www.baidu.com')# 4. 观察效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()

二、元素定位

  • 说明: 计算机⽆法向⼈⼀样, 所⻅即所得, 因此需要通过⻚⾯内元素对应的代码中的相关特征来定位及操作元素
  • 特征: 标签名/属性和属性值

在这里插入图片描述

1. 浏览器开发者⼯具

  • 说明: 获取⽬标元素在⻚⾯内代码的相关信息的时候使⽤
  • 注意: 此处以⾕歌浏览器为例, ⽕狐浏览器操作步骤类似

⽅法1: 直接获取信息

在这里插入图片描述

⽅法 2: 启动开发者⼯具再获取信息

  • 启动开发者⼯具

在这里插入图片描述

  • 点选元素获取信息

在这里插入图片描述

2. 元素定位⽅法

  • 说明: Selenium 框架中⼀共提供了⼋⼤类元素定位⽅法, 只有能够定位⽬标元素, 使⽤哪⼀种⽅法没有任何限制!
  • 注意: 当⻚⾯内有多个元素的特征值是相同的时候, 定位元素的⽅法执⾏时, 默认只会获取第⼀个符合要求的特征对应的元素. 因此, 定位元素时需要尽量保证使⽤的特征值能够代表⽬标元素在当前⻚⾯内的唯⼀性!

2.1 id ⽅法

  • 需求:打开注册A.html⻚⾯,完成以下操作
  • id ⽅法: 通过⽬标元素的 id 属性值定位, 由于 id 值⼀般是唯⼀的,
  • 因此当元素存在 id 属性值时, 优先使⽤ id ⽅法定位元素
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()# 3. 打开⽹⻚
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1).使⽤id定位,输⼊⽤户名:admin
username = driver.find_element_by_id('userA')
# 输⼊⽅法: 元素对象.send_keys('内容')
username.send_keys('admin')# 2).使⽤id定位,输⼊密码:123456
password = driver.find_element_by_id('passwordA')
password.send_keys('123456')# 3).3秒后关闭浏览器窗⼝# 4. 展示效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()

2.2 name ⽅法

  • 需求:打开注册A.html⻚⾯,完成以下操作
  • name ⽅法:由于元素的 name 属性值可能存在重复, 必须确定其能够代表⽬标元素唯⼀性之后, ⽅可使⽤
  • 注意: 当⻚⾯内有多个元素的特征值是相同的时候, 定位元素的⽅法执⾏时,
  • 默认只会获取第⼀个符合要求的特征对应的元素
  • 因此, 定位元素时需要尽量保证使⽤的特征值能够代表⽬标元素在当前⻚⾯内的唯⼀性!
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象: 类名()
driver = webdriver.Chrome() # ⾕歌浏览器# 3. 打开⽹⻚: 必须包含协议头
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1).使⽤name定位⽤户名,输⼊:admin
username = driver.find_element_by_name('AAA')
username.send_keys('admin')# 2).使⽤name定位密码,输⼊:123456
password = driver.find_element_by_name('AAA')
password.send_keys('123456')# 3).3秒后关闭浏览器窗⼝# 4. 观察效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()

扩展: 确定元素定位特征值唯⼀性的⽅法

在这里插入图片描述

2.3 class_name ⽅法

  • 需求:打开注册A.html⻚⾯,完成以下操作
  • class_name ⽅法: 由于元素的 class 属性值可能存在重复, 必须确定其能够代表⽬标元素唯⼀性之后, ⽅可使⽤
  • 注意
      1. ⽅法名是 class_name, 但要找元素的 class 属性值
      1. 如果元素的 class 属性值存在多个值, 在 class_name ⽅法使⽤时, 只能使⽤其中的任意⼀个
# 1. 导⼊模块
from time import sleep
from selenium import webdriver# 2. 实例化浏览器对象: 类名()
driver = webdriver.Chrome() # ⾕歌浏览器# 3. 打开⽹⻚: 必须包含协议头
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1).通过class_name定位电话号码A,并输⼊:18611111111
tel = driver.find_element_by_class_name('telA')
tel.send_keys('18611111111')# 2).通过class_name定位电⼦邮箱A,并输⼊:123@qq.com
# mail = driver.find_element_by_class_name('emailA dzyxA') # 错误样例
# mail = driver.find_element_by_class_name('emailA') # 正确样例
mail = driver.find_element_by_class_name('dzyxA') # 正确样例
mail.send_keys('123@qq.com')# 3).3秒后关闭浏览器窗⼝# 4. 观察效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()

2.4 tag_name ⽅法

  • 需求:打开注册A.html⻚⾯,完成以下操作
  • tag_name ⽅法: 由于⻚⾯内可能存在⼤量重复的标签名, 因此必须确定其能够代表⽬标元素唯⼀性之后, ⽅可使⽤
  • 注意: 由于标签名的重复性过⾼, ⼀般做精确定位时, 都不会选择 tag_name ⽅法
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象: 类名()
driver = webdriver.Chrome() # ⾕歌浏览器# 3. 打开⽹⻚: 必须包含协议头
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1).使⽤tag_name定位⽤户名输⼊框,并输⼊:admin
# username = driver.find_element_by_tag_name('input')
# username.send_keys('admin')
# 说明: 如果⽬标元素对象在后续的代码中只使⽤⼀次, 也可以直接在定位元素结束后, 直接调⽤输⼊⽅法实现操作
driver.find_element_by_tag_name('input').send_keys('admin')
# 以下为错误样例: 不能使⽤对象变量接收元素操作⽅法的结果!!!!!!
element = driver.find_element_by_tag_name('input').send_keys('admin')
print(element)# 2).3秒后关闭浏览器窗⼝# 4. 观察效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()

2.5 定位超链接元素⽅法

  • 需求:打开注册A.html⻚⾯,完成以下操作

  • 1).使⽤link_text定位(访问 新浪 ⽹站)超链接,并点击

  • link_text ⽅法: 该⽅法只针对超链接元素(a 标签), 并且需要输⼊超链接的全部⽂本信息

  • 点击⽅法: 元素对象.click()

    • driver.find_element_by_link_text(‘访问 新浪 ⽹站’).click()
  • partial_link_text ⽅法: 该⽅法只针对超链接元素(a 标签), 并且只需要输⼊超链接的部分⽂本信息

    • driver.find_element_by_partial_link_text(‘访问’).click()
  • 注意: 虽然是只传⼊部分⽂本信息, 但是需要确定其唯⼀性, ⽅可以使⽤

# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象: 类名()
driver = webdriver.Chrome() # ⾕歌浏览器# 3. 打开⽹⻚: 必须包含协议头
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')driver.find_element_by_partial_link_text('新浪').click()# 2).3秒后关闭浏览器窗⼝# 4. 观察效果
sleep(3)# 5. 关闭⻚⾯
driver.quit()
http://www.xdnf.cn/news/158329.html

相关文章:

  • NHANES指标推荐:DI-GM
  • 用python借用飞书机器人群发布定期内容
  • ShenNiusModularity项目源码学习(23:ShenNius.Admin.Mvc项目分析-8)
  • 第十六届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学 A 组
  • 【数据结构刷题】顺序表与ArrayList
  • Linux下编译并打包MNN项目迁移至其他设备
  • Qt动态库信号崩溃问题解决方案
  • Leetcode刷题 由浅入深之哈希法——202. 快乐数
  • 机器学习(10)——神经网络
  • 《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术
  • 【人工智能之大模型】详述大模型中​AWQ(Activation-aware Weight Quantization)量化的关键步骤?
  • Three.js + React 实战系列-3D 个人主页:构建 Hero 场景组件(项目核心)✨
  • Github 2025-04-26 Rust开源项目日报Top10
  • 学习笔记——《Java面向对象程序设计》-内部类、匿名类、异常类
  • 解决Ubuntu下使用CLion构建Qt项目时找不到已安装的模块的问题
  • AI编程案例拆解|基于机器学习XX评分系统-后端篇
  • 【数据可视化-35】全球太空探索数据集(2000-2025)可视化分析
  • 通过门店销售明细表用PySpark得到每月每个门店的销冠和按月的同比环比数据
  • 数据预处理之特征选择 (Feature Selection)
  • java函数式接口与方法引用
  • Nacos简介—3.Nacos的配置简介
  • SQL盲注问题深度解析与防范策略
  • 逆向|dy|a_bogus|1.0.1.19-fix.01
  • IDE使用技巧与插件推荐
  • LLM(大语言模型)技术的最新进展可总结
  • ShaderToy学习笔记 02.圆
  • HTTP, AMQP, MQTT之间的区别和联系是什么?华为云如何适配?
  • iperf网络性能测试
  • OpenCV第6课 图像处理之几何变换(缩放)
  • compose 二维码扫描qrcode