8.5 常见脚本逻辑与常见问题

8.5.1 keyevent按键码

在脚本中,有时需要输入一些指定的按键,例如点一下HOME键、BACK键等,如果设备是Android设备,可以参考谷歌的 Android按键码 (国内用户如果打不开此链接,可直接以关键词:Android keyevent搜索)。

示例: `keyevent("KEYCODE_DEL")` 或者直接输入按键码,注意参数为字符串: `keyevent("67")`

在Windows系统中,请参考 pywinauto 这个库提供的 Windows按键码

示例: `keyevent("{BACKSPACE}")`

iOS设备现在暂时只支持 HOME 按键的keyevent。

8.5.2 如何输入文字

在脚本中,如果想要实现文字输入,一般需要这样的流程:

  1. 点一下你需要输入的位置,激活输入光标
  2. 调用airtest的text()接口来输入内容
../_images/api_text.png

如图,在这个脚本里先点击了需要输入的位置,然后调用了text接口,在运行时手机将会自动被安装一个名为 yosemite.apk 的应用,然后启用 yosemite输入法 来进行输入。如果输入失败,请查看是否手机阻止了该apk的安装及运行,或是部分手机的兼容性问题导致的,具体可以查阅 Android连接FAQ ,以及部分型号的手机不允许输入密码时调用第三方输入法,请查阅FAQ文档对手机设置进行修改。

text接口有一个默认参数 enter=True,会在输入完毕后自动按一下回车键(如果能按的话),假如不需要,请设置为False。假如执行完毕后,回车键、确认键或搜索按钮没有被自动按下,可能是因为输入框没有响应ENTER操作,此时可以另外添加一个点击确认/搜索按钮的步骤。

除了airtest的text接口之外,我们在poco中也提供了一个 set_text 接口,这个接口无需调用输入法,可以直接设置文字。但是指定的控件必须是一个可输入的控件,例如在Android中,是一个 EditText 类型的widget:

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

我们建议各位如果项目已经接入了poco,可以多尝试使用poco的set_text来设置文字内容,如果无法输入(部分机型下有可能不支持set_text接口),再尝试用airtest的text接口。

8.5.3 如何删除输入框中的内容

目前,删除输入框的内容可以通过 keyevent 接口来完成,参考本章的第一节 8.5.1 keyevent按键码 ,很容易可以写出本平台对应的删除操作,例如安卓平台下的两种写法:

keyevent("KEYCODE_DEL")
keyevent("67")  # 67即为删除键,请注意传入的是字符串

airtest模拟的是用户的操作,用户在删除一个输入框内容时,会连续N次地去点击删除按钮,因此在airtest脚本中想要实现“清空输入框”内容的操作,也需要写一个循环连续运行N次keyevent操作。

不过,如果已经接入了Poco,可以考虑直接使用Poco的set_text接口,将输入框内容设置为空字符串即可。

8.5.4 airtest脚本中适当添加等待时间sleep

在脚本编写过程中,如果有连续点击操作,屏幕内容可能会不断变化,有时候会导致脚本明明运行到了点击操作却发现没有生效的情况。这是因为屏幕内容切换速度过快,界面还未稳定的同时airtest就进行了元素识别和操作,导致没有成功点击到对应元素。

因此我们通常建议,在一些操作步骤结束后,适当等待一个合适的时间再进行下一步操作,例如:

from airtest.core.api import *
start_app("test_package")
sleep(5)
touch([500, 500])
sleep(1)
touch([600, 0])

如果希望在每一步操作后都增加一个固定的统一等待时间,我们提供了一个名为 OPDELAY 的全局变量,设置它可以修改airtest操作之间的间隔,可以参考 脚本配置 中的 OPDELAY 相关介绍。