为网上流行论点“UIAutomator不能通过中文文本查找控件”正名

1. 问题描述和起因

相信大家学习UIAutomator一开始的时候必然会看过一下这篇文章。

因为你在百度输入UIAutomator搜索的时候,该文章是排在第一位的。

但是里面有一段说法说UIAutomator不能支持通过中文文本查找控件,这个说法害人不浅,如果不是自己去实践调查过,必然也会轻易放弃UIAutomator以及使用了它的Appium框架,因为本人现在工作上将要测试到的就是全部中文界面的app。


最为害人的还是文章中用红色高亮来标志说明这个问题,虽然文章中有评论指出UIAutomator其实是支持中文搜索控件的,但我相信很多人会像我一样一般技术文章只会看正文的。

2. 问题分析

做完我自己亲自去编写以下代码去验证这个问题,以下代码的重点主要是最后几行想通过中文来查找控件(假设该控件已经存在)

  1. package majcit.com.UIAutomatorDemo;  
  2.   
  3. import com.android.uiautomator.core.UiDevice;  
  4. import com.android.uiautomator.core.UiObject;  
  5. import com.android.uiautomator.core.UiObjectNotFoundException;  
  6. import com.android.uiautomator.core.UiScrollable;  
  7. import com.android.uiautomator.core.UiSelector;  
  8. import com.android.uiautomator.testrunner.UiAutomatorTestCase;  
  9. import static org.hamcrest.Matchers.*;  
  10. import static org.hamcrest.MatcherAssert.assertThat;  
  11.   
  12. public class NotePadTest extends UiAutomatorTestCase {  
  13.       
  14.      public void testDemo() throws UiObjectNotFoundException {    
  15.             UiDevice device = getUiDevice();  
  16.             device.pressHome();    
  17.             // Start Notepad  
  18.             UiObject appNotes = new UiObject(new UiSelector().text("Notes"));   
  19.             appNotes.click();    
  20.             //Sleep 3 seconds till the app get ready  
  21.             try {    
  22.                 Thread.sleep(3000);    
  23.             } catch (InterruptedException e1) {    
  24.                 // TODO Auto-generated catch block    
  25.                 e1.printStackTrace();    
  26.             }    
  27.               
  28.             //Evoke the system menu option  
  29.             device.pressMenu();  
  30.             UiObject addNote = new UiObject(new UiSelector().text("Add note"));  
  31.             addNote.click();  
  32.               
  33.             //Add a new note  
  34.             UiObject noteContent = new UiObject(new UiSelector().className("android.widget.EditText"));  
  35.             noteContent.clearTextField();  
  36.             noteContent.setText("Note 1");  
  37.             device.pressMenu();  
  38.             UiObject save = new UiObject(new UiSelector().text("Save"));  
  39.             save.click();  
  40.               
  41.             //Find out the new added note entry  
  42.             UiScrollable noteList = new UiScrollable( new UiSelector().className("android.widget.ListView"));    
  43.             //UiScrollable noteList = new UiScrollable( new UiSelector().scrollable(true));   
  44.             UiObject note = null;  
  45.             if(noteList.exists()) {  
  46.                 note = noteList.getChildByText(new UiSelector().className("android.widget.TextView"), "Note1"true);    
  47.                 //note = noteList.getChildByText(new UiSelector().text("Note1"), "中文笔记", true);   
  48.             }  
  49.             else {  
  50.                 note = new UiObject(new UiSelector().text("中文笔记"));  
  51.             }  
  52.             assertThat(note,notNullValue());  
  53.               
  54.             note.longClick();  
  55.               
  56.             UiObject delete = new UiObject(new UiSelector().text("Delete"));  
  57.             delete.click();  
  58.                 
  59.         }    
  60.   
  61. }  
运行的时候也确实碰到了如下的问题:


当时看到log说"UiOjbectNotFoundException"的时候第一反应就是以上博客高亮指出的问题,以为确实如作者所说的存在这样的问题。但自己换个角度想,这个UIAutomator是google弄的,不可能对unicode字符支持这么基础的东西都有问题啊,所以几经百度谷歌和询问,可怜网上UIAutomator与此相关的资源有如凤毛麟角,几经艰辛才知道这个跟eclipse项目的Text file encoding选项有关系。现在往回想起,以上图片出现乱码的时候其实不应该先先入为主的认为引用博客的作者的说法是正确的,而应该像一网友“小吉”所说的应该先考虑是否是代码文件的编码的问题。

3.解决方案

如下图,把项目默认的Text file encoding从GBK改成UTF-8,重新打包运行



Item

Description

Warning

Author

天地会珠海分舵

转载请注明出处!

更多精彩文章请查看本人博客!

Blog Address

http://blog.csdn.net/zhubaitian

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值