No Description

dulip3ng 533a639cb9 doc: 添加文档注释 1 month ago
common bea528b076 add: list_page 1 month ago
imgs a7c63a0b3c 1. 删除site项目文档目录 1 month ago
pages a7c63a0b3c 1. 删除site项目文档目录 1 month ago
tests 3ae5c6d6a8 add: push_page 1 month ago
.gitignore 2f36e4440d add: 单据体页面模型,定位器 1 month ago
LICENSE 9614843049 Initial commit 1 month ago
README.md 533a639cb9 doc: 添加文档注释 1 month ago
requirements.txt 09176a8c09 add: 登录页、主页、单据头页页面模型,定位器,定位器自检代码 1 month ago

README.md

Nebula

Nebula是针对金蝶云星空设计的Web测试和自动化框架,基于微软Playwright框架能力,使用Page Object Model模式设计,它提供简单的API对云星空进行各种操作。

安装

环境

  1. git安装 https://blog.csdn.net/mukes/article/details/115693833
  2. python安装(3.8版本以上)https://blog.csdn.net/junleon/article/details/120698578
  3. pycharm安装 https://blog.csdn.net/junleon/article/details/120698578

配置

克隆项目至本地

git clone https://git.xxb.lttc.cn/dulip3ng/nebula.git

使用pycharm打开项目

默认创建虚拟环境点击“OK” img_1.png 等待进度条完成虚拟环境创建,点击终端执行下列命令安装依赖包

pip install -r .\requirements.txt

依赖包安装完成后,在终端执行下列命令安装playwright内置浏览器

playwright install

验证

nebula>tests>page_test目录下任选一个test开头测试文件

在open_bill()方法中配置测试库地址信息,用户登录信息 img_5.png 右键运行测试 img_4.png 观察页面正常运行,测试执行通过即为项目部署成功 img_6.png

页面对象

页面对象模型(Page Object Model POM)

页面对象模型的核心理念是,以页面(Web Page 或者 Native App Page)为单位来封装页面上的控件以及控件的部分操作。测试用例基于页面封装对象来完成具体的界面操作,最典型的模式是“XXXPage.YYYOperation"。

Nebula页面模型划分

LgoinPage 登录页面

img_7.png

HomePage 首页

img_8.png

HeadPage 单据头

img_9.png

BodyPage 单据体

img_10.png

ListPage 单据列表

img_11.png

FilterPage 过滤框

img_12.png

PushPage 选单下推页面

img_13.png

页面对象API概览

页面对象 适用范围 主要方法 加入版本
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

API说明

LoginPage类

登录页面

login()

v1.0.0添加

用户登录操作

用法

login_page.login("dbname", "username", "password")

参数

  • db str

    账套名称(模糊匹配)

  • username

    用户名

  • password

    密码

HomePage类

登录后的首页

change_org()

v1.0.0添加

切换组织

用法

home_page.change_org("100.1")
home_page.change_org("服装营销一科")

参数

  • org_num str

    组织名称或组织代码(模糊匹配)

search_bill()

v1.0.0添加

查询并打开单据

用法

home_page.search_bill("销售订单")
home_page.search_bill("销售订单列表")
home_page.search_bill("采购订单", 2)

参数

  • bill_name str

    单据名称(精确匹配)

  • order int(可选)

    出现同名单据时单据序号,从1开始

close_bill_by_name()

v1.0.0添加

点击单据页签的"x"图标关闭单据

用法

home_page.close_bill_by_name("销售订单")
home_page.close_bill_by_name("销售订单列表")

参数

  • bill_name str

    单据名称(模糊匹配)

close_all_opening_bills()

v1.0.0添加

关闭所有已打开单据

用法

home_page.close_all_opening_bills()

is_bill_opening()

v1.0.0添加

判断单据是否是打开状态

受全局断言超时设置expect.set_options()影响,默认等待5秒

用法

home_page.is_bill_opening("销售订单")

参数

  • bill_name str

    单据名称(模糊匹配)

返回

  • bool

change_bill_tab()

v1.0.0添加

在已打开单据间切换

用法

