学习路径
环境搭建
安装selenium
- 命令行安装:
pip install selenium
- 界面化安装:settings → project → python interpreter
安装 chromedriver
旧版本:https://chromedriver.storage.googleapis.com/index.html
新版本:Chrome for Testing availability
配置环境变量:
win:path 配置下载的目录 d:\chromedrive
mac: export PATH=$PATH:[chromedriver所在路径]
命令行输入:chromedriver --version 出现版本信息验证成功
控件定位和交互
控件定位
八大定位
定位方式 | 描述 |
---|---|
class name | class 属性对应的值 |
css selector(重点) | css 表达式 |
id(重点) | id 属性对应的值 |
name(重点) | name 属性对应的值 |
link text | 查找其可见文本与搜索值匹配的锚元素 |
partial link text | 查找其可见文本包含搜索值的锚元素。如果多个元素匹配,则只会选择第一个元素 |
tag name | 标签名称 |
xpath(重点) | xpath 表达式 |
css 常见操作
表达式 | 描述 |
---|---|
.intro | class=“intro” 的所有元素 |
#firstname | id=“firstname” 的所有元素 |
a[target=“_blank”] | 具有属性 target=“_blank” 的所有 a 元素 |
p:nth-child(2) | 属于其父元素的第二个 p 元素 |
xpath 规则
表达式 | 结果 |
---|---|
/ | 从该节点的子元素选取 |
// | 从该节点的子孙元素选取 |
* | 通配符 |
nodename | 选取此节点的所有子节点 |
.. |
选取当前节点的父节点 |
@ | 选取属性 |
控件交互
- 元素查找
- 查找单个元素 find_element
- 查找多个元素 find_elements
- 元素操作
- 点击 ele.click()
- 清空 ele.clear()
- 输入 ele.send_keys()
- 元素获取
- 获取元素文本 ele.text
- 获取元素属性 ele.get_attribute
自动化测试用例结构
自动化测试用例 | 作用 | |
---|---|---|
用例标题 | 测试包、文件、类、方法名称 | 用例的唯一标识 |
前提条件 | setup、setup_class | 测试数据构造, |
用例步骤 | 测试方法内的代码逻辑 | 测试用例具体的步骤行为 |
预期结果 | assert 实际结果 = 预期结果 | 断言,印证用例是否执行成功 |
实际结果 | assert 实际结果 = 预期结果 | 断言,印证用例是否执行成功 |
后置动作 | teardown、teardown_class(Pytest) | 数据清理,数据还原 |
自动化关键数据记录
- 日志
- 页面源码:driver.page_source
- 截图: driver.save_screenshot
import logging
import os
from logging.handlers import RotatingFileHandler
# 绑定绑定句柄到logger对象
logger = logging.getLogger(__name__)
# 获取当前⼯具⽂件所在的路径
root_path = os.path.dirname(os.path.abspath(__file__))
# 拼接当前要输出⽇志的路径
log_dir_path = os.sep.join([root_path, '..', f'/logs'])
if not os.path.isdir(log_dir_path):
os.mkdir(log_dir_path)
# 创建⽇志记录器,指明⽇志保存路径,每个⽇志的⼤⼩,保存⽇志的上限
file_log_handler = RotatingFileHandler(os.sep.join([log_dir_path, 'log.txt']),
maxBytes=1024 * 1024, backupCount=10, encoding="utf-8")
# 设置⽇志的格式
date_string = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(
'[%(asctime)s] [%(levelname)s] [%(filename)s]/[line: %(lineno)d]/[%(funcName)s] %(message)s ', date_string)
# ⽇志输出到控制台的句柄
stream_handler = logging.StreamHandler()
# 将⽇志记录器指定⽇志的格式
file_log_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# 为全局的⽇志⼯具对象添加⽇志记录器
# 绑定绑定句柄到logger对象
logger.addHandler(stream_handler)
logger.addHandler(file_log_handler)
# 设置⽇志输出级别
logger.setLevel(level=logging.INFO)
实战练习
- 场景:雪球搜索功能
- 地址:https://xueqiu.com/
用例
用例标题 | 类型 | 前提条件 | 用例步骤 | 预期结果 | 实际结果 |
---|---|---|---|---|---|
雪球搜索功能 | 正例 | 进入雪球首页 | 1.输入搜索关键词 2.点击搜索按钮 3.点击讨论 4.选择第一篇文章(可以跳转新页面) |
搜索成功,正文包含搜索的关键字 |
要求:
- 完成自动化用例编写
- 添加日志、截图和源码信息
- 添加对应的断言信息
总结
- 知识点梳理
- 环境搭建
- 知识点回顾
- 实战练习