Ios 在许多Mac中运行UIAutomation脚本?

Ios 在许多Mac中运行UIAutomation脚本?,ios,xcode,xcode5,ui-automation,ios-ui-automation,Ios,Xcode,Xcode5,Ui Automation,Ios Ui Automation,我可以在我使用的mac中很好地创建和重放以下脚本 var target = UIATarget.localTarget(); UIATarget.localTarget().delay(15); target.frontMostApp().mainWindow().tableViews()[0].textFields()[0].tap(); 当我在另一台mac上运行上述脚本时,它在第3行显示错误。 在按如下所示更改上述脚本的第三行之后,它可以很好地重放 target.fro

我可以在我使用的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版本。为什么仪器在不同的mac中采用不同的脚本API?

要获得更一致的结果,一种方法是按名称(或其他标识符/预期内容/包含的单元格数等)访问AX元素。例如,这里有一个关于如何以不同方式设置元素名称的问题和相应的讨论

例如:

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

如果使用名称不可行,可以分析表格的内容,并根据该表格选择合适的表格。例如,如果表中的某个单元格名为“cell name”:


更多关于在tableView中识别单元格的详细信息,例如在问题中,这看起来不是很好,但它可以是合理的解决方法,应该工作得相当可靠。如果这些表中的单元格数量已知且不同,则可以比较单元格数量以找到所需的表。

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