草庐IT

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

coder 2023-11-28 原文

我已经完成了一些谷歌搜索,并在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/

    有关android - 除了UIAutomator 2.0版本名称,UIObject和UIObject2之间有什么区别?的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

      为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

    6. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    7. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

      它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

    8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

    9. ruby - Infinity 和 NaN 的类型是什么? - 2

      我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

    10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    随机推荐