dulip3ng 533a639cb9 doc: 添加文档注释 | 1 month ago | |
---|---|---|
common | 1 month ago | |
imgs | 1 month ago | |
pages | 1 month ago | |
tests | 1 month ago | |
.gitignore | 1 month ago | |
LICENSE | 1 month ago | |
README.md | 1 month ago | |
requirements.txt | 1 month ago |
Nebula是针对金蝶云星空设计的Web测试和自动化框架,基于微软Playwright框架能力,使用Page Object Model模式设计,它提供简单的API对云星空进行各种操作。
克隆项目至本地
git clone https://git.xxb.lttc.cn/dulip3ng/nebula.git
使用pycharm打开项目
默认创建虚拟环境点击“OK” 等待进度条完成虚拟环境创建,点击终端执行下列命令安装依赖包
pip install -r .\requirements.txt
依赖包安装完成后,在终端执行下列命令安装playwright内置浏览器
playwright install
nebula>tests>page_test目录下任选一个test开头测试文件
在open_bill()方法中配置测试库地址信息,用户登录信息 右键运行测试 观察页面正常运行,测试执行通过即为项目部署成功
页面对象模型的核心理念是,以页面(Web Page 或者 Native App Page)为单位来封装页面上的控件以及控件的部分操作。测试用例基于页面封装对象来完成具体的界面操作,最典型的模式是“XXXPage.YYYOperation"。
页面对象 | 适用范围 | 主要方法 | 加入版本 |
---|---|---|---|
BasePage | 所有 | click_blank() get_error_message() get_error_message_detail() get_warning_message() |
v1.0.0 |
LoginPage | 登录页面 | login() | v1.0.0 |
HomePage | 首页 | change_org() search_bill() close_bill_by_name() close_all_opening_bills() is_bill_opening() change_bill_tab() |
v1.0.0 |
HeadPage | 单据头 | click_button() change_sheet() set_value() set_checked() set_text_in_head_body() set_base_in_head_body() get_value() |
v1.0.0 |
BodyPage | 单据体 | change_sheet() click_button() click_line() set_value() get_row_count() get_value() set_checked() set_text_in_body_head() set_select_in_body_head() set_base_in_body_head() get_text_in_body_head() get_select_in_body_head() get_base_in_body_head() |
v1.0.0 |
ListPage | 单据列表 | wait_list_loaded() click_button() check_line_by_rows() open_bill_by_row() get_value() get_bill_no() get_row_count() check_line_by_field_value() field_filter() |
v1.0.0 |
FilterPage | 过滤框 | check_all_org() uncheck_all_org() check_org() click_tool_bar_button() set_condition() set_operator() set_logic() set_condition_value() click_ok_button() set_condition_row() filter() |
v1.0.0 |
PushPage | 选单下推页面 | push_draw_bill() | v1.0.0 |
登录页面
v1.0.0添加
用户登录操作
用法
login_page.login("dbname", "username", "password")
参数
db str
账套名称(模糊匹配)
username
用户名
password
密码
登录后的首页
v1.0.0添加
切换组织
用法
home_page.change_org("100.1")
home_page.change_org("服装营销一科")
参数
org_num str
组织名称或组织代码(模糊匹配)
v1.0.0添加
查询并打开单据
用法
home_page.search_bill("销售订单")
home_page.search_bill("销售订单列表")
home_page.search_bill("采购订单", 2)
参数
bill_name str
单据名称(精确匹配)
order int(可选)
出现同名单据时单据序号,从1开始
v1.0.0添加
点击单据页签的"x"图标关闭单据
用法
home_page.close_bill_by_name("销售订单")
home_page.close_bill_by_name("销售订单列表")
参数
bill_name str
单据名称(模糊匹配)
v1.0.0添加
关闭所有已打开单据
用法
home_page.close_all_opening_bills()
v1.0.0添加
判断单据是否是打开状态
受全局断言超时设置expect.set_options()影响,默认等待5秒
用法
home_page.is_bill_opening("销售订单")
参数
bill_name str
单据名称(模糊匹配)
返回
v1.0.0添加
在已打开单据间切换
用法
home_page.change_bill_tab("销售订单")
参数
bill_name str
单据名称(模糊匹配)
单据头
v1.0.0添加
点击单据头按钮,子按钮
用法
head_page.click_button("保存")
head_page.click_button("保存", "暂存")
参数
button_name str
按钮名称(精确匹配)
sub_button_name str(可选)
子按钮名称(精确匹配)
v1.0.0添加
切换单据头页签
用法
head_page.change_sheet("财务信息")
参数
sheet_name str
页签名称(精确匹配)
v1.0.0添加
单据头字段赋值
用法
head_page.set_value("衬衣订单号", "26024001")
head_page.set_value("销售类别", "内销")
head_page.set_value("维度选择", "内销", "袖长身长")
参数
field_name str
字段名称(精确匹配)
value str
字段值
field_type FieldType(可选)
字段类型
field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行
v1.0.0添加
单据头勾选复选框
用法
head_page.set_checked("控制发货数量")
参数
field_name str
复选框名称(精确匹配)
v1.0.0添加
单据头中的单据体文本字段赋值,如样品通知单-接收人页签
用法
head_page.set_text_in_head_body("字段名", "字段值", 1)
参数
field_name str
字段名(精确匹配)
value str
字段值
row int
行号,从1开始
v1.0.0添加
单据头中的单据体文本字段赋值,如样品通知单-接收人页签
用法
head_page.set_base_in_head_body("接收人", "张三", 1)
参数
field_name str
字段名(精确匹配)
value str
字段值
row int
行号,从1开始
v1.0.0添加
单据头字段取值
用法
head_page.get_value("衬衣订单号")
参数
field_name str
字段名称(精确匹配)
field_type str(可选)
字段类型
field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行
返回
字段值
单据体
v1.0.0添加
切换单据体页签
用法
body_page.change_sheet("明细信息")
body_page.change_sheet("物料信息", 1)
参数
sheet_name str
页签名称(精确匹配)
order int(可选)
页签序号,存在同名页签时需提供,从1开始(精确匹配)
v1.0.0添加
点击单据体按钮或子按钮
用法
body_page.click_button("新增行")
body_page.click_button("新增行", "复制行")
参数
button_name str
按钮名称(精确匹配)
sub_button_name str(可选)
子按钮名称(精确匹配)
v1.0.0添加
选中单据体行
用法
body_page.click_line(1)
参数
row int
单据体行号(从1开始)
v1.0.0添加
单据体字段赋值
用法
body_page.set_value("衬衣订单号", "26024001", 1)
body_page.set_value("成品仓库", "CPCK001", 1, 1)
参数
field_name str
字段名称(精确匹配)
value str
字段值
row int
行号(从1开始)
order int(可选)
序号,存在同名字段时指明第几个(从1开始)
field_type FieldType(可选)
字段类型
field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行
v1.0.0添加
获取单据体总行数
用法
body_page.get_row_count()
返回
行数
v1.0.0添加
单据体字段取值
用法
body_page.get_value("成品仓库", 1)
body_page.get_value("成品仓库", 1, 1)
参数
field_name str
字段名称(精确匹配)
row int
行号(从1开始)
order int(可选)
序号,存在同名字段时指明第几个(从1开始)
返回
字段值
v1.0.0添加
点击单据页签的"x"图标关闭单据
用法
body_page.set_checked("控制发货数量", 1)
参数
field_name str
复选框字段名称(精确匹配)
row int
行号(从1开始)
v1.0.0添加
单据体中单据头形式文本字段赋值,如:销售订单->物料数据->面料规格
用法
body_page.set_text_in_body_head("面料规格", "50/60")
参数
field_name str
字段名(精确匹配)
value str
字段值
v1.0.0添加
单据体中单据头形式下拉列表字段赋值,如:销售订单->物料数据->货主类型
用法
body_page.set_select_in_body_head("货主类型", "供应商")
参数
field_name str
字段名(精确匹配)
value str
字段值
v1.0.0添加
单据体中单据头形式基础资料字段赋值,如:销售订单->物料数据->面料来源
用法
body_page.set_base_in_body_head("面料来源", "自备")
参数
field_name str
字段名(精确匹配)
value str
字段值
v1.0.0添加
单据体中单据头形式文本字段取值,如:销售订单->物料数据->面料规格
用法
body_page.get_text_in_body_head("面料规格")
body_page.get_text_in_body_head("面料规格", 1)
参数
field_name str
字段名(精确匹配)
order int(可选)
序号,存在同名字段时指明第几个(从1开始)
返回
字段值
v1.0.0添加
单据体中单据头形式下拉列表字段取值,如:销售订单->物料数据->货主类型
用法
body_page.get_select_in_body_head("货主类型")
body_page.get_select_in_body_head("货主类型", 1)
参数
field_name str
字段名(精确匹配)
order int(可选)
序号,存在同名字段时指明第几个(从1开始)
返回
字段值
v1.0.0添加
单据体中单据头形式下拉列表字段取值,如:销售订单->物料数据->货主类型
用法
body_page.get_base_in_body_head("面料来源")
body_page.get_base_in_body_head("面料来源", 1)
参数
field_name str
字段名(精确匹配)
order int(可选)
序号,存在同名字段时指明第几个(从1开始)
返回
字段值
单据列表页面
v1.0.0添加
等待页面加载完成,当页面加载出第一行第一列表格时,停止等待
注意:
- 有时表格加载完成但界面仍存在wait_loading转圈图标,不做处理由playwright自动处理后续元素可操作性检查
- 默认等待时间受 expect.set_options(timeout=)全局控制
- 此方法只能检测有数据的列表是否加载完成,因为无数据时不会出现td表格元素,无法区分是否加载完成
用法
list_page.wait_list_loaded()
v1.0.0添加
点击列表按钮、子按钮或孙子按钮
用法
list_page.click_button("新增")
list_page.click_button("新增", "复制")
list_page.click_button("选项", "套打", "套打设置")
参数
button_name str
按钮名称(精确匹配)
sub_button str(可选)
子按钮名称(精确匹配)
grandson_button str(可选)
孙子按钮名称(精确匹配)
v1.0.0添加
勾选指定行
用法
list_page.check_line_by_rows(1)
list_page.check_line_by_rows(1,2,3)
参数
rows int
行号(从1开始,可填多个)
v1.0.0添加
根据行号打开单据
此方法是通过点击行号的单据编号字段打开单据,确保该行单据编号字段有值
用法
list_page.open_bill_by_row(1)
参数
row int
行号(从1开始)
v1.0.0添加
获取列表字段值
用法
list_page.get_value("衬衣订单号", 1)
参数
field_name str
字段名称(精确匹配)
row int
行号(从1开始)
返回
v1.0.0添加
根据行号获取单据编号字段值
需确保给定行号单据编号字段有值
用法
list_page.get_bill_no(1)
参数
row int
行号(从1开始)
返回
v1.0.0添加
获取列表总行数
用法
list_page.get_row_count()
返回
v1.0.0添加
根据给定字段名、字段值勾选对应行
当列表中存在多个相同字段值行时,只勾选第一行
用法
list_page.check_line_by_field_value("衬衣订单号", "26022021")
参数
field_name str
字段名(精确匹配)
value str
字段值(精确匹配)
v1.0.0添加
字段过滤,点击列表列名右侧小漏斗,进行列表简单过滤
用法
list_page.field_filter("销售类别", "内销")
参数
field_name str
字段名(精确匹配)
value str
字段值(精确匹配)
单据过滤页面
v1.0.0添加
勾选“所有组织”复选框,如果已经是勾选状态则不操作
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.check_all_org()
v1.0.0添加
取消勾选所有组织复选框,如果已经未勾选状态则不操作
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.uncheck_all_org()
v1.0.0添加
根据给定组织编码或名称,勾选组织多选列表
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.check_org("100.1")
filter_page.check_org("100.1", "鲁泰纺织股份")
参数
orgs str
组织代码或名称,可传多个(模糊匹配)
v1.0.0添加
勾选指定实体类型
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
注意:
- 未进行勾选状态判断,未勾选状态下调用一次为勾选,再次调用为取消勾选
- 综合过滤方法filter()中不执行此操作,如确需调整过滤条件所在实体,在调用filter()方法前调用此方法
用法
filter_page.check_entity("明细信息")
filter_page.check_entity("明细信息", "财务信息")
参数
entitys_name str
实体类型名称,可传多个(精确匹配)
v1.0.0添加
点击过滤框页面菜单行按钮
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.click_tool_bar_button("删除全部")
参数
button_name str
按钮名称(精确匹配)
v1.0.0添加
按行设置过滤条件项
注意:
- 绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
- 部分单据中存在相同字段名在不同页签的情况,此时模糊匹配无法找到正确选项值,推荐使用条件项全称精确匹配
用法
filter_page.set_condition(1, "基本信息-衬衣订单号")
参数
row int
行号(从1开始)
condition_name str
条件项全称(模糊匹配)
v1.0.0添加
设置过滤条件操作符号
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.set_operator(1, "包含")
参数
row int
行号(从1开始)
operator str
操作符名称(精确匹配)
v1.0.0添加
设置逻辑符号,如并且
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.set_logic(1, "并且")
参数
row int
行号(从1开始)
value str
逻辑操作符名称(精确匹配)
v1.0.0添加
条件值字段赋值
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.set_condition_value(1, "26024001")
参数
row int
行号(从1开始)
value str
条件值(精确匹配)
field_type FieldType(可选)
字段类型
field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行
v1.0.0添加
点击确定按钮,开始过滤
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.click_ok_button()
v1.0.0添加
设置一行过滤条件
绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
用法
filter_page.set_condition_row(1, "创建日期", operator="今天")
filter_page.set_condition_row(1, "衬衣订单号", "26024001")
filter_page.set_condition_row(1, "衬衣订单号", "26024", "包含")
filter_page.set_condition_row(1, "衬衣订单号", "26024", "包含", "或者")
参数
row int
行号(从1开始)
condition_name str
过滤条件名(模糊匹配)
condition_value str(可选)
过滤条件值(精确匹配)
operator str(可选)
操作符名称(精确匹配)
logic str(可选)
逻辑符名称(精确匹配)
v1.0.0添加
根据条件对象进行过滤,默认勾选全部组织
用法
cond1 = ConditionRow(1, "基本信息-衬衣订单号", "123456", "包含", "或者")
cond2 = ConditionRow(2, "单据状态", "已审核")
filter_page.filter(cond1, cond2)
参数
condition_row ConditionRow
条件行对象(可传多个)
选单下推页面
v1.0.0添加
设置单据、单据类型、转换规则、目标组织进行下推操作
用法
push_page.push_draw_bill("生产订单")
push_page.push_draw_bill("生产订单", "犀牛销售订单2生产订单", "直接入库-普通生产", "制衣事业部")
参数
bill_name str
下游单据名称(精确匹配)
rule_name str(可选)
转换规则(精确匹配)
bill_type str(可选)
单据类型(精确匹配)
org_name str(可选)
目标组织名称(精确匹配)