home_page.change_bill_tab("销售订单")

参数

  • bill_name str

    单据名称(模糊匹配)

HeadPage类

单据头

click_button()

v1.0.0添加

点击单据头按钮,子按钮

用法

head_page.click_button("保存")
head_page.click_button("保存", "暂存")

参数

  • button_name str

    按钮名称(精确匹配)

  • sub_button_name str(可选)

    子按钮名称(精确匹配)

change_sheet()

v1.0.0添加

切换单据头页签

用法

head_page.change_sheet("财务信息")

参数

  • sheet_name str

    页签名称(精确匹配)

set_value()

v1.0.0添加

单据头字段赋值

用法

head_page.set_value("衬衣订单号", "26024001")
head_page.set_value("销售类别", "内销")
head_page.set_value("维度选择", "内销", "袖长身长")

参数

  • field_name str

    字段名称(精确匹配)

  • value str

    字段值

  • field_type FieldType(可选)

    字段类型

    • FieldType.TEXT 文本
    • FieldType.SELECT 下拉列表
    • FieldType.BASE 基础资料
    • FieldType.TEXTAREA 大文本
    • FieldType.MULTISELECT 多选基础资料

field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行

set_checked()

v1.0.0添加

单据头勾选复选框

用法

head_page.set_checked("控制发货数量")

参数

  • field_name str

    复选框名称(精确匹配)

set_text_in_head_body()

v1.0.0添加

单据头中的单据体文本字段赋值,如样品通知单-接收人页签

用法

head_page.set_text_in_head_body("字段名", "字段值", 1)

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值

  • row int

    行号,从1开始

set_base_in_head_body()

v1.0.0添加

单据头中的单据体文本字段赋值,如样品通知单-接收人页签

用法

head_page.set_base_in_head_body("接收人", "张三", 1)

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值

  • row int

    行号,从1开始

get_value()

v1.0.0添加

单据头字段取值

用法

head_page.get_value("衬衣订单号")

参数

  • field_name str

    字段名称(精确匹配)

  • field_type str(可选)

    字段类型

    • FieldType.TEXT 文本
    • FieldType.SELECT 下拉列表
    • FieldType.BASE 基础资料
    • FieldType.TEXTAREA 大文本
    • FieldType.MULTISELECT 多选基础资料

field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行

返回

  • str

字段值

BodyPage类

单据体

change_sheet()

v1.0.0添加

切换单据体页签

用法

body_page.change_sheet("明细信息")
body_page.change_sheet("物料信息", 1)

参数

  • sheet_name str

    页签名称(精确匹配)

  • order int(可选)

    页签序号,存在同名页签时需提供,从1开始(精确匹配)

click_button()

v1.0.0添加

点击单据体按钮或子按钮

用法

body_page.click_button("新增行")
body_page.click_button("新增行", "复制行")

参数

  • button_name str

    按钮名称(精确匹配)

  • sub_button_name str(可选)

    子按钮名称(精确匹配)

click_line()

v1.0.0添加

选中单据体行

用法

body_page.click_line(1)

参数

  • row int

    单据体行号(从1开始)

set_value()

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(可选)

字段类型

  • FieldType.TEXT 文本
  • FieldType.SELECT 下拉列表
  • FieldType.BASE 基础资料

field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行

get_row_count()

v1.0.0添加

获取单据体总行数

用法

body_page.get_row_count()

返回

  • str

行数

get_value()

v1.0.0添加

单据体字段取值

用法

body_page.get_value("成品仓库", 1)
body_page.get_value("成品仓库", 1, 1)

参数

  • field_name str

    字段名称(精确匹配)

  • row int

    行号(从1开始)

  • order int(可选)

    序号,存在同名字段时指明第几个(从1开始)

返回

  • str

字段值

set_checked()

v1.0.0添加

点击单据页签的"x"图标关闭单据

用法

body_page.set_checked("控制发货数量", 1)

参数

  • field_name str

    复选框字段名称(精确匹配)

  • row int

    行号(从1开始)

set_text_in_body_head()

v1.0.0添加

