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的示例演示

 

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

關注微信公衆號即可在手機上查閱,並可接收更多測試分享~

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