gpt4 book ai didi

android - 除了UIAutomator 2.0版本名称,UIObject和UIObject2之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:24:51 34 4
gpt4 key购买 nike

我已经完成了一些谷歌搜索,并在Android Developer网站上进行了搜索,但找不到合适的答案。有人可以帮我吗?提前致谢。

最佳答案

主要区别:

  • 它们代表什么
  • 等待 View 存在/查找 View
  • 滚动

  • 他们代表什么

    用我的话说,UiObject2是屏幕上存在的真实 View 的直接表示,并允许您在该 View 上执行操作。 UiObject表示如何查找屏幕上可能存在的元素,以及可以对该 View 执行的操作。

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

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

    UiObject2 as the docs say,表示页面上项目的 特定实例,因此无法在以后的时间以与UiObject相同的方式重新用于查找另一个元素。如果您有UiObject2实例,则可以“保证”页面上存在与该实例匹配的 View ,并且该实例只能使用一次。

    在与上述相同的示例中,关闭了模式对话框之后,您将必须使用UiObject2 API(UiDevice.findObject(Until....))来检索表示工具栏的UiObject2的新实例,因为旧的已经过时了观点。

    等待 View 存在/查找 View

    执行操作后,您可能要等待页面上存在 View 。有两种方法可以做到这一点:
  • UiDevice.findObject(UiSelector)(返回UiObject),然后是UiObject.waitForExists(timeout)
  • UiDevice.wait(Until.findObject(SearchCondition), timeout)
    (返回UiObject2)

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

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

    您可以在By实用程序类上找到与UiSelector类类似的方法,但是方法名称完全不同。例如,By.res(String resourceName)UiSelector.resourceId(String id)可以完成相同的任务,但是显然具有不同的名称,这使您认为它们可以完成不同的事情。

    我认为:UiObject api更好,因为查找 View 与等待 View 的操作不同。这使您可以随时等待要查找的任何 View 。另一方面,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,但是February, 2014中不赞成使用该构造函数,因为它隐藏了使用UiDevice查找元素的事实。

    UiScrollable是UiObject的子类。一个UiScrollable的one constructor带有一个UiSelector作为参数。该构造函数仅调用super,直到到达上述UiObject弃用的构造函数为止。

    重申一下:您只能使用UiDevice获得一个UiObject。但是要获得UiScrollable,您只能使用已被弃用的构造函数直接将其实例化。

    意见:语义命名

    我认为:如果将UiObject2命名为ResolvedUiObject之类的名称,它将使api的 Intent 更加清晰。 UiObject2没有传达类的语义目的,因此导致了这个stackoverflow问题。

    我几乎可以说UiObject.waitForExists()应该在编写时返回UiObject2,因为UiObject的本质上是用作 View 的定位器(尽管我猜这就是UiSelctor:/),并且结合了对 View 采取的操作, UiObject2包含仅对 View 执行操作的方法。

    关于android - 除了UIAutomator 2.0版本名称,UIObject和UIObject2之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40881680/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com