以下基於
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的示例演示
---------------------------------------------------------------------------------
關注微信公衆號即可在手機上查閱,並可接收更多測試分享~