UiAutomator: как добиться действия вставки с помощью uiautomator?

Мне нужно, чтобы в EditText вводился символ, отличный от ASCII (например, китайский), я нашел UiObject.setText() не может выполнить эту работу.

Итак, я получаю метод: скопировать символ в буфер обмена, а затем вставить его в EditText. Теперь я выполнил копирование, но не знаю, как добиться действия вставки с помощью кода.

Я искал в Интернете и обнаружил, что действие paste можно выполнить с помощью горячих клавиш: "меню" + "в"

поэтому я перехожу к API UiDevice и нахожу метод: pressKeycode(), но он может нажимать только один код клавиши за раз.

Кто-нибудь знает, как одновременно нажимать «меню» и «v» с помощью uiautomator или есть какой-то оригинальный код для этого?

Большое спасибо!


person Eddy    schedule 21.05.2015    source источник


Ответы (3)


Это работает для меня:

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

person MxJ    schedule 04.09.2018

У вас также есть метод pressMenu(). см. здесь

Я полагаю, вы также можете просто установить текст с текстом, который вы скопировали.

person Inês    schedule 21.05.2015
comment
Спасибо за ответ. Но метод setText() может принимать только символы ASCII. Как вы знаете, мне нужно протестировать другой язык, например китайский (zh-CN), поэтому я получаю метод: копировать символы в буфер обмена, а затем вставлять их в EditText. Теперь я добился копирования, но не знаю, как вставить с помощью команды. - person Eddy; 22.05.2015
comment
извините за плохое описание вопроса, я обогатил его.-:) - person Eddy; 22.05.2015
comment
Хм... Я действительно не знаю, как нажимать две клавиши одновременно, и я не знаком с работой с символами, отличными от ASCII. Однако я предполагаю, что если вы долго нажимаете поле EditText, появляется всплывающее окно с параметрами, являющимися одним из них, и вы можете его использовать. На данный момент я думаю с точки зрения пользователя, поскольку это то, что UiAutomator должен имитировать. Так что я полагаю, это должно сработать. Если это скажет мне, и я редактирую свой ответ :) - person Inês; 22.05.2015
comment
Да, это работает. Я думаю, вы правы. мы должны имитировать долгое нажатие на EditText и дождаться появления кнопки вставки, а затем нажать ее. но трудно нажать кнопку вставки, потому что кнопка вставки не может быть найдена в uiautomatorviewer :( - person Eddy; 25.05.2015

Я решил эту проблему. см. код ниже:

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();
        }
    }

}

Спасибо.

person Eddy    schedule 07.07.2015