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 实现粘贴动作?的主要内容,如果未能解决你的问题,请参考以下文章
[python]如何理解uiautomator里面的 child, child_by_text, sibling,及使用场景
如何使用屏幕上的位置(边界)在 UiAutomator 中查找对象
如何解决使用 Appium 测试 Android 应用时出现的错误“appium-uiautomator2-server-debug-androidTest.apk'不存在或不可访问”?