Airtest API精讲之text()
以下基于
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83
老规矩开场白,我们今天要讲的是Airtest框架的内容,不是Poco框架的,一般我们说Airtest,其实应该指的是Airtest Project,具体这些概念的关系是什么,可以看之前文章:Airtest Project——UI自动化利器介绍
输入文本,可以使用text(),但使用前,一定要确保输入框是激活状态,如果不是需要提前点击激活一下。
text()支持Android、iOS、Windows三平台
Android平台下的text()
源码解析
先来看下源码(不想看源码的可以直接跳到后面的演示实例):
# 文件位置:your_python_path/site-packages/airtest/core/android/android.py
def text(self, text, enter=True, **kwargs):
"""
Input text on the device
Args:
text: text to input
enter: True or False whether to press `Enter` key
search: True or False whether to press `Search` key on IME after input
Returns:
None
"""
search = False if "search" not in kwargs else kwargs["search"]
if self.ime_method == IME_METHOD.YOSEMITEIME:
self.yosemite_ime.text(text)
else:
self.adb.shell(["input", "text", text])
if search:
self.yosemite_ime.code("3")
return
# 游戏输入时,输入有效内容后点击Enter确认,如不需要,enter置为False即可。
if enter:
self.adb.shell(["input", "keyevent", "ENTER"])
参数
text:要输入的内容
enter:输入完成后是否按回车键
search:输入完成后是否按搜索键
text()第17-20行:判断使用的是否是yosemite输入法(默认是),如果是yosemite则调用其text()方法输入文本,如果不是则调用adb命令adb shell input text 内容
输入文本。
我们可以继续看下yosemite的text()方法:
# 文件位置:your_python_path/site-packages/airtest/core/android/ime.py
def text(self, value):
"""
Input text with Yosemite input method
Args:
value: text to be inputted
Returns:
output form `adb shell` command
"""
if not self.started:
self.start()
# 更多的输入用法请见 https://github.com/macacajs/android-unicode#use-in-adb-shell
value = ensure_unicode(value)
self.adb.shell(u"am broadcast -a ADB_INPUT_TEXT --es msg '{}'".format(value))
可以看到是通过发送一条广播去驱使Yosemite APP进行输入。
继续看text()第22-24行:判断search是否为True(有些输入框,需要在输入内容后,点击输入键盘上的‘搜索’按钮才能够激活搜索操作),如果是True则调用yosemite的code()方法去触发一个code码为3的输入。
我们看下yosemite的code()方法:
# 文件位置:your_python_path/site-packages/airtest/core/android/ime.py
def code(self, code):
"""
Sending editor action
Args:
code: editor action code, e.g., 2 = IME_ACTION_GO, 3 = IME_ACTION_SEARCH
Editor Action Code Ref: http://developer.android.com/reference/android/view/inputmethod/EditorInfo.html
Returns:
output form `adb shell` command
"""
if not self.started:
self.start()
self.adb.shell("am broadcast -a ADB_EDITOR_CODE --ei code {}".format(str(code)))
同样是通过发送一条广播去驱使Yosemite APP执行输入。
那么什么时候需要用到search=True呢?如下图,当在输入框内输入完内容后需要点击键盘上的搜索按钮时。
输入法中显示的额外按键是 EDITOR CODE,刚才这个代码中的 search=True 实际上是传入了editor code 3。因为搜索键是最常用的按键,因此Airtest将它封装进了text()接口中,如果有点击除了 搜索 以外其他按钮的需求,需要查阅文档 Editor Action Code 来获取代码(谷歌网站,需要FQ):
https://developer.android.com/reference/android/view/inputmethod/EditorInfo
下面的演示实例中将演示如何在代码中调用其他editor code。
继续看text()第27-28行:判断enter是否为True,如果是True则调用adb命令adb shell keyevent ENTER
输入回车键。
演示实例
# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"
from airtest.core.api import *
from airtest.core.android.touch_methods.base_touch import *
# 获取当前手机设备
dev = device()
# 按一下输入法的Go按钮 IME_ACTION_GO,对应键值为2,同理,输入法的搜索键实际上对应值为3
dev.yosemite_ime.code("2")
# 上面代码等价于下面这个shell调用
# shell("am broadcast -a ADB_EDITOR_CODE --ei code 2")
# 只输入内容
text("测试工程师小站", enter=False)
# 只输入回车(空行)
text("")
# 输入内容并按回车,参数没有明确给出enter因为默认是True
text("测试工程师小站")
# 输入内容并按搜索键
text("测试工程师小站", search=True)
注意1:
如果手机是首次连接并运行脚本,会自动安装yosemite.apk,在部分手机上会弹出授权窗口,需要给其授权。如果当时未授权或之后又想授权,可以在输入法管理中再次授权
如果运行脚本没有安装yosemite.apk,可以手动安装。如果是在本地python环境安装了Airtest,可以在your_python_path/site-packages/airtest/core/android/static/apks中找到。或者在AirtestIDE的目录中搜索yosemite。
注意2:
运行过脚本后,手机输入法会被自动切换为yosemite输入法,yosemite输入法为了不影响自动化执行(键盘遮挡UI),是没有键盘的(其实有,一条线)
当你执行完脚本,想恢复正常输入法:
方法一:去设置中自己调回来。
方法二:通过AirtestIDE的安卓手机助手功能,切换输入法。具体可以看之前的文章:AirtestIDE高级功能
方法三:通过adb命令
# 设置为搜狗输入法
adb shell ime set com.sohu.inputmethod.sogou.xiaomi/.SogouIME
# 设置为yosemite输入法
adb shell ime set com.netease.nie.yosemite/.ime.ImeService
查找输入法包名和Activity名的方法,可以看之前Android篇介绍:Airtest之使用Poco测试Android原生应用
执行失败如何解决
如果text()执行失败,先按上面讲的确认yosemite被安装,以及设置成当前输入法。
部分手机在输入密码时会失败,是因为手机设置中的 语言与输入法-安全输入 没有打开,打开该选项后就可以使用非系统自带的输入法来输入密码了。另外有些手机在输入时有安全键盘,也需要关闭(具体可看下面链接)。
另外请确保<android连接常见问题>中提到的均已做到:
https://airtest.doc.io.netease.com/IDEdocs/device_connection/2_android_faq/#id7
有部分特殊型号的手机,可能在使用Yosemite输入法时容易失败,无法输入文字(OPPO与Vivo品牌更容易出现),假如没有输入中文的需求,可以尝试使用 adb shell input 指令来进行文字输入:
shell("input text 'hello world'")
同时,上面这种 adb shell input 可以直接设置为默认的输入方式,替换原先的Yosemite输入,例如在python代码中这样初始化手机:
from airtest.core.api import *
# 相当于命令行中使用 --device Android:///?ime_method=ADBIME 连接手机
init_device("Android", ime_method="ADBIME")
text("hello")
部分模拟器(例如夜神模拟器)在输入时可能无法成功,可以尝试确认设置中是否打开了 硬件-物理键盘,尝试关闭这个选项,并设置默认输入法为yosemite输入法后再次重试即可。具体设置方式请参考:
https://airtest.doc.io.netease.com/IDEdocs/device_connection/3_emulator_connection/#id3
iOS平台下的text()
源码解析
# 文件位置:your_python_path/site-packages/airtest/core/ios/ios.py
def text(self, text, enter=True):
"""
Input text on the device
Args:
text: text to input
enter: True if you need to enter a newline at the end
Returns:
None
Examples:
>>> text("test")
>>> text("中文")
"""
if enter:
text += '\n'
self.driver.send_keys(text)
参数
text:要输入的内容
enter:输入完成后是否按回车键
ios平台下的text()没有search参数;
当enter=True时,会自动在输入内容后加一个换行符\n。
Windows平台下的text()
源码解析
# 文件位置:your_python_path/site-packages/airtest/core/win/win.py
def text(self, text, enter=True, **kwargs):
"""
def text(self, text, **kwargs):
"""
Input text
Args:
text: text to input
**kwargs: optional arguments
Returns:
None
"""
self.keyevent(text)
参数
text:要输入的内容
enter:输入完成后是否按回车键
Windows的text()是封装的pywinauto中的keyevent()方法,具体可以看之前的Airtest API精讲之keyevent()
延伸技巧
上面我们讲了怎么输入,那相对的怎么删除呢?
可以通过keyevent()输入删除键来实现,具体请看Airtest API精讲之keyevent() Android的示例演示
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~