UiAutomator:如何使用 uiautomator 实现粘贴动作?

Posted

技术标签:

【中文标题】UiAutomator:如何使用 uiautomator 实现粘贴动作?【英文标题】:UiAutomator: How to achieve a paste action using uiautomator? 【发布时间】:2015-05-21 07:17:14 【问题描述】:

我需要在EditText中输入非ASCII字符(如汉字),我发现UiObject.setText()方法不能完成这项工作。

所以我得到了一个方法:将字符复制到剪贴板,然后将其粘贴到 EditText。现在我已经实现了copy work,但是不知道如何使用代码实现粘贴动作。

我在网上搜索,发现paste动作可以通过热键实现:“menu”+“v”

于是我去UiDevice api,找到了一个方法:pressKeycode(),但是一次只能按一个键码。

有谁知道如何使用 uiautomator 同时按“menu”和“v”,或者有一些原始代码可以实现这一点?

非常感谢!

【问题讨论】:

我认为这可以帮助你github.com/sumio/uiautomator-unicode-input-helper 【参考方案1】:

这对我有用:

UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).pressKeyCode(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_MASK)

【讨论】:

【参考方案2】:

你也有 pressMenu() 方法。 see here

我想你也可以只用你复制的文本设置文本。

【讨论】:

感谢您的回复。但是 setText() 方法只能接受 ASCII 字符。如您所知,我必须测试其他语言,例如中文(zh-CN),所以我得到了一个方法:将字符复制到剪贴板,然后将其粘贴到 EditText。现在我已经完成了复制工作,但是不知道如何使用命令粘贴。 抱歉问题描述不佳,我已经丰富了它。-:) 嗯...我真的不知道如何同时按两个键,而且我不熟悉使用非 ASCII 字符。但是,我猜如果您长按 EditText 字段,则会出现一个弹出窗口,其中包含选项之一,您可以使用它。在这一点上,我从用户的角度思考,因为这就是 UiAutomator 应该模拟的。所以我想这应该可行。如果它确实告诉我并且我编辑我的答案:) 是的,它有效。我想你是对的。我们应该在 EditText 上模拟长按并等待粘贴按钮出现然后按下它。但是很难按粘贴按钮,因为在 uiautomatorviewer 中找不到粘贴按钮 :(【参考方案3】:

我已经解决了这个问题。见下面的代码:

public class MyTest  extends TestCase

    /**
    * Paste text to an EditText feild which is currentlly get focused.
    *
    * @param: text the text(Non-ASCII) you want to paste into EditText feild. 
    */
    IClipboard clipboard = IClipboard.Stub.asInterface(ServiceManager.getService(Context.CLIPBOARD_SERVICE));
    IInputManager iInputManager = IInputManager.Stub.asInterface(ServiceManager.getService(Context.INPUT_SERVICE)); 
    private void pastText(String text) throws UiObjectNotFoundException
        try 
            //copy the text to clipboard.
            clipboard.setPrimaryClip(ClipData.newPlainText("NonASCII", text), text);   

            //inject event: press Menu + V         
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU, 0),1); 
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_V, 0),1);              
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU, 0),1);
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_UP, KeyEvent.KEYCODE_V, 0),1);              

            //After "Menu"+"V" pressed, A "Menu" will show if exist in current Activicy.
            //Then press menu again, to make it down just for bug fixing.
            sleep(300);
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU, 0),1); 
            iInputManager.injectInputEvent(
                new KeyEvent(android.os.SystemClock.uptimeMillis(), 
                             android.os.SystemClock.uptimeMillis(), 
                             KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU, 0),1);

         catch (RemoteException e) 
            e.printStackTrace();
        
    


谢谢。

【讨论】:

以上是关于UiAutomator:如何使用 uiautomator 实现粘贴动作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用和调试 android UIAutomator

[python]如何理解uiautomator里面的 child, child_by_text, sibling,及使用场景

如何使用屏幕上的位置(边界)在 UiAutomator 中查找对象

如何使用uiautomator编写联系人右边的定位

如何解决使用 Appium 测试 Android 应用时出现的错误“appium-uiautomator2-server-debug-androidTest.apk'不存在或不可访问”?

如何使用Android夜神模拟器读取UIautomator元素?