专栏文章 Airtest 输入文本那点事

fishfish-yu · 2022年03月16日 · 最后由 fishfish-yu 回复于 2022年03月23日 · 6360 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

1.前言

阅读本文你将了解:

  • Airtest 的专用输入法 Yosemite.apk
  • Airtest 的 text 接口
  • 输入法的回车和搜索问题
  • 拓展:Poco 的 set_text 接口

PS:本文重点说明 Android 设备输入文本的相关问题,iOS 设备和网页的输入问题此文不展开讨论。

2. Airtest 的专用输入法 Yosemite.apk

在 Android 平台下,Airtest 配了一个专用的输入法 Yosemite.apk 。我们可以在 Airtest 库的这个路径下找到它:

当我们在 Android 设备上运行到输入文本的接口,比如 text 接口时,会自动启用这个 Yosemite 输入法来进行输入。(注意,如果是初次调用输入接口,则会先在该 Android 设备上自动安装该应用,再启用它来进行输入操作。)

1)没有软键盘的 Yosemite 输入法

在启用 Yosemite 输入法时,Android 设备的底部会有一个输入法的提示条,并且该输入法不像常规的输入法那样,Yosemite 输入法没有软键盘:

所以很多同学初次见到这个输入法的时候,都会感到疑惑。其实这是正常的。也有些同学会问,能不能去掉这个输入法的提示,目前暂时是不支持去掉的。

如果同学们遇到了 Yosemite 的底部提示,遮挡到手机应用按钮的情况,可以把具体机型、具体应用和按钮页面截图,提单给我们的开发者去核查和处理: https://airtest.netease.com/issue_create

2)如何切换输入法

那当 Android 设备启用 Yosemite 输入法时,我们就只能通过脚本来对设备进行输入,无法手工输入。

如果需要手工输入,可以在手机系统的输入法设置中,把输入法切换回系统输入法即可恢复。

如果同学们使用了我们的 AirtestIDE,也可以使用它提供的 安卓手机助手功能 ,在手机助手中可以简单地点击鼠标来切换输入法:

3)能不能不使用 Yosemite 输入法

也有同学会觉得,这个输入法没有键盘,手动输入的时候还要切换到别的输入法,太麻烦了,那我能不能不使用 Yosemite 输入法呢?

其实是可以的,如果我们确定在测试脚本中,不会涉及任何文本输入的操作;或者是只需要输入英文,并且是以 adb shell input 的方式来进行输入的,我们可以不在手机上安装 Yosemite 输入法。

shell("input text 'hello world'")

我们也可以通过下述方式,在脚本中指定不使用 Yosemite 输入法:

from airtest.core.api import *
# 方式一
auto_setup(__file__,devices=["android:///?ime_method=ADBIME"])

# 方式二
init_device("Android", ime_method="ADBIME")

3. Airtest 的 text接口

那了解完输入法之后,我们来看下输入的接口。Airtest 框架给我们提供的输入接口是 text 接口,在使用 text 接口之前,我们 必须先点击输入框,激活下输入光标 ,可以用图像点击、控件点击,均可,只要保证输入框的输入光标已经激活,我们就可以使用 text 接口进行输入。

1)text 接口默认的回车操作

text 接口有一个默认参数 enter=True,会在输入完毕后自动按一下回车键(相当于 keyevent("ENTER")),假如不需要,请传入 enter=False

text("test", enter=False)
2)text 接口的搜索操作

部分输入框,需要在输入内容后,点击输入键盘上的 搜索 按钮才能够激活搜索操作,可以传入 search=True 参数:

text("test", search=True)

输入法中显示的额外按键是 EDITOR CODE,刚才这个代码中的 search=True 实际上是传入了 editor code 3 。因为搜索键是最常用的按键,因此我们将它封装进了 text 接口中:

如果有点击除了 搜索 以外其他按钮的需求,需要查阅文档 Editor Action Code 来获取代码(如果该网页访问不了的话,可以自行搜索关键词 IME_ACTION_SEARCH ),然后手动传入代码进行点击。

dev = device()
# 按一下输入法的Go按钮 IME_ACTION_GO,对应键值为2
dev.yosemite_ime.code("2")

3)text 接口回车失效

如果我们在使用类似 text("11") 这样的脚本,不能正确回车的时候,我们可以使用下述方式来添加这个回车的效果:

text("11")
ime=G.DEVICE.yosemite_ime
ime.code(6)
4)输入失败的处理

text 输入失败,大概率都绕不过下面几个问题:

  • 手机阻止了 Yosemite.apk 的安装和运行
  • 没有将 Yosemite 输入法设置为手机默认输入法
  • 输入账号密码之类的,没有关闭手机的 安全输入 / 安全键盘 设置
  • 部分手机的兼容性问题
  • 部分模拟器未关闭 物理键盘 的问题

那对应地,当出现无法输入,或者输入报错的时候,我们就可以依次检查下是否有上述情况,比如检查手机上是否正常安装了 Yosemite.apk ,输入法设置里,是否将 Yosemite 设置为了默认输入法等等。

手机的兼容性问题,我们可以参考官方教程文档的 Android 连接常见问题这部分的内容: https://airtest.doc.io.netease.com/IDEdocs/3.2device_connection/3_android_faq/#2_1

输入密码界面黑屏、无法输入时,也别需要关注手机上的 安全输入安全键盘 之类的设置是否已经关闭。

4. 拓展:poco 的 set_text 接口

那其实,除了 Airtest 框架提供的 text 接口,Poco 框架也提供了输入的 set_text 接口:

poco("com.android.mms:id/recipients_editor").click()
poco("com.android.mms:id/recipients_editor").set_text("test")

如果我们测试的应用支持 poco,比如原生应用,或者是已经接入了 pocoSDK 的游戏应用,在输入时,都可以使用这个 set_text 接口。

相比 Airtest 的 text 接口,它还有一点比较便利的是快速清空输入框:

poco("com.android.mms:id/recipients_editor").set_text(" ")

5. 结束语

那今天关于 Airtest 的文本输入就聊到这里,还有其他关于文本输入比较好奇的问题,欢迎同学们给我们留言~


Airtest 官网https://airtest.netease.com/
Airtest 教程官网https://airtest.doc.io.netease.com/
搭建企业私有云服务https://airlab.163.com/b2b

官方答疑 Q 群:117973773

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

共收到 4 条回复 时间 点赞

什么时候可以打包脚本成 apk 使用

xxaq 回复

目前的打包方式是无法脱离 adb 的,并且不是所有的脚本都可以打包:https://airtest.doc.io.netease.com/IDEdocs/3.7plugins/1_firebase/

fishfish-yu 回复

autoJS,那种形式的脚本就可以,能否参考相同实现方式呢。

xxaq 回复

可以 后续我们会调研下的,谢谢反馈

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册