Android测试:什么都没有id?

时间:2013-03-25 14:56:48

标签: java android robotium android-testing

我正在尝试为我的应用编写一些自动化脚本。我已经在Robotium的网站上完成了教程,并对如何实现自动化有了基本的了解。然而,据我所知,我正在测试的应用程序是通过使用android层次结构查看器,我看到所有视图都没有明确定义的id。 Sample Hierarchy

从屏幕截图中可以看到,有嵌套视图的视图。它们的ID读取为0x17e0或0x17de。我怎样才能在机器人脚本中引用它们?最终的结果是我试图让它甚至在其中一个Text Switcher视图上发出一声点击。到目前为止,我只能让它成功,如果我给它一个像素点去,或者如果我给它的按钮中出现的文本(但文本是动态的,将导致一个糟糕的测试)。

我是否必须使用getCurrentViews()过滤到文本切换器?或者我必须找出一种方法来遍历从FrameLayout> RelativeLayout> FrameLayout> LinearLayout> TextSwitcher的整个树?

如果我必须遍历整棵树,我如何在观看时查看视图?

3 个答案:

答案 0 :(得分:1)

虽然我无法让ViewGroup()和getChildAt()方法为我工作,但我最终做了不同的事情:

// Grabbing all the LinearLayout views found under view with with id of 'content' 
ArrayList<LinearLayout> linearLayouts = solo.getCurrentViews(LinearLayout.class, solo.getView(R.id.content));

// The 4th item in the linearLayouts list is the one I need
View pickerList = linearLayouts.get(3);

// Grabbing the buttons in the pickerList
ArrayList<TextSwitcher> buttons = solo.getCurrentViews(TextSwitcher.class,pickerList);

// Now I can click on the buttons
solo.clickOnView(buttons.get(0));

我会说这很慢。点击第一个按钮大约需要10秒钟。但一旦它飞了起来。

答案 1 :(得分:0)

我会投票说你真的可能想要在层次结构中添加一些ID,这是一个单行更改,这将使你的生活变得更容易。

但是,如果由于某种原因你不能完成这项工作,我就不会没有帮助,为了做到这一点,你将不得不走完全部去到你想要的视野。

获取顶级视图,您将能够将其转换为ViewGroup。 ViewGroups有一个名为getChildAt()的方法,您可以使用该方法获取给定索引处的子项,索引基于0并且将与您在层次结构查看器中看到的相匹配,因此您可以将这些命令链接在一起以进入视图想与之互动。

答案 2 :(得分:0)

我没有非常使用Robodtium,但我知道AndroidViewClient完全符合你的要求。这是一个转储主视图ID的代码片段:

ViewClient(*ViewClient.connectToDeviceOrExit()).traverse(transform=ViewClient.TRAVERSE_CIT)

这是结果转储:

com.android.launcher2.CellLayout id/cell3 None
     com.android.launcher2.ShortcutAndWidgetContainer NO_ID None
         com.android.launcher2.BubbleTextView NO_ID Email
         com.android.launcher2.LauncherAppWidgetHostView NO_ID None
             android.widget.AnalogClock id/0x7f0f0014 None
         com.android.launcher2.BubbleTextView NO_ID Camera
         com.android.launcher2.BubbleTextView NO_ID Settings
         com.android.launcher2.BubbleTextView NO_ID Gallery
         com.android.launcher2.LauncherAppWidgetHostView NO_ID None
             android.widget.LinearLayout id/0x7f080167 None