Documentation
¶
Overview ¶
Package web 提供 Web 页面测试的辅助工具
本包基于 agouti 库提供了 Web 页面操作的封装方法,用于编写端到端(E2E)测试,简化浏览器自动化操作。
主要功能:
- 页面元素定位和操作(点击、输入、获取文本等)
- 页面内容验证(包含、不包含、CSS 样式等)
- 鼠标操作(移动、点击等)
- 等待和导航控制
使用场景:
- Web 应用的 UI 自动化测试
- 浏览器兼容性测试
- 交互功能验证测试
技术栈:
- agouti: Go 语言的 Web 驱动库
- testify: Go 语言的测试断言库
核心概念:
- Page: 页面结构体,封装了 agouti.Page 和测试相关的信息
- 元素定位: 使用 XPath 或选择器定位页面元素
- 元素操作: 点击、输入、获取文本、获取属性等
- 页面验证: 验证页面内容、CSS 样式、元素状态等
- 等待控制: 等待页面加载、动画效果、异步操作等
- 导航控制: 导航到指定页面
- 错误处理: 捕获 panic 并打印堆栈信息
- 资源清理: 销毁页面对象,停止浏览器驱动
元素定位方式:
- XPath: 使用 XPath 表达式定位元素
- Selection: 使用 agouti.Selection 对象定位元素
元素操作类型:
- 点击: Click、ClickS
- 输入: Fill
- 获取文本: Text
- 获取属性: Attr、Value
- 获取 CSS: Css、CssS
页面验证类型:
- 内容验证: Contain、NoContain
- CSS 验证: Css、CssS、Display、Nondisplay
- 文本验证: Text
- 属性验证: Attr、Value
鼠标操作类型:
- 移动: MoveMouseBy
等待控制:
- Wait: 等待指定的时间
- Click: 点击后自动等待(默认 1 秒)
- NavigateTo: 导航后自动等待(2 秒)
导航控制:
- NavigateTo: 导航到指定路径
错误处理:
- Destroy: 捕获 panic 并打印堆栈信息
- 断言失败: 使用 assert 包进行断言,失败时标记测试失败
资源清理:
- Destroy: 销毁页面对象,停止浏览器驱动
- Quit: 发送退出信号
注意事项:
- 需要确保浏览器驱动已正确安装
- 需要确保页面元素已正确加载
- 需要确保 XPath 表达式正确
- 需要确保等待时间足够
- 需要确保测试环境稳定
作者: GoAdmin Team 创建日期: 2020-01-01 版本: 1.0.0
Package web 提供用户验收测试(UAT)的测试框架 包描述:
该包提供了完整的用户验收测试框架,用于自动化测试Web应用的UI交互 基于agouti库和ChromeDriver实现浏览器自动化操作
主要功能:
- 提供测试套件框架(UserAcceptanceTestSuit)
- 管理浏览器驱动和页面生命周期
- 支持本地和远程(无头模式)测试
- 提供测试辅助工具和颜色输出
核心组件:
- Testers: 测试函数类型,定义测试逻辑
- ServerStarter: 服务器启动函数类型,用于启动测试服务器
- UserAcceptanceTestSuit: 主测试套件函数
使用场景:
- Web应用的端到端(E2E)测试
- 用户验收测试(UAT)
- UI自动化测试
- 回归测试
技术栈:
- agouti: Go语言的Web驱动库
- ChromeDriver: Chrome浏览器的WebDriver
- ansi: 终端颜色输出库
- GoAdmin: Go后台管理框架
依赖说明:
- 需要安装Chrome浏览器和对应版本的ChromeDriver
- ChromeDriver版本必须与Chrome版本匹配
- 使用以下链接获取最新版本: https://googlechromelabs.github.io/chrome-for-testing/
作者: GoAdmin Team 创建日期: 2020-01-01
Index ¶
- func UserAcceptanceTestSuit(t *testing.T, testers Testers, serverStarter ServerStarter, local bool, ...)
- type Page
- func (page *Page) Attr(s *agouti.Selection, attr, res string)
- func (page *Page) Click(xpath string, intervals ...int)
- func (page *Page) ClickS(s *agouti.Selection, intervals ...int)
- func (page *Page) Contain(s string)
- func (page *Page) Css(xpath, css, res string)
- func (page *Page) CssS(s *agouti.Selection, css, res string)
- func (page *Page) Destroy()
- func (page *Page) Display(xpath string)
- func (page *Page) Fill(xpath, content string)
- func (page *Page) MoveMouseBy(xOffset, yOffset int)
- func (page *Page) NavigateTo(path string)
- func (page *Page) NoContain(s string)
- func (page *Page) Nondisplay(xpath string)
- func (page *Page) Text(xpath, text string)
- func (page *Page) Value(xpath, value string)
- func (page *Page) Wait(t int)
- type ServerStarter
- type Testers
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func UserAcceptanceTestSuit ¶
func UserAcceptanceTestSuit(t *testing.T, testers Testers, serverStarter ServerStarter, local bool, options ...string)
UserAcceptanceTestSuit 用户验收测试套件 描述:
提供完整的用户验收测试框架,自动化执行UI测试 管理浏览器驱动、页面生命周期和测试执行流程
参数:
- t: testing.T对象,用于测试断言和报告
- testers: Testers类型,包含具体的测试逻辑
- serverStarter: ServerStarter类型,用于启动测试服务器
- local: bool类型,是否在本地运行(true=显示浏览器窗口,false=无头模式)
- options: 可变参数,Chrome浏览器启动选项
功能:
- 启动测试服务器(通过serverStarter)
- 配置Chrome浏览器选项(默认或自定义)
- 启动ChromeDriver和浏览器
- 创建新页面
- 执行测试逻辑(通过testers)
- 清理资源(关闭页面、停止驱动、停止服务器)
默认Chrome选项说明:
- --user-agent: 设置用户代理字符串(模拟Mac Chrome浏览器)
- --window-size: 设置浏览器窗口大小(1500x900像素)
- --incognito: 使用无痕模式
- --blink-settings=imagesEnabled=true: 启用图片加载
- --no-default-browser-check: 禁用默认浏览器检查
- --ignore-ssl-errors=true: 忽略SSL错误
- --ssl-protocol=any: 允许任意SSL协议
- --no-sandbox: 禁用沙箱(用于CI/CD环境)
- --disable-breakpad: 禁用崩溃报告
- --disable-gpu: 禁用GPU加速
- --disable-logging: 禁用日志
- --no-zygote: 禁用zygote进程
- --allow-running-insecure-content: 允许运行不安全内容
- --headless: 无头模式(仅当local=false时添加)
使用场景:
- 本地开发时进行UI测试(local=true)
- CI/CD流水线中进行自动化测试(local=false)
- 回归测试
- 用户验收测试(UAT)
重要说明:
- 确保ChromeDriver版本与Chrome浏览器版本匹配
- 使用以下链接获取最新版本: https://googlechromelabs.github.io/chrome-for-testing/
- 测试失败时会panic,错误信息会包含详细原因
使用示例:
func TestLogin(t *testing.T) {
UserAcceptanceTestSuit(t, myTesters, startServer, false)
}
错误处理:
- 启动驱动失败: panic "failed to start driver"
- 打开页面失败: panic "failed to open page"
- 关闭页面失败: 打印错误信息但不中断
- 停止驱动失败: 打印错误信息但不中断
Types ¶
type Page ¶
type Page struct {
*agouti.Page // agouti.Page 对象,用于浏览器页面操作
T *testing.T // testing.T 对象,用于测试断言和报告
Driver *agouti.WebDriver // agouti.WebDriver 对象,用于浏览器驱动管理
Quit chan struct{} // 退出通道,用于通知测试结束
}
Page 页面结构体
描述:
封装了 agouti.Page 和测试相关的信息,提供便捷的页面操作方法。
字段说明:
- Page: agouti.Page 对象,用于浏览器页面操作
- T: testing.T 对象,用于测试断言和报告
- Driver: agouti.WebDriver 对象,用于浏览器驱动管理
- Quit: 退出通道,用于通知测试结束
使用示例:
page := &Page{
Page: driver.NewPage(),
T: t,
Driver: driver,
Quit: make(chan struct{}),
}
注意事项:
- 需要确保 Page 对象已正确初始化
- 需要确保 T 对象已正确传入
- 需要确保 Driver 对象已正确初始化
- 需要确保 Quit 通道已正确创建
func (*Page) Attr ¶
Attr 验证指定选择器元素的属性值
参数:
- s: agouti.Selection 对象,表示元素选择器
- attr: 属性名(如 value、href、class 等)
- res: 期望的属性值
功能:
- 通过选择器定位元素
- 获取元素的指定属性值
- 验证属性值是否匹配期望值
使用场景:
- 验证链接的 href 属性
- 验证图片的 src 属性
- 验证元素的 class 属性
- 验证自定义属性
断言:
- 属性获取不能出错
- 属性值必须等于期望值
注意事项:
- Selection 对象需要正确
- 属性名需要正确
- 属性值区分大小写
- 需要确保元素已加载完成
func (*Page) Click ¶
Click 点击指定 XPath 元素
参数:
- xpath: 元素的 XPath 表达式
- intervals: 可选参数,点击后等待的秒数(默认为 1 秒)
功能:
- 通过 XPath 定位元素
- 点击该元素
- 等待指定时间(默认 1 秒)
使用场景:
- 点击按钮
- 点击链接
- 点击复选框、单选框
- 点击菜单项
说明:
intervals 为可变参数,如果不提供则默认等待 1 秒。
断言:
- 点击操作不能出错
注意事项:
- XPath 表达式需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
- 需要确保元素可点击
func (*Page) ClickS ¶
ClickS 点击指定选择器元素
参数:
- s: agouti.Selection 对象,表示元素选择器
- intervals: 可选参数,点击后等待的秒数(默认为 1 秒)
功能:
- 通过选择器定位元素
- 点击该元素
- 等待指定时间(默认 1 秒)
使用场景:
- 点击按钮
- 点击链接
- 点击复选框、单选框
- 点击菜单项
说明:
与 Click 方法的区别是使用 Selection 对象而不是 XPath。 intervals 为可变参数,如果不提供则默认等待 1 秒。
断言:
- 点击操作不能出错
注意事项:
- Selection 对象需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
- 需要确保元素可点击
func (*Page) Contain ¶
Contain 验证页面 HTML 内容是否包含指定字符串
参数:
- s: 要查找的字符串
功能:
- 获取页面 HTML 内容
- 验证是否包含指定字符串
使用场景:
- 验证页面是否显示了特定内容
- 验证操作是否成功
- 验证错误消息是否显示
断言:
- HTML 获取不能出错
- 必须包含指定字符串
注意事项:
- 字符串区分大小写
- 字符串需要转义特殊字符
- 需要确保页面已加载完成
func (*Page) Css ¶
Css 验证指定 XPath 元素的 CSS 样式属性值
参数:
- xpath: 元素的 XPath 表达式
- css: CSS 属性名(如 display、color 等)
- res: 期望的 CSS 属性值
功能:
- 通过 XPath 定位元素
- 获取元素的指定 CSS 属性值
- 验证 CSS 属性值是否匹配期望值
使用场景:
- 验证元素的显示状态(display: block/none)
- 验证元素的颜色、字体等样式
- 验证元素的布局属性
断言:
- CSS 属性获取不能出错
- CSS 属性值必须等于期望值
注意事项:
- XPath 表达式需要正确
- CSS 属性名需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
func (*Page) CssS ¶
CssS 验证指定选择器元素的 CSS 样式属性值
参数:
- s: agouti.Selection 对象,表示元素选择器
- css: CSS 属性名(如 display、color 等)
- res: 期望的 CSS 属性值
功能:
- 通过选择器定位元素
- 获取元素的指定 CSS 属性值
- 验证 CSS 属性值是否匹配期望值
使用场景:
- 验证元素的显示状态(display: block/none)
- 验证元素的颜色、字体等样式
- 验证元素的布局属性
说明:
与 Css 方法的区别是使用 Selection 对象而不是 XPath。
断言:
- CSS 属性获取不能出错
- CSS 属性值必须等于期望值
注意事项:
- Selection 对象需要正确
- CSS 属性名需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
func (*Page) Destroy ¶
func (page *Page) Destroy()
Destroy 销毁页面并清理资源
功能:
- 捕获 panic 并打印堆栈信息
- 销毁页面对象
- 停止浏览器驱动
- 标记测试失败
- 发送退出信号
使用场景:
- 测试结束时清理资源
- 发生 panic 时的错误处理
说明:
该方法使用 defer 调用,确保在任何情况下都能正确清理资源。 如果发生 panic,会打印堆栈信息,销毁页面对象,停止浏览器驱动, 标记测试失败,并发送退出信号。
注意事项:
- 该方法应该使用 defer 调用
- 该方法会捕获 panic 并处理
- 该方法会标记测试失败
- 该方法会发送退出信号
func (*Page) Display ¶
Display 验证指定 XPath 元素的 display 属性为 block
参数:
- xpath: 元素的 XPath 表达式
功能:
- 验证元素的 display CSS 属性值为 block
- 即验证元素是否可见(块级显示)
使用场景:
- 验证元素是否显示
- 验证操作后元素是否出现
- 验证展开/折叠效果
说明:
内部调用 Css 方法验证 display 属性。
注意事项:
- XPath 表达式需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
func (*Page) Fill ¶
Fill 向指定 XPath 元素填充内容
参数:
- xpath: 元素的 XPath 表达式
- content: 要填充的内容
功能:
- 通过 XPath 定位元素
- 向元素填充指定的内容
使用场景:
- 向输入框输入文本
- 向文本域输入多行文本
- 向可编辑元素输入内容
说明:
通常用于 input、textarea 等可输入元素。
断言:
- 填充操作不能出错
注意事项:
- XPath 表达式需要正确
- 需要确保元素已加载完成
- 需要确保元素可见
- 需要确保元素可编辑
func (*Page) MoveMouseBy ¶
MoveMouseBy 移动鼠标到指定偏移量位置
参数:
- xOffset: X 轴偏移量(像素)
- yOffset: Y 轴偏移量(像素)
功能:
- 将鼠标从当前位置移动到指定偏移量的位置
使用场景:
- 测试悬停效果
- 测试拖拽操作
- 测试鼠标交互效果
断言:
- 鼠标移动操作不能出错
注意事项:
- 偏移量可以是正数或负数
- 需要确保鼠标位置有效
- 需要确保页面已加载完成
func (*Page) NavigateTo ¶
NavigateTo 导航到指定路径
参数:
- path: 要导航到的 URL 路径
功能:
- 导航到指定的 URL 路径
- 等待 2 秒让页面加载完成
使用场景:
- 打开指定页面
- 页面跳转测试
- 测试页面导航功能
说明:
导航后会自动等待 2 秒,确保页面加载完成。
断言:
- 导航操作不能出错
注意事项:
- URL 路径需要正确
- 需要确保页面可访问
- 需要确保网络连接正常
func (*Page) NoContain ¶
NoContain 验证页面 HTML 内容是否不包含指定字符串
参数:
- s: 要查找的字符串
功能:
- 获取页面 HTML 内容
- 验证是否不包含指定字符串
使用场景:
- 验证页面是否不显示特定内容
- 验证操作后内容是否消失
- 验证错误消息是否隐藏
断言:
- HTML 获取不能出错
- 必须不包含指定字符串
注意事项:
- 字符串区分大小写
- 字符串需要转义特殊字符
- 需要确保页面已加载完成
func (*Page) Nondisplay ¶
Nondisplay 验证指定 XPath 元素的 display 属性为 none
参数:
- xpath: 元素的 XPath 表达式
功能:
- 验证元素的 display CSS 属性值为 none
- 即验证元素是否隐藏
使用场景:
- 验证元素是否隐藏
- 验证操作后元素是否消失
- 验证展开/折叠效果
说明:
内部调用 Css 方法验证 display 属性。
注意事项:
- XPath 表达式需要正确
- 需要确保元素已加载完成
func (*Page) Text ¶
Text 验证指定 XPath 元素的文本内容
参数:
- xpath: 元素的 XPath 表达式
- text: 期望的文本内容
功能:
- 通过 XPath 定位元素
- 获取元素的文本内容
- 验证文本内容是否匹配期望值
使用场景:
- 验证按钮文本是否正确
- 验证标题、标签等文本内容
- 验证错误提示信息
断言:
- 文本获取不能出错
- 文本内容必须等于期望值
注意事项:
- XPath 表达式需要正确
- 文本内容区分大小写
- 需要确保元素已加载完成
- 需要确保元素可见
type ServerStarter ¶
type ServerStarter func(quit chan struct{})
ServerStarter 服务器启动函数类型 描述:
定义了服务器启动函数的类型签名,用于启动测试服务器
参数:
- quit: 退出通道,用于通知服务器停止
使用示例:
func startServer(quit chan struct{}) {
go func() {
<-quit
// 停止服务器
}()
// 启动服务器
}
说明:
该类型用于UserAcceptanceTestSuit函数,允许传入自定义的服务器启动逻辑