Skip to content

基础词汇

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 code
RES = 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

特殊词汇

execute_script

在浏览器中执行脚本,注意其中一定要 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

宏你可以理解成一个原子性的操作表达,比如 登录、模型移动 等等,宏本身可以使用基本词汇去实现。

这里举一个如何定义一个领域词汇叫做 "进入工具" 例子,我们可以如下实现:

首先增加一个文件 登录.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 平台上维护一个变量集,运行时选择该变量集。

keyboard 表

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');
Clone this wiki locally