-
Notifications
You must be signed in to change notification settings - Fork 9
基础词汇
Chris edited this page Aug 19, 2021
·
1 revision
注:以下非阻塞指可以在命令前加 ?
,表示即使该步骤发生错误,也不会阻塞整个执行
基础词汇 | 释意 | 举例 | 非阻塞 | 特殊 |
---|---|---|---|---|
open "[url]" | 打开一个网页 | open "https://www.kujiale.com" |
||
tap | 点击某个元素或位置 |
tap "[element]" tap "你好"/span // 点击文字为你好的元素,并特别指定是 span tap "你好"/0 // 如果屏幕有多个 你好,则可以用此指定第一个tap 0.5 0.5 // 表示点击屏幕中间位置tap "50" "50" // 表示点击屏幕x,y 像素的位置 |
支持 | |
wait [n]s | 等待n秒 |
wait 5s // 等待 5s |
||
input "[content]" to "[element]" | 输入 [content] 到 [element] 中,为追加输入,当 [content] 为 "" 时,表示清空 |
input "designtest1" to "邮箱账号/手机号" |
支持 | |
input "[content]" | 输入 [content] 到当前 focus 的元素中,为追加输入,当 [content] 为 "" 时,表示清空,可以配合 tap 使用 |
input "designtest1" // 正对当前 focus 的 input 进行输入 |
支持 | |
keyboard "[key]" | 对当前 focus 的元素输入某个按键,具体见下方 keyboard 表,多个 key 可以用 空格隔开 |
keyboard "A" "ENTER" // 按 A 并按回车 |
支持 | |
hover "[element]" | 鼠标悬停到对应元素上 | WebOnly | ||
screenshot | 截图,会把截图放到测试报告中。 | |||
scroll_to "[element]" | 表示网页中的滚轮滑动,会滚动到指定元素的位置上。 | WebOnly | ||
swipe | 手机侧的屏幕滑动操作 |
swipe [startX] [startY] [endX] [endY] 表示从 start 点点击后,再滑动到 end 点处。如 swipe 0.5 0.5 0.5 0 即表示从屏幕中间位置垂直向上滑动。 swipe "[element]" [x] [y] 这种方式是在先定位到元素,点击然后再进行相对的滑动。点击到 element 元素后,在进行上下左右的相对移动,负值表示向左和上。如 swipe "百科" -0.2 0 表示,先点击到百科后,再向左移动屏幕的 0.2 位置。 |
MobileOnly | |
assert_exists | 判断元素是否存在 |
assert_exists "你好" assert_exists "你好"/span //表示某个有 你好 的 span 存在assert_exists "你好"/=6 // 表示你好在屏幕中出现了6次,其中 = 号可以省略,另外还支持 >、>=、<、<= 符号assert_exists "你好" 30s // 最后一位表示超时时间,比如此语句表示 30s 内出现 你好 就算正确 |
支持 | |
assert_not_exists | 判断元素是否不存在,存在的话即会报错,终止用例 |
assert_not_exists "你好" assert_not_exists "你好" 30s
|
支持 | |
assert_text_equal | 判断文本是否相同 |
assert_text_equal "[文本]" "[文本]" 文本可使用 ${key} 的方式。 |
||
assert_toast | 判断toast提示是否存在 | MobileOnly | ||
assert_title_exists | 判断该页面的标题是否存在,不存在则终止该段测试,报错。 | WebOnly | ||
mouse | 鼠标操作,理论可以通过 keyboard/mouse 实现任何 Web 端操作 |
mouse down mouse up mouse move "[x]" "[y]" // 移动到某处 |
WebOnly | |
do_get | 发送 get 请求 |
do_get "https://www.kujiale.com/bp/api/account2/node-by-account/3FO4JX3YTN2J" do_get "https://www.kujiale.com/bp/api/account2/node-by-account/3FO4JX3YTN2J" 401 // 默认判断返回 200 时为正确,如果需要判断其他返回符号,可以在后面加 status codeRES = do_get "https://www.kujiale.com/bp/api/account2/node-by-account/3FO4JX3YTN2J" 401 // 此时变为当 status code 返回为 401 时,该语句判断正确,如果需要获得返回值,可以使用 = 的方式RES 的 json 数据会被解析,你可以使用 . 符号来获取具体的值,当为 array 时,可以使用 .index(如 .0 .1 等) 的方式如 ${RES.a.b.0.c} 如果你想增加请求头,则可以加上 """ header:{"Content-Type": "text/xml"} """
|
支持 | |
do_post | 发送 Post 请求,基本和 get 使用方法一样,多了一点,body 可通过 """ 方式加入 | 支持 | ||
do_put | 同 do_post | 支持 | ||
do_delete | 同 do_post | 支持 | ||
[key] = "element://" | 获取该元素上的文字信息,后面只能加 element 类型的定位方式,获得后,后续的测试用例中可以使用 ${key} 来获得该值。 | * USER_NAME = "element://name" * tap "${USER_NAME}" |
||
check | 针对 radio 和 checkbox 的操作,可以直接写临近文本,会找到离该文本最近的 checkbox 或 radio 进行操作。 | * checkbox "选项一" | WebOnly | |
upload | 上传文件 | * upload "路径" // 当路径为文件时上传该文件,为目录时,上传该目录下的所有文件;路径需相对当前测试用例的根目录 | WebOnly |
在浏览器中执行脚本,注意其中一定要 return 个值表示执行完成
* execute_script [...arguments]?
"""
js 代码
"""
如果需要获得脚本执行的结果,可以在前面加一个 key 进行接收,会收到 return 值。
* RESULT = execute_script
"""
return window.screen
"""
则后续就可以用 ${RESULT} 的方式使用了。
比如你可以配合 assert_text_equal 来比较输出是否是你想要的
js 代码中可以使用 arguments[0] 这种方式获取,execute_script 后面的参数,而参数可以使用环境变量
* ENTITY_POS = execute_script "${1}" "${2}" "${3}"
"""
const selector = {
a: arguments[0],
b: arguments[1],
c: arguments[2],
};
console.log(selector)
"""
宏你可以理解成一个原子性的操作表达,比如 登录、模型移动 等等,宏本身可以使用基本词汇去实现。
这里举一个如何定义一个领域词汇叫做 "进入工具" 例子,我们可以如下实现:
首先增加一个文件 登录.macro ,该宏可以如此实现
* open "https://www.kujiale.com"
* input "${1}" to "输入手机号/邮箱"
* input "${2}" to "输入密码"
* tap "登录"
使用处则可以写如下方式
* macro 登录 "[email protected]" "123"
macro 可以接收参数,使用${1}
这种方式来使用,传入时按顺序传入即可
注: macro 后为 macro 文件路径,如果和 feature 同目录,则 ./ 可以省略
环境变量可以使用 ${XX}
在多个场景中使用,以下变量覆盖关系为:运行时变量 > 脚本级变量 > 系统级变量
系统级变量可以直接在脚本中使用,系统级变量会以 SYSTEM_ 开头,目前包含以下几个系统级别变量,如果还需要其他变量,可以向我们提需求
变量名 | 说明 |
---|---|
SYSTEM_YEAR | 年 |
SYSTEM_TIMESTAMP | 时间戳(毫秒级) |
SYSTEM_SECOND | 秒 |
SYSTEM_MONTH | 月 |
SYSTEM_MINUTE | 分 |
SYSTEM_HOUR | 时 |
SYSTEM_DAY | 日 |
脚本目录下添加一个 config/env.yml 的文件来设置,如
TEST_ENV: www
USER_NAME_PROD: [email protected]
USER_PASSWORD_PROD: 123456
可以在 KoolTest 平台上配置,可以直接在 KoolTest 平台上维护一个变量集,运行时选择该变量集。
NULL('\ue000'),
CANCEL('\ue001'),
HELP('\ue002'),
BACK_SPACE('\ue003'),
TAB('\ue004'),
CLEAR('\ue005'),
RETURN('\ue006'),
ENTER('\ue007'),
SHIFT('\ue008'),
LEFT_SHIFT(SHIFT),
CONTROL('\ue009'),
LEFT_CONTROL(CONTROL),
ALT('\ue00a'),
LEFT_ALT(ALT),
PAUSE('\ue00b'),
ESCAPE('\ue00c'),
SPACE('\ue00d'),
PAGE_UP('\ue00e'),
PAGE_DOWN('\ue00f'),
END('\ue010'),
HOME('\ue011'),
LEFT('\ue012'),
ARROW_LEFT(LEFT),
UP('\ue013'),
ARROW_UP(UP),
RIGHT('\ue014'),
ARROW_RIGHT(RIGHT),
DOWN('\ue015'),
ARROW_DOWN(DOWN),
INSERT('\ue016'),
DELETE('\ue017'),
SEMICOLON('\ue018'),
EQUALS('\ue019'),
NUMPAD0('\ue01a'),
NUMPAD1('\ue01b'),
NUMPAD2('\ue01c'),
NUMPAD3('\ue01d'),
NUMPAD4('\ue01e'),
NUMPAD5('\ue01f'),
NUMPAD6('\ue020'),
NUMPAD7('\ue021'),
NUMPAD8('\ue022'),
NUMPAD9('\ue023'),
MULTIPLY('\ue024'),
ADD('\ue025'),
SEPARATOR('\ue026'),
SUBTRACT('\ue027'),
DECIMAL('\ue028'),
DIVIDE('\ue029'),
F1('\ue031'),
F2('\ue032'),
F3('\ue033'),
F4('\ue034'),
F5('\ue035'),
F6('\ue036'),
F7('\ue037'),
F8('\ue038'),
F9('\ue039'),
F10('\ue03a'),
F11('\ue03b'),
F12('\ue03c'),
META('\ue03d'),
COMMAND(META),
ZENKAKU_HANKAKU('\ue040');