除了UIAutomator 2.0版本名称之外,UIObject和UIObject2之间的区别是什么?

Ram*_*man 7 android android-uiautomator

我在Android开发者网站上做了一些谷歌搜索和搜索,但我无法找到合适的答案.任何人都可以帮我解决这个问题吗?提前致谢.

Sam*_*Sam 21

主要差异:

  1. 它们代表什么
  2. 等待观点存在/寻找观点
  3. 滚动

它们代表什么

用我的话来说,UiObject2是屏幕上存在的真实视图直接表示,允许您对该视图执行操作.UIObject也的表示如何找到一个元素可以在屏幕上,联合行动,你可以采取这种观点.

文档说,UiObject代表了在屏幕上查找内容的方法.这意味着您可以在以后重新使用UiObject实例来查找匹配元素的另一个实例.

例如:您可以使用UiObject api(UiDevice.findObject(UiSelector))在一个屏幕上找到工具栏以获取UiObject的实例,然后打开模式对话框.解除对话框后,您可以再次使用同一实例访问工具栏.

文档所说的UiObject2表示页面上某个项目特定实例,因此不能再用于在以后以与UiObject相同的方式查找另一个元素.如果您有一个UiObject2实例,则"保证"页面上存在与该实例匹配的视图,并且实例只能使用一次.

在上面的相同示例中,在取消模式对话框之后,您必须使用UiObject2 api(UiDevice.findObject(Until ....))来检索表示工具栏的UiObject2 的新实例,因为旧的那个已经过时了.

等待观点存在/寻找观点

您可能希望在采取操作后等待页面上存在视图.有两种方法可以做到这一点:

  1. UiDevice.findObject(UiSelector)(返回UiObject)后跟UiObject.waitForExists(超时)
  2. UiDevice.wait(Until.findObject(SearchCondition,timeout) (返回UiObject2)

在这两种情况下,超时都是long类型

这是当前api有点不一致的地方.为了使用上面的方法#2,您必须使用UntilBy实用程序类来描述如何在屏幕上查找视图.而对于方法#1,您只使用UiSelector方法.

您将在By类上找到与实用程序类相似的方法UiSelector,但方法名称却完全不同.例如,By.res(String resourceName)完成与UiSelector.resourceId(String id)相同的事情,但显然有不同的名称,这使您认为他们完成了不同的事情.

在我看来:UiObject api更好,因为定位视图不同于等待视图的操作.这允许您随时等待您要查找的任何视图.另一方面,UiObject2 api迫使你选择做什么:你要么打电话device.findObject(By...)要么打电话device.wait(Until.findObject(By...)),但是你被迫选择是否提前等待.

滚动

UiObject2有一个"裸骨"滚动方法:UiObject2.scroll(Direction,percentage).此方法允许您使用预先指定的滚动量在特定方向上滚动,但绝对不是很方便,因为用户必须决定滚动多少.我可以看到这个方法被放入循环:滚动,检查元素是否可见,重复.

另一方面,UiScrollable具有更方便滚动的方法:例如UiScrollable.scrollIntoView(...).这个方法采用UiSelector并且似乎"做必须做的事情"以获得该UiSelector上的匹配并使其可见.这比UiObject2更有用,因为api会为您处理所有事情,并且不需要循环.

额外的不一致

要获取UiObject的实例,必须在UiDevice上使用方法UiDevice.findObject(UiSelector).您曾经能够直接实例化UiObject,但该构造函数在20142月被弃用,因为它隐藏了它使用UiDevice来查找元素的事实.

UiScrollable是UiObject的子类.UiScrollable有一个构造函数,它将UiSelector作为参数.这个构造函数只是调用super,直到它到达上面提到的UiObject的弃用构造函数.

重申一下:你只能使用UiDevice获取UiObject.但是要获取UiScrollable,您只能使用已弃用的构造函数直接实例化它.

意见:语义命名

在我看来:如果UiObject2被命名为类似的ResolvedUiObject东西,它将使api意图更清晰.UiObject2不传达类的语义目的,因此导致了这个stackoverflow问题.

我几乎会说它UiObject.waitForExists()应该在写入时返回UiObject2,因为UiObject基本上用作定位器(虽然我猜,这就是UiSelctor是:/)用于视图与视图上的动作相结合,以及UiObject2包含仅对视图执行操作的方法.