UiAutomator:如何使用 uiautomator 实现粘贴操作?
UiAutomator: How to achieve a paste action using uiautomator?
我需要在 EditText 中输入非 ASCII 字符(如汉字),我发现 UiObject.setText() 方法无法完成这项工作。
所以我得到一个方法:将字符复制到剪贴板,然后将其粘贴到EditText。现在已经实现了copy work,但是不知道怎么用代码实现粘贴动作
我在网上搜索了一下,发现paste可以使用热键实现操作:"menu" + "v"
所以我去UiDeviceapi,找到一个方法:pressKeycode(),但是一次只能按一个键码。
有谁知道如何使用 uiautomator 同时按下 "menu" 和 "v" 或者有一些原始代码可以实现这个?
非常感谢!
您也有 pressMenu() 方法。 see here
我想你也可以只用你复制的文本设置文本。
我已经解决了这个问题。请参阅下面的代码:
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();
}
}
}
谢谢。
这对我有用:
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).pressKeyCode(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_MASK)
我需要在 EditText 中输入非 ASCII 字符(如汉字),我发现 UiObject.setText() 方法无法完成这项工作。
所以我得到一个方法:将字符复制到剪贴板,然后将其粘贴到EditText。现在已经实现了copy work,但是不知道怎么用代码实现粘贴动作
我在网上搜索了一下,发现paste可以使用热键实现操作:"menu" + "v"
所以我去UiDeviceapi,找到一个方法:pressKeycode(),但是一次只能按一个键码。
有谁知道如何使用 uiautomator 同时按下 "menu" 和 "v" 或者有一些原始代码可以实现这个?
非常感谢!
您也有 pressMenu() 方法。 see here
我想你也可以只用你复制的文本设置文本。
我已经解决了这个问题。请参阅下面的代码:
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();
}
}
}
谢谢。
这对我有用:
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).pressKeyCode(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_MASK)