单据体中单据头形式文本字段赋值,如:销售订单->物料数据->面料规格

用法

body_page.set_text_in_body_head("面料规格", "50/60")

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值

set_select_in_body_head()

v1.0.0添加

单据体中单据头形式下拉列表字段赋值,如:销售订单->物料数据->货主类型

用法

body_page.set_select_in_body_head("货主类型", "供应商")

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值

set_base_in_body_head()

v1.0.0添加

单据体中单据头形式基础资料字段赋值,如:销售订单->物料数据->面料来源

用法

body_page.set_base_in_body_head("面料来源", "自备")

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值

get_text_in_body_head()

v1.0.0添加

单据体中单据头形式文本字段取值,如:销售订单->物料数据->面料规格

用法

body_page.get_text_in_body_head("面料规格")
body_page.get_text_in_body_head("面料规格", 1)

参数

  • field_name str

    字段名(精确匹配)

  • order int(可选)

    序号,存在同名字段时指明第几个(从1开始)

返回

  • str

字段值

get_select_in_body_head()

v1.0.0添加

单据体中单据头形式下拉列表字段取值,如:销售订单->物料数据->货主类型

用法

body_page.get_select_in_body_head("货主类型")
body_page.get_select_in_body_head("货主类型", 1)

参数

  • field_name str

    字段名(精确匹配)

  • order int(可选)

    序号,存在同名字段时指明第几个(从1开始)

返回

  • str

字段值

get_base_in_body_head()

v1.0.0添加

单据体中单据头形式下拉列表字段取值,如:销售订单->物料数据->货主类型

用法

body_page.get_base_in_body_head("面料来源")
body_page.get_base_in_body_head("面料来源", 1)

参数

  • field_name str

    字段名(精确匹配)

  • order int(可选)

    序号,存在同名字段时指明第几个(从1开始)

返回

  • str

字段值

ListPage类

单据列表页面

wait_list_loaded()

v1.0.0添加

等待页面加载完成,当页面加载出第一行第一列表格时,停止等待

注意:

  1. 有时表格加载完成但界面仍存在wait_loading转圈图标,不做处理由playwright自动处理后续元素可操作性检查
  2. 默认等待时间受 expect.set_options(timeout=)全局控制
  3. 此方法只能检测有数据的列表是否加载完成,因为无数据时不会出现td表格元素,无法区分是否加载完成

用法

list_page.wait_list_loaded()

click_button()

v1.0.0添加

点击列表按钮、子按钮或孙子按钮

用法

list_page.click_button("新增")
list_page.click_button("新增", "复制")
list_page.click_button("选项", "套打", "套打设置")

参数

  • button_name str

    按钮名称(精确匹配)

  • sub_button str(可选)

    子按钮名称(精确匹配)

  • grandson_button str(可选)

    孙子按钮名称(精确匹配)

check_line_by_rows()

v1.0.0添加

勾选指定行

用法

list_page.check_line_by_rows(1)
list_page.check_line_by_rows(1,2,3)

参数

  • rows int

    行号(从1开始,可填多个)

open_bill_by_row()

v1.0.0添加

根据行号打开单据

此方法是通过点击行号的单据编号字段打开单据,确保该行单据编号字段有值

用法

list_page.open_bill_by_row(1)

参数

  • row int

    行号(从1开始)

get_value()

v1.0.0添加

获取列表字段值

用法

list_page.get_value("衬衣订单号", 1)

参数

  • field_name str

    字段名称(精确匹配)

  • row int

    行号(从1开始)

返回

  • str 字段值

get_bill_no()

v1.0.0添加

根据行号获取单据编号字段值

需确保给定行号单据编号字段有值

用法

list_page.get_bill_no(1)

参数

  • row int

    行号(从1开始)

返回

  • str 单据编号

get_row_count()

v1.0.0添加

获取列表总行数

用法

list_page.get_row_count()

返回

  • str 列表行数

check_line_by_field_value()

v1.0.0添加

根据给定字段名、字段值勾选对应行

当列表中存在多个相同字段值行时,只勾选第一行

用法

list_page.check_line_by_field_value("衬衣订单号", "26022021")

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值(精确匹配)

