2013-12-13 51 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票:) :) –