如何使用Google UiAutomator按两次按钮?

Hug*_*ins 7 java android automated-tests android-virtual-device android-uiautomator

我使用以下脚本在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在第一次点击后尝试添加睡眠2秒,方法是:

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

......但这并没有改变任何事情.

我也尝试在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();
Run Code Online (Sandbox Code Playgroud)

......但那也没有用.

想法?

(注意:在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;
}
Run Code Online (Sandbox Code Playgroud)

...但是它没有用,即使它每次都明显重复使用相同的UiObject,因为它只会说"为[3]创建一个新对象".

然后我尝试了UiDevice.click()'技巧',再次按照Rami的观察创建一个函数'click',如下:

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

但是,这对我来说也不起作用:只有第一个'3'出现,第二个被忽略,即使两个点击明显在同一个地方,因为rect:输出位置是相同的.如果我手动点击"3",使用我自己的桌面鼠标,则两个3都显示正常.

我也尝试Thread.sleep()在点击之间添加两秒钟,但仍然只有一个'3'出现在我面前.

Ram*_*ret 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();
    }
Run Code Online (Sandbox Code Playgroud)

这是第一个“4”点击的日志:

07-04 16:54:05.259:I / QueryController(25605):匹配的选择器: UiSelector [TEXT = 4] <<==>> [android.view.accessibility.AccessibilityNodeInfo@592f1; boundsInParent: 矩形(0, 0 - 202, 129); boundsInScreen: 矩形(56, 508 - 258, 637); 包名:com.android.deskclock;类名:android.widget.Button;文字:4;内容描述:空;可检查:假;检查:假;可聚焦:真实;重点:假;选择:假;可点击:真;长可点击:假;启用:真;密码:假;可滚动:假;[ACTION_FOCUS、ACTION_SELECT、ACTION_CLEAR_SELECTION、ACTION_CLICK、ACTION_ACCESSIBILITY_FOCUS、ACTION_NEXT_AT_MOVMENT_GRANULARITY、ACTION_PREVIOUS_AT_MOVMENT_GRANULARITY]]

这是第二次“4”点击的日志:

07-04 16:54:07.798: I/QueryController(25605): 匹配的选择器: UiSelector[TEXT=4] <<==>> [android.view.accessibility.AccessibilityNodeInfo@5bffd; boundsInParent: 矩形(0, 0 - 66, 90); boundsInScreen: 矩形(191, 264 - 257, 354) ; 包名:com.android.deskclock;类名: android.widget.TextView;文字:4;内容描述:空;可检查:假;检查:假;可聚焦:假;重点:假;选择:假;可点击:假;长可点击:假;启用:真;密码:假;可滚动:假;[ACTION_SELECT、ACTION_CLEAR_SELECTION、ACTION_ACCESSIBILITY_FOCUS、ACTION_NEXT_AT_MOVMENT_GRANULARITY、ACTION_PREVIOUS_AT_MOVMENT_GRANULARITY]]

我们可以看到,第一个点击右侧的 android.widget.Button,第二个点击寻找 android.widget.TextView。