中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Appium中文輸入問題的一些探索

發布時間:2020-07-26 19:19:37 來源:網絡 閱讀:631 作者:zhukev 欄目:移動開發

原文:http://houlianpi.github.io/blog/appium-chinese-input.html

Appium輸入中文的問題

在使用Appium做手機端的自動化測試時,你可以會遇到輸入中文的問題。但是由于Appium是三個自動化測試工具的集合,所以遇到的中文問題也可能會比較難說清楚。Appium支持iOS、Android和FireFoxOS三種操作系統。但是FireFoxOS一般人都不用,所以,文章中它是最后一次露面了。

Appium在iOS端自動化測試底層使用的是官方的UI Autoamtion。在Android端,4.2以上使用的官方的Uiautomator,4.1以下使用的時eBay的selendroid。所以在輸入中文的問題上,三個平臺理論上都有可能遇到問題。本文之后將重點調研Uiautomator的輸入中文的問題。

關于中文輸入的的結論:

  • Appium iOS 完全支持
  • Appium Android selendroid 應該支持(需要實踐確認,目前沒有試過,只是猜測)
  • Appium Android Uiautomator 不支持,應該是硬傷,目前無解

selendroid的調研之后補充。

Appium iOS中文輸入調研

首先先來說一下UI Automation。蘋果官方的UI Automation在輸入時有兩種方法:

  • (1)直接使用Element的setValue方法。
  • (2)UI Automation中的 UIAKeyboard對象有一個typeString方法。

以上兩個方法在模擬器上都是完美支持中文的。所以不管在iOS上面怎么玩,都是支持中文的。當然兩個方式是有區別的。方法(1)簡單直接,基本上就是一個簡單的set方法。輸入時不會觸發什么類似textChanged事件。方法(2)需要很多支持,方法二是完全模擬人手工輸入過程。蘋果對英文以外的輸入都做了很好地兼容。

Appium iOS版本的 sendkeys方法,直接對應 UIAKeyboard的typeString方法。由于typeString方法完美支持中文。所以Appium iOS版本也就支持中文了。當然,typeString方法也有缺點。當一個輸入框內有內容的時候,typeString的輸入方法是添加,所以,如果之前的內容不需要的時候,還需要先清除掉,在進行typeString。在沒有特殊要求的情況下,我比較喜歡setValue這個方法,但是遺憾的時Appium不支持直接setValue。

Appium Android Uiautomator中文輸入調研

之所以能有這篇文章,主要是因為最近想使用Appium做一些App之間相互跳轉的自動化確認測試。一個中文的App,如果不能輸入中文基本上就是歇菜。在使用學習工具的時候發現了很多坑,不能輸入中文的這個坑最大,最郁悶。所以,把自己的調研方法寫出來,供大家參考。

首先 在一切未知的情況下,使用了這個方法進行輸入:

input.sendKeys("舌尖上的中國"); 

發現結果不對,然后嘗試了不輸入中文:

input.sendKeys("ssssssss"); 

結果也不對,發現手機上使用的輸入法是Google中文輸入法。把輸入法切換到英文輸入法,以后,英文的正確的了,中文的還是有問題。于是Google了一下,找到了一個帖子。上面信息量很大,看起來比較靠譜的是有一個方法,利用JS運行器來直接輸入方法,翻譯為Java版本以后,代碼如下:

Java
1 2 3 
    inputDir.put("element",((RemoteWebElement)input).getId());     inputDir.put("text","舌尖上的中國");     driver.executeScript("element:setText", inputDir); 

這個方法會出現一個沒有實現的異常。

好吧,看源碼。

在使用Appium 的sendkeys方法是,Client會發送一個http請求到Appium的server。在AppiumServer端的源碼中 有一個 rounting 的文件,輸入方法會發送這樣的路由: rest.post(‘/wd/hub/session/:sessionId?/element/:elementId?/value’, controller.setValue); 然后樹藤摸瓜,找到controller的setValue方法。然后一步一步的查找,最終會找到bootstrap項目中的AndroidElement.java文件,其中有setText方法。代碼如下:

Java
1 2 3 4 5 6 7 8 9 10 
 public boolean setText(final String text) throws UiObjectNotFoundException {     if (UnicodeEncoder.needsEncoding(text)) {       Logger.info("Sending Unicode text to element: " + text);       String encodedText = UnicodeEncoder.encode(text);       return el.setText(encodedText);     } else {       Logger.info("Sending plain text to element: " + text);       return el.setText(text);     }   } 

在Appium Android Uiautomator中,輸入方法就是這一段代碼。從這一段代碼中會發現Appium基本沒有做什么事情,最終調用了Uiautomator本身的setText方法。所以,接下來需要確認原生的Uiautomator是否可以支持中文輸入。 經過簡單的測試發現,Uiautomator不支持中文輸入,然后繼續Google解決方案。發現了一個uiautomator-unicode-input-helper開源項目。直接拿來嘗試了中文,也發現不對。按照作者的說法是可以支持日語,但是貌似想支持中文的話,還要進行一定量的開發。

繼續看看Uiautomator為什么不支持中文。然后繼續找Android的源碼,發現Uiautomator的所有的功能都是通過UiAutomatorBridge來完成的。在UiAutomatorBridge類中有一個成員變量類型是InteractionController。輸入是通過InteractionController來實現的。具體的setText方法代碼如下:

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 
   public boolean More ...sendText(String text) {         if (DEBUG) {                     Log.d(LOG_TAG, "sendText (" + text + ")");         }         mUiAutomatorBridge.setOperationTime();         KeyEvent[] events = mKeyCharacterMap.getEvents(text.toCharArray());         if (events != null) {             for (KeyEvent event2 : events) {                 // We have to change the time of an event before injecting it because                 // all KeyEvents returned by KeyCharacterMap.getEvents() have the same                 // time stamp and the system rejects too old events. Hence, it is                 // possible for an event to become stale before it is injected if it                 // takes too long to inject the preceding ones.                 KeyEvent event = KeyEvent.changeTimeRepeat(event2,                         SystemClock.uptimeMillis(), 0);                 if (!injectEventSync(event)) {                     return false;                 }             }         }         return true;     } 

通過這段代碼,基本上就明白了,Android的Uiautomator完全沒有兼容英文以外的輸入法的意思。并且也沒有提供直接設置屬性的方法。

Appium Android Uiautomator 要支持輸入中文還有很長的一段路需要走。傷心了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巫溪县| 德钦县| 高平市| 句容市| 永清县| 左权县| 安达市| 南部县| 定南县| 兰坪| 碌曲县| 大厂| 蒙城县| 元江| 潮州市| 陇南市| 安化县| 铁岭县| 平潭县| 肇源县| 丹江口市| 临海市| 郴州市| 甘泉县| 阿克| 乐安县| 成武县| 杂多县| 綦江县| 景洪市| 博罗县| 贵溪市| 布尔津县| 阿拉尔市| 内丘县| 阿克陶县| 桦甸市| 周口市| 海门市| 翼城县| 临武县|