以下是我对定位器的细分以及我喜欢如何/为什么将它们用于 iOS 自动化。所有这些都是基于我使用原生 iOS 应用程序的经验。
巨大的免责声明:
我对科尔多瓦一无所知。我听说如果有非本地的类名,UIAutomation 存在问题。如果是这种情况,我建议坚持使用可访问性 id 和类名定位器策略。
iOS 自动化定位器
CSS 选择器
Appium 中不存在 CSS 选择器。
类名
最接近 CSS 选择器的是类名选择器。我并没有真正使用它们,因为 UIAutomation 为我提供了我需要的东西,并允许我检查定位器策略中元素的名称/文本。
XPath
您不想使用 XPath,因为它在 iOS 上既慢又不稳定。 (它有时会返回一个完全不正确的元素)。它有时会导致 Instruments 无缘无故地失败。强烈建议远离 XPath。
辅助功能 ID
当 UIAutomation 无法找到元素时,您应该使用它。它比 XPath 更快,但在 UIAutomation 不允许您访问某个元素时很有用(我认为.actionSheets() 已损坏。我在操作表启动时使用它,我需要.click() 一个按钮)
UI自动化
您应该使用 Apple 的 UIAutomation、2 框架,因为它是最快的 iOS 原生解决方案。
UIAutomation 框架允许您使用类和层次结构来指定您想要的元素。使用 Appium 时,请在 webdriver 上使用 find_elements_by_ios_uiautomation 函数。
使用示例 here
但是示例用法并没有告诉您 UIAutomation 的真正强大之处。我遇到的一个常见问题是,当屏幕上有多个 tableview 时,试图找到 tableview 的所有单元格。
查找 UIATableview“Cart”的所有 UIACells
**Sample View Hierarchy**
<application>
<window>
<table name="Items">
<cell name="Foo, not in cart"></cell>
</table>
<table name="Cart">
<cell name="Bar. IM IN YOUR CART"></cell>
</table>
</window>
</application>
现在可以在数组中查找这些单元格:
value = '.tableviews()["Cart"].cells()'
cells = driver.find_elements_by_ios_uiautomation(value)
额外阅读: Guide 介绍谓词以及它们为什么很棒
UIAutomation 的限制
- 如果您的元素没有可见的名称。 (开发者喜欢在“Hint Overlays”之类的后面放置隐形按钮。)
-
建议的解决方案:添加无障碍 id,使用无障碍 id 定位器。
测试定位器策略
Inspector 中有一个不错的地方(在 Appium.app GUI 中提供),可以让您尝试任何您想要的定位器策略和值。你应该使用它。它有很大帮助。