1

アクティビティが読み込まれると waitForActivity が完了するという Robotium の問題が発生していますが、そのビューにはまだアクセスできません。例えば:

solo.clickOnButton("Go");
assertTrue(solo.waitForActivity("ActivityTest", 5000));
Activity a = solo.getCurrentActivity();  // This works - a is "ActivityTest"
ArrayList<View> v = solo.getViews();     // This doesn't work - v is empty

問題は、アクティビティが完全に読み込まれていないことです。スリープ遅延は問題を回避します:

solo.clickOnButton("Go");
assertTrue(solo.waitForActivity("ActivityTest", 5000));
Activity a = solo.getCurrentActivity();  // This works - a is "ActivityTest"
solo.sleep(5000);
ArrayList<View> v = solo.getViews();     // This works - v has lots of views

これは Robotium の単なる事実ですか、それとも私のやり方が間違っているのでしょうか?

編集:これは私が現在使用しているものです。solo.waitForActivity:

public Boolean waitForActivity(String name) {
    int timeout = 10 * 1000; 
    long start = Calendar.getInstance().getTimeInMillis();
    assertTrue(solo.waitForActivity(name, timeout));
    solo.assertCurrentActivity(name, name);
    ArrayList<View> views = solo.getViews();
    while (views.isEmpty()) {
        solo.sleep(1000);
        views = solo.getViews();
        if (Calendar.getInstance().getTimeInMillis() > start + timeout)
    return false;
    }
    return true;
}
4

1 に答える 1

4

それは正常です。アクティビティは変更されましたが、ビューはまだ完全にロードされていません。テストの長さが問題にならない場合は、solo.sleep を使用した回避策が適しています。

使用できる別のソリューションがいくつかあります。それは、あなたが達成しようとしていることに本当に依存します。指定したビューで何かを行う場合は、solo.waitForView を簡単に使用できます。ビューのコレクションで何かを行う場合は、solo.waitForCondition を使用することをお勧めしますが、その条件を実装する必要があります。

于 2013-05-28T18:53:46.427 に答える