2013-07-01 19 views
5

私は、AndroidのCalculatorに '33'を入力するために、UiAutomatorを使用して次のスクリプトを用意しました。しかし、最初の「3」だけが受け入れられ、2番目のプレスは完全に無視されます。Google UiAutomatorを使用してボタンを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)

編集、ラミの観察を以下、私はのために第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]のための新しいオブジェクトを作成した」と言うので、それは、それは明らかに同じUIObjectクラスを毎回再利用されていても、動作しませんでした。しかし、これはどちらか私のために動作しませんでした

void click(UiObject target) throws UiObjectNotFoundException { 
    Rect rect = target.getBounds(); 
    System.out.println("rect: " + rect); 
    getUiDevice().click(rect.centerX(), rect.centerY()); 
} 

は、それから私は、関数を作成することによって、次のようにラミの観測以下、再び、「クリック」をUiDevice.click()「トリック」を試してみました最初の '3'だけが表示され、両方のクリックが明らかに同じ場所にあるにもかかわらず、2番目の文字は無視されます。rect:の出力場所が同じであるためです。自分のデスクトップマウスを使用して手動で「3」を2回クリックすると、両方の3つが正常に表示されます。

また、クリック間に2秒追加してみましたが、それでも1つの「3」しか表示されませんでした。

答えて

1

私は同じ問題を抱えており、同じテキストを持つ別のUI要素を探しているようです。私はアラームの作成を自動化しようとしていますが、時刻が例えば午後4時45分の時です。 Uiautomatorが右ボタンをクリックします。ここ

clickByText("4"); 
clickByText("4"); 
clickByText("5"); 
clickByText("PM"); 
clickByText("OK"); 

private void clickByText(String text) throws UiObjectNotFoundException { 
      UiObject obj = new UiObject(new UiSelector().text(text)); 
      obj.click(); 
    } 

ログは最初の "4" をクリックするためのものである:[ UiSelector:

07から04 16:54:05.259:I/QueryController(25605):一致セレクタTEXT = 4] < < == >> [[email protected]; boundsInParent:Rect(0、0 - 202、129); boundsInScreen:Rect(56、508 - 258、637);パッケージ名:com.android.deskclock; className:android.widget。ボタン;テキスト:4; contentDescription:null;チェック可能:偽;チェック:偽;フォーカス可能:true;フォーカス:偽; が選択されました。クリック可能:true。 longClickable:false;有効:true。 パスワード:false;スクロール可能:false。

07から04 16:ここ[ACTION_FOCUS、ACTION_SELECT、 ACTION_CLEAR_SELECTION、ACTION_CLICK、ACTION_ACCESSIBILITY_FOCUS、 ACTION_NEXT_AT_MOVEMENT_GRANULARITY、 ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY]

は、第二の "4" をクリックするためのログインであります54:07.798:I/QueryController(25605):一致セレクタ: UiSelector [TEXT = 4] < < == >> [android.view.accessibility.Access ibilityNodeInfo @ 5bffd; boundsInParent:Rect(0、0 - 66、90); boundsInScreen:Rect(191,264-257,354); packageName:com.android.deskclock; className: android.widget.TextView;テキスト:4; contentDescription:null;チェック可能:偽;チェック:偽;フォーカス可能:false;フォーカス:偽; が選択されました。クリック可能:false; longClickable:false;有効: true;パスワード:false;スクロール可能:false。 [ACTION_SELECT、 ACTION_CLEAR_SELECTION、ACTION_ACCESSIBILITY_FOCUS、 ACTION_NEXT_AT_MOVEMENT_GRANULARITY、 ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY]]

は、我々はその1は、右android.widget.Buttonをクリックされ、第二は、そのはandroid.widget.TextViewを探してクリックしてください見ることができます。

2

私は今、問題を回避するための小さなハックを発見しました。テストを実行するたびに境界を取得し、デバイスの中心ではなく、オンザフライで適応します。

UiObject obj1 = new UiObject(new UiSelector().text("4")); 

    Rect four = obj1.getBounds(); 

    getUiDevice().click(four.centerX(), four.centerY()); 
+0

これは素晴らしい回避策のように聞こえるが、私はちょうど今それを試してみました、そしてそれは私のために動作しませんです。 '3'ボタンを手動で2回クリックすると '33'が表示されますが、getUiDevice()。click()を使用して同じ場所で2回クリックするとUiAutomatorには1つの ' 3 '。これにより、2つのクリックの間に 'Thread.sleep(2000)'を追加します。 –

+0

私は 'setUpDigit()'メソッドを作成しました。ここで私は自分のUIobjectを設定しました。 'UiObject zero = new UiObject(new UiSelector()。text(" 0 "));'そして私は、同じメソッドsetUpDigit() 'Rzero = zero.getBounds();'次に、グローバル値Rzeroを使用し、右ボタン 'getUiDevice()をクリックするスイッチがあります。click(Rzero.centerX()、Rzero.centerY ()); '難しいのはsetUpDigit()を呼び出すときです。電卓を持っているときに呼び出される必要があります。 –

4

テキストで検索するのではなく、テキストとクラスで検索してみてください。 これを行うためのサンプルメソッドがあります。

Uiobject getByTextAndClass(String text, String className) { 
    return new UiObject(new UiSelector().text(text).className(className)); 
} 

そして、あなたはその上に番号3の電卓ボタンに対してこのメ​​ソッドを呼び出そうとしているならば、:

getByTextAndClass("3", android.widget.Button.class.getName()).click(); 

あなたはUiAutomatorViewerツールを使用することができます:{アンドロイド-SDK} /ツール/ uiautomator .batを使用して、さまざまなUiObjectのクラス名やその他の属性を確認します。

これは私の4.2.2デバイスで動作しますが、4.1.2をダウンロードしてそこでもテストします。

私は4.1.2 AVDで試してみましたが、私のWindowsマシンで動作します。

2

この問題は、UiObjectの設定方法に組み込まれているようです。私が知る限り、UiObjectのインスタンスは、画面上の特定のオブジェクトを参照していないようです。これは、UiObjectが定義されたときに、UiSelectorが指しているもののインスタンスによく似ています。ここで重要な点は、オブジェクトが呼び出されるたびに、UiSelectorの要件に適合する新しい項目を検索することです。

証拠:

UiObject ok = new UiObject(new UiSelector().text("OK")); 
ok.click(); 
// clicks a button with the text ok on the page 
// Navigate to some different page with a button with the text ok 
ok.click(); 
// this ok button on a completely different page is still clicked 

したがって、私はラミの回避策は、実際にそれを行うには正しい方法で(その座標によってオブジェクトの位置を保存し、その場所の中央をクリックしてください)かもしれないと思います。 Ramiの回避策について注意する重要なことは、座標/四角形を一度保存​​してから、オブジェクトを参照したいときは常に座標/四角形を再利用することです。 obj.getBounds()を同じオブジェクトで複数回使用すると動作しないようです。

また、UiObjectのインスタンシエーション中に既に渡されたアイテムのレコードは、アプリに格納されているようです。テストを2回実行すると、UiObject(設定されたアラームページのボタン4)が見つかってクリックされ、UiObjectを検出して2回クリックするテストと同じ方法で失敗します。これは、UIautomatorをリセットしても差がないため、オブジェクトクエリのデータをデバイスに保存する必要があることを意味します。

0

3ボタン用のUIObjectを作成し、twice.belowをクリックしてくださいは、スニペット

UiObject three = new UiObject(new UiSelector().text("3")); 
three.click(); 
three.click(); 
関連する問題