一、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. 自动化应用场景
-
- 回归测试: 重复性⾼/执⾏频率⾼
-
- 压⼒测试: 多⽤户/⼿⼯测试不好实现
-
- 兼容性测试: 测试条件多/⼿⼯执⾏效率差
- ⾃动化测试的作⽤: 提⾼测试效率, 保证软件产品质量
2. ⾃动化测试的优缺点
- 优点:
-
- 较少的时间内运⾏更多的测试⽤例;
-
- ⾃动化脚本可重复运⾏;
-
- 减少⼈为的错误;
-
- 克服⼿⼯测试的局限性;
-
- 缺点:
-
- ⾃动化测试可以完全替代⼿⼯测试: ⾃动化测试实现步骤要依赖⼿⼯实现
-
- ⾃动化测试⼀定⽐⼿⼯测试厉害: 只是存在⾼薪和⼊⻔⻔槛的原因导致的
-
- ⾃动化测试可以发掘更多的BUG: UI 界⾯布局⼀类的问题, ⾃动化测试⽆法解决
-
- ⾃动化测试适⽤于所有功能: 功能测试逻辑复杂的/涉及第三⽅交互的都不适合使⽤⾃动化测试实现
-
3. ⾃动化测试的分类
- 接⼝⾃动化
- 性能⾃动化
- UI ⾃动化(Web 项⽬/APP 项⽬)
- 单元测试⾃动化
二、UI ⾃动测试
- 说明: 通过[代码]或[⼯具]对软件项⽬的[界⾯]进⾏的测试过程
- 分类: Web ⾃动化和 APP ⾃动化
1. 适合使用的项目
-
- 需求需要稳定不能频繁变更
-
- 项⽬开发周期⻓
-
- 需要频繁实现回归测试(UI ⾃动化最⼤的应⽤场景)
2. 实现时机
-
- 功能测试结束
-
- 可以与功能测试同步实现:
- 1> 公司具备⾃动化测试组
- 2> 部署⾃动化测试环境/分析需求/编写⾃动化测试⽤例
3. 常⻅的UI⾃动化测试⼯具
-
- QTP: QTP是⼀个商业化的功能测试⼯具,收费,⽀持web,桌⾯⾃动化测试。
-
- Selenium : Selenium是⼀个开源的web⾃动化测试⼯具,免费,主要做功能测试。
-
- Robot framework : Robot Framework是⼀个基于Python可扩展地关键字驱动的测试⾃动化框架。
4. Selenium 框架
- 说明: Selenium 是⼀个⽤于 Web 应⽤程序的⾃动化测试⼯具
- 特点:
- 1> 开源: 可以根据需求进⾏⼆次开发
-2> 跨平台: Windows/macOS/Linux 都可以使⽤ - 3> ⽀持多语⾔: Python/Java
- 4> ⽀持常⻅的浏览器: ⾕歌浏览器/⽕狐浏览器/IE 浏览器/欧朋浏览器/Safari 浏览器
- 1> 开源: 可以根据需求进⾏⼆次开发
5. Web ⾃动化环境部署
- Python 开发环境: Python 解释器/Python IDE(PyCharm)
- 安装 Selenium 包: 使⽤ pip ⼯具
- 安装浏览器: 推荐使⽤⾕歌/⽕狐浏览器(兼容性好), Web ⾃动化不针对浏览器类型
- 安装浏览器驱动: 保证能够⽤程序驱动浏览器,实现⾃动化测试(需要对应浏览器品牌和版本)
- 详细步骤参考 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 属性值可能存在重复, 必须确定其能够代表⽬标元素唯⼀性之后, ⽅可使⽤
- 注意
-
- ⽅法名是 class_name, 但要找元素的 class 属性值
-
- 如果元素的 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()