# hat
**Repository Path**: stephenchow93/hat
## Basic Information
- **Project Name**: hat
- **Description**: hat 是(Hello)自动化(Automate)测试(testing)缩写,是一个自动化测试方案。
hatapi:接口自动化测试
hatweb:WEB自动化测试
hatapp:APP自动化测试
hatload:负载自动化测试
- **Primary Language**: Python
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 51
- **Created**: 2019-08-30
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# hat
#### 项目介绍
`hat` 是深圳汇智(`Hello`)自动化(`Automate`)测试(`Testing`)缩写,是一个自动化测试方案。目前已经放到 gitee.com 码云,是国内版本的 github.com.
gitee.com 上的项目地址:https://gitee.com/szcdtest/hat
git 是一个源代码管理工具,类似于 SVN。
#### 软件架构
hat 方案的结构如下,基于 Python 语言
```markdown
hat
|_base/ : 存放的是底层封装好的类
|_biz/ : 存放的业务代码
|_case/ : 存放的测试用例
|_runner/ : 存放的测试运行器
|_main.py : 整个方案的入口
|_requirements.txt : 提供了该方案所需要的依赖包
```
#### 安装教程
1. 安装 Python
2. 安装 依赖包
```bash
pip install -r requirements.txt
```

3. 安装 浏览器和对应的浏览器驱动
4. 安装完毕
#### 使用说明
1. 最简单的使用步骤
1. 使用 PyCharm 打开 hat 项目
2. 直接创建一个 demo.py
```python
# 第一步:从 base 文件夹里面的 box.py 导入 BoxDriver 这个类
from base.box import BoxDriver
# 第二步:实例化 BoxDriver 类,赋值给对象 browser,可以使用 BoxDriver() 直接实例化,不传参数
# 不传参数,默认使用 Chrome 浏览器
browser = BoxDriver()
browser.navigate("https://www.baidu.com")
browser.forced_wait(2)
browser.type("kw", "汇智动力 hat 自动化测试")
browser.click("su")
browser.forced_wait(2)
if "汇智动力" in browser.get_title():
print("搜索关键字成功!")
else:
print("没有进行搜索!")
browser.quit()
```
运行上面的结果,实际上就是 打开百度,输入 “汇智动力 hat 自动化测试”,按 “百度一下”按钮。如果标题有 “汇智动力”四个字,就代表执行成功。
3. 具体执行第一步:打开百度,找到搜索输入框的元素,查看HTTML TAG(标签) 元素。

```html
```
于是选择 `id="kw"` 定位。使用的是 `browser.type('kw', "内容")`
4. 输入以后,再定位 ”百度一下“按钮

