其他分享
首页 > 其他分享> > 如何使用Google UiAutomator按两次按钮?

如何使用Google 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();
    }
}

我在第一次点击后尝试添加睡眠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()’技巧’,再次按照Rami的观察创建一个函数’click’,如下:

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’出现在我面前.

解决方法:

不只是按文本搜索,而是尝试按文本和类进行搜索.
这是一个这样做的示例方法.

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工具:{android-sdk} /tools/uiautomator.bat来检查不同UiObjects的类名和其他属性.

这适用于我的4.2.2设备,但我也在下载4.1.2以在那里进行测试.

我在4.1.2 AVD上试过它,它可以在我的Windows机器上运行.

标签:android,java,automated-tests,avd,android-uiautomator
来源: https://codeday.me/bug/20191006/1862797.html