在许多 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 应用程序上的用户交互
如何让 UIAutomation、模拟器和 Xcode 调试器同时运行?