真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

創(chuàng)新互聯(lián)是一家專業(yè)提供天壇街道企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為天壇街道眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

Appium輸入中文的問題

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

Appium在iOS端自動(dòng)化測(cè)試底層使用的是官方的UI Autoamtion。在Android端,4.2以上使用的官方的Uiautomator,4.1以下使用的時(shí)eBay的selendroid。所以在輸入中文的問題上,三個(gè)平臺(tái)理論上都有可能遇到問題。本文之后將重點(diǎn)調(diào)研Uiautomator的輸入中文的問題。

關(guān)于中文輸入的的結(jié)論:

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

selendroid的調(diào)研之后補(bǔ)充。

Appium iOS中文輸入調(diào)研

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

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

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

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

Appium Android Uiautomator中文輸入調(diào)研

之所以能有這篇文章,主要是因?yàn)樽罱胧褂肁ppium做一些App之間相互跳轉(zhuǎn)的自動(dòng)化確認(rèn)測(cè)試。一個(gè)中文的App,如果不能輸入中文基本上就是歇菜。在使用學(xué)習(xí)工具的時(shí)候發(fā)現(xiàn)了很多坑,不能輸入中文的這個(gè)坑最大,最郁悶。所以,把自己的調(diào)研方法寫出來,供大家參考。

首先 在一切未知的情況下,使用了這個(gè)方法進(jìn)行輸入:

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

發(fā)現(xiàn)結(jié)果不對(duì),然后嘗試了不輸入中文:

input.sendKeys("ssssssss"); 

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

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

這個(gè)方法會(huì)出現(xiàn)一個(gè)沒有實(shí)現(xiàn)的異常。

好吧,看源碼。

在使用Appium 的sendkeys方法是,Client會(huì)發(fā)送一個(gè)http請(qǐng)求到Appium的server。在AppiumServer端的源碼中 有一個(gè) rounting 的文件,輸入方法會(huì)發(fā)送這樣的路由: rest.post(‘/wd/hub/session/:sessionId?/element/:elementId?/value’, controller.setValue); 然后樹藤摸瓜,找到controller的setValue方法。然后一步一步的查找,最終會(huì)找到bootstrap項(xiàng)目中的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中,輸入方法就是這一段代碼。從這一段代碼中會(huì)發(fā)現(xiàn)Appium基本沒有做什么事情,最終調(diào)用了Uiautomator本身的setText方法。所以,接下來需要確認(rèn)原生的Uiautomator是否可以支持中文輸入。 經(jīng)過簡(jiǎn)單的測(cè)試發(fā)現(xiàn),Uiautomator不支持中文輸入,然后繼續(xù)Google解決方案。發(fā)現(xiàn)了一個(gè)uiautomator-unicode-input-helper開源項(xiàng)目。直接拿來嘗試了中文,也發(fā)現(xiàn)不對(duì)。按照作者的說法是可以支持日語,但是貌似想支持中文的話,還要進(jìn)行一定量的開發(fā)。

繼續(xù)看看Uiautomator為什么不支持中文。然后繼續(xù)找Android的源碼,發(fā)現(xiàn)Uiautomator的所有的功能都是通過UiAutomatorBridge來完成的。在UiAutomatorBridge類中有一個(gè)成員變量類型是InteractionController。輸入是通過InteractionController來實(shí)現(xiàn)的。具體的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完全沒有兼容英文以外的輸入法的意思。并且也沒有提供直接設(shè)置屬性的方法。

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



分享文章:Appium中文輸入問題的一些探索
網(wǎng)頁鏈接:http://weahome.cn/article/psjpgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部