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

时间:2016-11-30 06:26:41

标签: android android-uiautomator

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

2 个答案:

答案 0 :(得分:13)

主要差异:

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

    在我看来,UiObject2是屏幕上存在的真实视图直接表示,允许您对该视图执行操作。 UiObject表示 可以采取这种观点。

    UiObject as the docs say,代表在屏幕上查找内容的方法。这意味着您可以在以后重新使用UiObject实例来查找匹配元素的另一个实例。

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

    UiObject2 as the docs say,表示页面上特定的项目实例,因此无法在以后重新使用它来查找其他元素就像UiObject一样。如果您有一个UiObject2实例,那么您“保证”页面上存在与该实例匹配的视图,并且实例只能使用一次。

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

    等待视图存在/查找视图

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

    1. UiDevice.findObject(UiSelector)(返回UiObject),然后是UiObject.waitForExists(timeout)
    2. UiDevice.wait(Until.findObject(SearchCondition, timeout) (返回UiObject2)
    3. 在这两种情况下,超时都是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.findObject(UiSelector)这样的UiDevice上使用方法。您曾经能够直接实例化UiObject,但是February, 2014中不推荐使用该构造函数,因为它隐藏了使用UiDevice来查找元素的事实。

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

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

      意见:语义命名

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

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

答案 1 :(得分:1)

UIObject类:
UiObject是视图的表示。 它不以任何方式直接绑定到视图作为对象引用。 UiObject包含帮助它在运行时查找匹配视图的信息  基于其构造函数中指定的UiSelector属性。 一旦创建了UiObject的实例,它就可以重用于不同的实例  符合选择标准的视图。

https://developer.android.com/reference/android/support/test/uiautomator/UiObject.html

UiObject2:
 UiObject2表示UI元素。与UiObject不同,它必然是一个  特定的视图实例,如果底层视图对象被销毁,它可能会变得陈旧。  因此,可能需要调用findObject(BySelector)来获取a  如果UI发生显着变化,则新的UiObject2实例。

https://developer.android.com/reference/android/support/test/uiautomator/UiObject2.html

相关问题