在许多 Mac 中运行 UIAutomation 脚本?

Posted

技术标签:

【中文标题】在许多 Mac 中运行 UIAutomation 脚本?【英文标题】:running UIAutomation script in many macs? 【发布时间】:2013-12-13 07:54:11 【问题描述】:

我可以在我使用的 mac 中很好地创建和回放以下脚本。

  var target = UIATarget.localTarget();

  UIATarget.localTarget().delay(15);

  target.frontMostApp().mainWindow().tableViews()[0].textFields()[0].tap();

当我在另一台 Mac 上运行上述脚本时,它在第 3 行显示错误。 将上述脚本的第三行更改如下后,它可以正常回放。

  target.frontMostApp().mainWindow().tableViews()[1].textFields()[0].tap();

只是我已将 tableview 的索引从 0 更改为 1。如何在多个中实现这一点 mac系统?两个 mac 都具有相同的 xcode 版本(xcode 5)和模拟器版本(6.1)和 mac 版本。为什么 Instruments 在不同的 mac 中采用不同的脚本 API?

【问题讨论】:

【参考方案1】:

为了获得更一致的结果,其中一种方法可以是按名称(或其他标识符/预期内容/包含的单元格数量等)访问 AX 元素。例如这里Trouble Getting Elements by Name from UIAElementArray in UIAutomation SO question和关于如何以不同方式设置元素名称的相应讨论。

例如:

var mainWindow = UIATarget.localTarget().frontMostApp().mainWindow();
var tableViews = mainWindow.tableViews();
tableViews['TableView'].textFields()[0].tap();

var mainWindow = UIATarget.localTarget().frontMostApp().mainWindow();
var tableViews = mainWindow.tableViews();
tableViews['TableView'].textFields.withName("TextFieldName")[0].tap();

如果使用名称不可行,可以分析表格的内容,并根据该正确选择表格。例如,如果表格有一些名称为“单元格名称”的单元格:

var mainWindow = UIATarget.localTarget().frontMostApp().mainWindow();
var tableViews = mainWindow.tableViews();
if (tableViews[0].cells().firstWithName("Cell name")) 
    tableViews[0].textFields()[0].tap();
 else if (tableViews[1].cells().firstWithName("Cell name")) 
    tableViews[1].textFields()[0].tap();

有关在 tableView 中识别单元格的更多详细信息,例如 SO 问题 UIACollectionView cells vs visibleCells 这看起来不是很好,但它可能是合理的解决方法,并且应该非常可靠。如果这些表格中的单元格数量已知且不同,则可以比较单元格数量以找到所需的表格。

【讨论】:

如何在不手动更改脚本名称的情况下做到这一点?我想在另一个mac中按原样运行脚本而不将元素转换为其名称? Xcode 和模拟器中是否有任何选项可以自动生成带有元素名称的代码? 我在更改 UI 元素的顺序/位置会破坏 UI 自动化测试时遇到问题,因此我尝试将测试更改为使用名称而不是子元素索引。我不知道为什么你的结果对于不同的 Mac 是不同的,可能还有一种方法可以在不使用名称的情况下解决这个问题。我认为 Xcode 会自动为元素生成名称(至少某些元素会有它们,可能取决于元素类型/内容)。我使用了'target.frontMostApp().mainWindow().logElementTree();'打印当前元素名称。 有什么办法?请给我50票给你:) 已编辑答案,描述如何通过分析元素的层次结构(元素的子元素)来识别元素。 不清楚是什么原因,试试'target.frontMostApp().mainWindow().logElementTree();'两台机器并比较结果。如果构建相同但存在问题,则可能与 Xcode 无关。

以上是关于在许多 Mac 中运行 UIAutomation 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

连接到 Mac 系统时,使用 Xcode UIAutomation 记录 ios 应用程序上的用户交互

如何使用 Jenkins 运行 UIAutomation?

Appium超详细环境搭建for Mac

如何让 UIAutomation、模拟器和 Xcode 调试器同时运行?

如何使用 Xcode 机器人在模拟器上运行 UIAutomation

如何使用UIAutomation进行iOS 自动化测试