我有以下脚本,用于在 Android 中使用 UiAutomator 在计算器中输入“33”。但是,只接受第一个“3”,第二次按下完全被忽略。
import com.android.uiautomator.core.*;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class MyFirstUiAutomatorTest extends UiAutomatorTestCase {
UiObject getByDescription(String description) {
return new UiObject(new UiSelector().description(description));
}
UiObject getByText(String description) {
return new UiObject(new UiSelector().text(description));
}
UiObject scrollableGetByText(String text ) throws UiObjectNotFoundException {
UiScrollable uiScrollable = new UiScrollable(new UiSelector().scrollable(true));
uiScrollable.setAsHorizontalList();
return uiScrollable.getChildByText(new UiSelector().className(
android.widget.TextView.class.getName()),
text);
}
public void testStuff() throws UiObjectNotFoundException {
getUiDevice().pressHome();
getByDescription("Apps").clickAndWaitForNewWindow();
getByText("Apps").click();
scrollableGetByText("Calculator").clickAndWaitForNewWindow();
// pressing '+' and '=' effectively clears the previous input
getByText("+").click();
getByText("=").click();
getByText("3").click();
// this second '3' is ignored
getByText("3").click();
}
}
我尝试在第一次单击后添加睡眠 2 秒,方法是:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
......但这并没有改变任何东西。
我还尝试在 2 '3' 之间单击另一个按钮,即:
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
...但这也不起作用。
想法?
(注意:在 AVD 中使用 Android 4.1.2;在 Ubuntu linux 12.04 上运行)
编辑,根据 Rami 的观察,我尝试了以下操作,以将相同的 UiObject 对象重用于对相同描述的第二次请求:
HashMap<String,UiObject> objectByText = new HashMap<String,UiObject>();
UiObject getByText(String description) {
if( objectByText.containsKey(description)) {
System.out.println("" + objectByText.get(description) );
return objectByText.get(description);
}
System.out.println("Created new object for [" + description + "]");
UiObject object = new UiObject(new UiSelector().text(description));
objectByText.put(description, object );
System.out.println("" + object );
return object;
}
...但它没有用,即使它每次都清楚地重用相同的 UiObject,因为它只说“为 [3] 创建了新对象”一次。
然后我尝试了 UiDevice.click() 'trick',通过创建一个函数'click',再次遵循 Rami 的观察:
void click(UiObject target ) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect );
getUiDevice().click(rect.centerX(), rect.centerY());
}
然而,这对我也不起作用:只出现第一个“3”,第二个被忽略,即使两次点击都明显在同一个地方,因为rect:
输出位置是相同的。如果我使用自己的桌面鼠标手动单击“3”两次,则两个 3 都显示正常。
Thread.sleep()
我还尝试在两次点击之间添加两秒钟,但我仍然只出现了一个“3”。