Airtest API精讲之text()

上期回顾:Airtest API精讲之keyevent()


以下基于
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)

# 输入内容并按回车,参数没有明确给出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的示例演示

 

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章