【问题标题】:How does UIAutomation determine whether a UIAElement.isVisible()UIAutomation 如何判断一个 UIAElement.isVisible()
【发布时间】:2012-02-09 19:09:51
【问题描述】:

我有一个具有以下结构的视图:

GrandView
-Parent View1
-Parent View2
--Child View1
--Child View2

子视图几乎占据了Parent View2 的所有边界,但边缘仍有一些空间。如果我单击边缘,我可以在带有辅助功能检查器的模拟器中选择Parent View2。如果我使用,我也可以在 UIAutomation 中点击 Parent View2

tapWithOptions({tapOffset:{x:0.15, y:0.95}});

但是,我对isVisible() 的调用总是返回0。我希望如果我可以点击该元素,或者使用可访问性检查器选择它,它应该返回1

UIAutomation 如何确定UIAElement 是否可见?

【问题讨论】:

    标签: ios ios-simulator ios-ui-automation


    【解决方案1】:

    您对元素执行的每个操作都有超时。这在 Apple 文档中并不明显,但如果您查看:setTimeout,它会告诉我们:

    超时值建立对象解析的宽限期。如果表示 UI 元素的对象在宽限期内可用,则会尝试从仪器保留的信息中实例化该对象。

    setTimeout 本身只是改变了默认值(就像 push 和 pop 一样)。您真正想要做的是在您的视图上执行您的操作,如果它永远不可用,则超时失败(默认超时为 5 秒)。
    WWDC 2010 会议“使用仪器自动化用户界面测试”确实去了稍微深入一点,它可以在 ADC WWDC 2010 页面上找到,包括视频和幻灯片。在您的情况下,您希望在视图上执行 tap() 。如果由于某种原因,该视图在 5 秒内对 UIAutomation 不可用,您应该会看到异常。
    尝试通过以下方式更改超时:

    var oldTimeout = target.timeout(); target.pushTimeout(10);

    在你的代码之前,和

    target.popTimeout(oldTimeout);

    之后。

    【讨论】:

    • 但是,在我看来,我无法执行tap()。正如我在问题中提到的,我只能执行tapWithOptions()。但是,我不想tap() 我的观点,因为这会引发我不关心的操作。我只想知道它存在并且可以点击。
    • 然后访问一个类似 name() 的方法,而不是 tap()。同样,您正在等待该操作超时。您真正要寻找的是“此视图在此超时期限内是否可用”。如果对 name() 的调用超时,则它不可用。如果您的视图需要超过默认的 5 秒才能变为可用,请使用 pushTimeout 和 popTimeout 来延长超时。 tapWithOptions 的工作并不令人惊讶,视图存在但作为其层次结构的一部分还不能用于自动化(即对象解析尚未完成)
    • 我认为这与超时无关。我可以睡 5 分钟,这里什么都不会改变。我觉得这与遮蔽我的观点的其他观点有关。
    • “对象解析尚未完成”表示虽然视图可能在屏幕上,但 UIAutomation 尚无法使用它。这是很常见的,我之前提到的关于 UIAutomation 的 WWDC 2010 会议对此进行了介绍。
    • 即使您的视图被遮挡,它也在视图层次结构中,这就是您在 UIAutomation 中处理的内容。
    【解决方案2】:

    如果是 UIView,它应该由 hidden 属性驱动。如果不是视图,是容器,应该由accessibilityElementsHidden驱动。

    一般来说,您不希望将其用于 UIAutomation。相反,无论您要在视图上做什么——在本例中是一个 tap()——继续执行它,如果超时则让系统抛出一个错误。通常,这是您希望在脚本中遵循的模型,而不是首先测试某些东西是否可用。 Sine UIAutomation 是 UIAccessibility 信息的 DOM 脚本,当发生动画视图转换之类的事情时,事情就会不同步。有时脚本的执行速度比 UI 动画快,有时则相反! waitForInvalid 可能是您解决问题的捷径。

    Alex Vollmer 的用于 UIAutomation 的 tuneup.js 库使编写测试变得更加容易,并且易于扩展。 https://github.com/alexvollmer/tuneup_js

    【讨论】:

    • 我看到它是由 hiddenaccessibilityElementsHidden 以外的东西驱动的,正如我的问题所暗示的那样。我想对isVisible() 属性进行断言,以确保容器存在,而无需检查容器的内容,这可能会发生变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多