2013-12-13 60 views
4

我可以在我使用的mac中很好地创建并重播以下脚本。在很多mac中运行UIAutomation脚本?

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(); 

只是我已经改变了从0 tableview中的指数为1。我怎么能在多个 Mac系统实现这一目标?两个mac都有相同的xcode版本(xcode 5)和模拟器版本(6.1)以及mac版本。为什么Instruments要在不同的mac中以不同的方式使用脚本API?

回答

1

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

例如:

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这看起来不是很漂亮,但它可以是合理的解决办法,并应工作相当可靠的细节。如果这些表格中的单元格数量已知且不同,则可比较单元格数量以查找所需的表格。

+0

如何在不更改脚本的情况下手动更改脚本名称?我想运行脚本原样,在另一个mac中没有将元素转换为其名称?在Xcode和模拟器中是否有选项自动生成元素名称的代码? –

+0

当改变UI元素的顺序/位置会中断UI自动化测试时,我遇到了一个问题,因此我尝试将测试更改为使用名称而不是子元素索引。我不知道为什么你的结果在不同的Mac上会有所不同,但可能仍有一种方法可以在不使用名称的情况下解决此问题。 我认为Xcode会自动为元素生成名称(至少有一些元素会拥有它们,可能取决于元素类型/内容)。我使用了'target.frontMostApp()。mainWindow()。logElementTree();'打印当前元素名称。 –

+0

是怎么回事?请给我,因为我已经给你50票:) :) –