```html
```
这里又一个 `id="su"`,也使用了 `browser.click("su")`
2. 正常的使用
1. 直接运行测试
1. 如果你能访问 "http://192.168.1.251/ranzhi/www" 然之栗子程序,可以直接运行
2. 打开 main.py
3. 右键 | run main
4. 如果不能访问的话,在用例修改栗子程序的网址。参考第3条
2. 编写测试数据
1. 首先要查看 runner\×××_runner.py 运行的是哪个测试运行器的数据
2. 具体查看测试运行器的数据 在 runner\data\×××_data.csv
3. 例如分析
```
class,test,count
RanzhiTest,test_01,1
```
说明是 测试类是 RanzhiTest,测试方法是 test_01,运行次数是 1
4. 再找到 RanzhiTest 类所在的文件,判断里面用的数据是哪个CSV
5. 根据用例的逻辑,修改 CSV
6. 运行 main
7. 右键 | run main
8. 运行结果会生成两个
1. runner\report\ 生成一个报告
2. runner\log\ 生成一个日志
3. 编写测试用例
1. 在 case 中创建一个文件 tpshop_test.py, 类名是 TpshopTest
2. 类需要继承 base.box(base\box.py文件) 这里的 TestCase 类
3. 写 set_up() 和 tear_down()
1. set_up() 实例化 BoxDriver
2. set_up() 实例化被测试的 Page
```python
self.base_driver = BoxDriver()
# 必须把浏览器 self.base_driver 告诉业务,让业务操作在指定的浏览器中进行
self.login_page = LoginPage(self.base_driver)
# LoginPage类的构造方法 __init__(self, driver: BoxDriver)
```
4. 写 test_ 开头的方法进行测试步骤和断言,假设 test_abc
```python
self.login_page.login("admin", "123456")
# 如果对当前的浏览器状态需要截图
# 这里对当前步骤进行截图
# 旧的方式
self.images.append(self.base_driver.save_window_snapshot_by_io())
# 新的方式
self.snapshot()
# 添加日志
# 老的方式
self.logger.info("刚刚进行了繁体语言切换截图")
# 新的方式
self.log("刚刚进行了繁体语言切换截图")
# 读 CSV 作为字典
csv_data = self.read_data_as_dict("./case/data/zone_test_02_zone_menu.csv")
```
添加到 TestRunner 里面,运行 main
添加一个 CSV 文件
```
class,test,count
TpshopTest,test_abc,5
```
5. 右键 main | run main
4. 编写测试业务
1. 实际上是写 Page,主要用到的是 BoxDriver
1. type
2. click
3. ...
5. 修改底层封装
1. 实际上是写 box.py
3. BoxDriver方法(下划线开头私有方法)
| 方法名 | 功能 | 参数 |
| :--------------------------- | :------------------------- | :------------------------- |
| `__init__()` | 构造方法,实例化对应的浏览器驱动 | browser_type(浏览器类型) |
| `clear_cookies`() | 清除浏览器缓存 | 无 |
| `add_cookies`() | 添加一组cookie | cookies |
| `add_cookie`() | 添加一个cookie | cookie |
| `remove_cookie`() | 删除一个cookie | cookie名 |
| `refresh`() | 刷新浏览器 | 无 |
| `maximize_window`() | 窗口最大化 | 无 |
| `navigate()` | 打开网址 | url |
| `close_browser()` | 关闭浏览器 | 无 |
| `quit()` | 退出驱动 | 无 |
| `type()` | 清空输入框,输入文本信息 | (selector定位,text) |
| `click()` | 点击 | selector定位 |
| `click_by_enter` | 输入回车 | selector定位 |
| `submit()` | 提交表单 | selector定位 |
| `move_to()` | 鼠标移动到指定元素 | selector定位 |
| `right_click()` | 鼠标右击元素 | selector定位 |
| `count_elements()` | 统计定位一组元素的个数 | selector定位 |
| `drag_element()` | 鼠标拖拽元素 | from_selector,to_selector |
| `lost_focus()` | 当前元素失去焦点 | 无 |
| `select_by_index()` | Select通过下标选择元素 | selector,index(下标) |
| `select_by_visible_text()` | Select通过可见文本选择元素 | selector,text(可见文本) |
| `select_by_value()` | Select通过value选择元素 | selector,value |
| `get_selected_text()` | Select获取选中 文本信息 | selector |
| `execute_js()` | 执行js脚本 | 无 |
| `get_value()` | 获取元素的值 | selector |
| `et_attribute()` | 获取元素的属性值 | selector,attribute |
| `get_text()` | 获取元素的文本信息 | selector |
| `get_displayed()` | 判断元素是否存在 | selector |
| `get_title()` | 获取网页标题 | 无 |
| `get_url()` | 获取当前网址 | 无 |
| `get_selected()` | 判断元素是否被勾选 | selector |
| `get_text_list()` | 获取一组元素的文本 | selector |
| `accept_alert()` | 确定浏览器弹出框 | 无 |
| `dismiss_alert()` | 取消浏览器弹出框 | 无 |
| `switch_to_frame()` | 进入框体 | 框体selector |
| `switch_to_default()` | 退出所有框体 | 无 |
| `switch_to_window_by_title()` | 切换到指定标题的窗口 | title |
| `open_new_window()` | selector打开新窗口,切换进入框体 | selector |
| `save_window_snapshot()` | 截图 | 无 |
| `save_window_snapshot_by_io()` | 保存截图为文件流 | 无 |
| `forced_wait()` | 强制等待 | seconds(秒数) |
| `implicitly_wait()` | 智能等待 | seconds(秒数) |
| `explicitly_wait()` | 显式等待s秒,直到元素加载出来 | selector,seconds |
#### 参与贡献
1. Fork 本项目
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 码云特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/)
6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)