field_filter()

v1.0.0添加

字段过滤,点击列表列名右侧小漏斗,进行列表简单过滤

用法

list_page.field_filter("销售类别", "内销")

参数

  • field_name str

    字段名(精确匹配)

  • value str

    字段值(精确匹配)

FilterPage类

单据过滤页面

check_all_org()

v1.0.0添加

勾选“所有组织”复选框,如果已经是勾选状态则不操作

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.check_all_org()

uncheck_all_org()

v1.0.0添加

取消勾选所有组织复选框,如果已经未勾选状态则不操作

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.uncheck_all_org()

check_org()

v1.0.0添加

根据给定组织编码或名称,勾选组织多选列表

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.check_org("100.1")
filter_page.check_org("100.1", "鲁泰纺织股份")

参数

  • orgs str

    组织代码或名称,可传多个(模糊匹配)

check_entity()

v1.0.0添加

勾选指定实体类型

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

注意:

  1. 未进行勾选状态判断,未勾选状态下调用一次为勾选,再次调用为取消勾选
  2. 综合过滤方法filter()中不执行此操作,如确需调整过滤条件所在实体,在调用filter()方法前调用此方法

用法

filter_page.check_entity("明细信息")
filter_page.check_entity("明细信息", "财务信息")

参数

  • entitys_name str

    实体类型名称,可传多个(精确匹配)

click_tool_bar_button()

v1.0.0添加

点击过滤框页面菜单行按钮

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.click_tool_bar_button("删除全部")

参数

  • button_name str

    按钮名称(精确匹配)

set_condition()

v1.0.0添加

按行设置过滤条件项

注意:

  1. 绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法
  2. 部分单据中存在相同字段名在不同页签的情况,此时模糊匹配无法找到正确选项值,推荐使用条件项全称精确匹配

用法

filter_page.set_condition(1, "基本信息-衬衣订单号")

参数

  • row int

    行号(从1开始)

  • condition_name str

    条件项全称(模糊匹配)

set_operator()

v1.0.0添加

设置过滤条件操作符号

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.set_operator(1, "包含")

参数

  • row int

    行号(从1开始)

  • operator str

    操作符名称(精确匹配)

set_logic()

v1.0.0添加

设置逻辑符号,如并且

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.set_logic(1, "并且")

参数

  • row int

    行号(从1开始)

  • value str

    逻辑操作符名称(精确匹配)

set_condition_value()

v1.0.0添加

条件值字段赋值

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.set_condition_value(1, "26024001")

参数

  • row int

    行号(从1开始)

  • value str

    条件值(精确匹配)

  • field_type FieldType(可选)

字段类型

  • FieldType.TEXT 文本
  • FieldType.SELECT 下拉列表
  • FieldType.BASE 基础资料
  • FieldType.DATE 日期
  • FieldType.TEXTAREA 大文本

field_type参数绝大多数情况下不需要,此参数仅用于特殊情况下验证字段类型解析是否正常运行

click_ok_button()

v1.0.0添加

点击确定按钮,开始过滤

绝大多数情况下调用filter()方法即可实现过滤,无需主动调用此方法,推荐使用filter()方法

用法

filter_page.click_ok_button()

set_condition_row()

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(可选)

    逻辑符名称(精确匹配)

filter()

v1.0.0添加

根据条件对象进行过滤,默认勾选全部组织

用法

cond1 = ConditionRow(1, "基本信息-衬衣订单号", "123456", "包含", "或者")
cond2 = ConditionRow(2, "单据状态", "已审核")
filter_page.filter(cond1, cond2)

参数

  • condition_row ConditionRow

    条件行对象(可传多个)

    • ConditionRow
    • row: int 行号(从1开始)
    • condition_name: str 条件名称
    • condition_value: typing.Optional[str] = None 条件值名称(可选)
    • operator: typing.Optional[str] = None 操作符名称(可选)
    • logic: typing.Optional[str] = None 逻辑符名称(可选)

PushPage类

选单下推页面

push_draw_bill()

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(可选)

    目标组织名称(精确匹配)