zoukankan      html  css  js  c++  java
  • 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的示例演示

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

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

  • 相关阅读:
    vue-指令
    VueMusic-14搜索实现
    VueMusic-13歌手列表
    VueMusic-12歌词滚动
    VueMusic-11播放-歌词适配
    VueMusic-10.播放-歌词加载
    VueMusic-9.播放-播放功能
    VueMusic-8更多-下拉刷新
    VueMusic-7更多-数据适配
    VueMusic-6首页-热门榜单
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/15646287.html
Copyright © 2011-2022 走看看