UiAutomator を使用して、Android の電卓に「33」と入力するための次のスクリプトがあります。ただし、最初の '3' のみが受け入れられ、2 回目のプレスは完全に無視されます。
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の観察に従って、同じ説明の2番目のリクエストに同じ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;
}
...しかし、「[3]の新しいオブジェクトを作成しました」と1回しか表示されないため、毎回同じUiObjectを明確に再利用しているにもかかわらず、機能しませんでした。
次に、Ramiの観察に従って、次のように関数「クリック」を作成して、UiDevice.click()「トリック」を試しました。
void click(UiObject target ) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect );
getUiDevice().click(rect.centerX(), rect.centerY());
}
ただし、これもうまくいきませんでした。最初の「3」のみが表示され、rect:
出力場所が同じであるため、両方のクリックが明らかに同じ場所にあるにもかかわらず、2 番目は無視されます。自分のデスクトップ マウスを使用して手動で '3' を 2 回クリックすると、両方の 3 が正常に表示されます。
また、クリックの間に 2 秒を追加しようとしましThread.sleep()
たが、それでも「3」が 1 つしか表示されませんでした。