2013-03-06 38 views
6

Tôi đang sử dụng công cụ "Công cụ" Xcode để xây dựng tự động hóa cho ứng dụng iOS và tôi cần phải xác minh rằng nhãn cho mục nhập mà tôi đã tạo trong ứng dụng của mình là chính xác.Làm cách nào để xác minh tên của nhãn trong chế độ xem bảng bằng cách sử dụng Công cụ trên iOS?

Mã được liệt kê bên dưới là vì một lý do nào đó, không dẫn đến lỗi vượt qua hoặc không thành công. Thay vào đó, khi nó chạy, tôi nhận được cảnh báo "Sự cố" trong nhật ký và các lần thoát thử nghiệm mà không đóng một cách rõ ràng.

Tôi muốn thay đổi các bài kiểm tra để tôi kiểm tra tên nhãn mà tôi biết đang được tạo, bởi vì tôi có thể thấy nó bằng AccessibilityViewer sau khi tự động hóa của tôi chạy.

Nếu nhãn là chính xác, sau đó tôi muốn đăng nhập kiểm tra dưới dạng thẻ.

Tôi đã sử dụng UIATarget.localTarget().logElementTree() để ánh xạ cây phần tử của mình và tôi đã sử dụng AccessibilityInspector để xác minh tên nhãn của tôi sau khi mục nhập của tôi đã được tạo. Rắc rối là, tôi chỉ không thể có được cú pháp để xác minh điều này đúng.

Trình kiểm tra khả năng truy cập của tôi đã xác minh rằng tên nhãn là: MyDogs! và nó có các đặc điểm của Văn bản tĩnh và cung cấp Khung hình của {{114, 0}, {166,480}}

Bằng cách xem cây phần tử - mà tôi muốn tôi có thể dán ở đây, nó trông giống như nhãn sẽ được tìm thấy dọc theo con đường này:

\Target 
-+ 
--\Application 
---+ 
----\Window 
-----+ 
------\TableView 
-------+ 
--------\TableCell: name:MyDogs! rect:{0, 40},{480,166}} 
---------|UIAStaticText: name:MyDogs! value:MyDogs! rect:{{0, 40},{480, 166}} 
---------|UIAButton: name:story list share rect:{{439, 41},{33, 28}} 

Bất cứ ai có thể cho tôi biết cách xác minh nhãn này?

mã hiện tại của tôi trông như thế này (nhưng không được kiểm tra nhãn - bởi vì tôi không biết làm thế nào để):

var testName = "LoginCreateEntry"; 

//Start test logging 
UIALogger.logStart(testName); 

//This is supposed to target the entry that my automation has created. 
//The flow goes, run the automation that creates the entry, then verify that the entry 
//got created as expected and is visible to the user in the iPhone interface. 

    var myEntry = target.frontMostApp().mainWindow().scrollViews().staticTexts()["My Dogs!"].value(); 

    var entryName = "My Dogs!"; 

//Do a bunch of UI automation here to create my entry, which results in the entry 
//appearing in the mainWindow with the label: My Dogs! 

//If myEntry evaluates to true, then call this test a pass. 

if (myEntry === entryName) {  
UIALogger.logMessage("My entry was created!"); 

    //Mark the test as a PASS 
    UIALogger.logPass(testName); 
} 
else { 

    UIALogger.logMessage("My entry was not created!"); 

    //Mark the test as a FAIL 
    UIALogger.logFail(testName); 
    } 

//End test 

Bất kỳ thông tin phản hồi hoặc trợ giúp sẽ được đánh giá cao nhất !!

--------------------------------- CẬP NHẬT ------------ --------------------------
Cảm ơn tất cả vì sự giúp đỡ của bạn! Tôi thực sự có giá trị của tiêu đề và sẽ hiển thị giải pháp của tôi bên dưới. Nhưng tôi KHÔNG THỂ nhận được chức năng ghi/không đăng nhập để hoạt động chính xác bất kể tôi làm gì - và vấn đề cũng là encountered by others. Tôi tiếp tục nhận được các thông báo

Issue: Script ended without explicting closing this test

cuối bài kiểm tra của tôi. Tôi đang bị thuyết phục rằng đó là một lỗi với dụng cụ.

Dưới đây là thử nghiệm cập nhật của tôi:

var target = UIATarget.localTarget(); 
var app = UIATarget.localTarget().frontMostApp(); 

var testName = "LoginCreateEntry"; 

//Start test logging 
UIALogger.logStart(testName); 

//Do lots of gui automation stuff here to create the entry which will appear in my app interface. 
//I want to verify that the title I gave the entry matches what appears in the app interface 

var window = app.mainWindow(); 
var tableView = window.tableViews()[0]; 
var tableGroup = tableView.groups()[0]; 
var entryName = "My Dogs!"; 

var myEntry = tableView.cells()[0].name(); //<-- This is what I needed!!! 

UIALogger.logMessage("My Story Title: " + myEntry); //Print out entry name in log 

if (myEntry === entryName) {  

    UIALogger.logMessage("My entry was created!"); 

    //Mark the test as a PASS 
    UIALogger.logPass (testName); 

} else { 

    UIALogger.logMessage("My entry was not created!"); 

    //Mark the test as a FAIL 
    UIALogger.loFails (testName); 

    } 
//End test 
+0

Tôi đã thực hiện một số điều chỉnh cho câu hỏi của bạn để phù hợp với tùy chọn kiểu chung trên SO cũng như cung cấp cho bạn nhiều thẻ tập trung hơn, tôi hy vọng điều này sẽ giúp bạn nhận được câu trả lời hay. Câu hỏi tuyệt vời btw! –

+0

Điều gì đó có thể thú vị cho các trường hợp tương lai như thế này - nếu bạn tự tìm câu trả lời, có vẻ như OK để đăng câu trả lời trên SO và chấp nhận nó. :) Xem http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question –

Trả lời

5

tôi khuyên bạn nên sử dụng tuneup_js. Với thư viện mà bạn có thể dễ dàng tạo ra các trường hợp thử nghiệm và kiểm tra xem nhãn tồn tại và bằng My Dogs

Bạn có thể sử dụng nó như

test("LoginCreateEntry", function(target,app){ 
    //Create Entry 
    //.... 
    var myEntry = target.frontMostApp().mainWindow().scrollViews().staticTexts()["My Dogs!"].name(); 

    //Check is Label is equal to My Dogs 
    //Test "LoginCreateEntry" will fail if myEntry is not equal to My Dogs 
    assertEquals(myEntry, "My Dogs"); 
}); 

T.B. này bạn nên sử dụng .name() và không phải .value() để lấy tên của nhãn

+0

Cảm ơn rất nhiều! Hóa ra đây là những gì tôi cần: var myEntry = tableView.cells() [0] .name(); – Wulf

5

Ít nhất là vào mùa hè 2012 và iOS 5, tôi thấy mình không thể truy cập phần tử UIA theo AccessibilityLabel trừ khi AccessibilityIdentifier cũng được đặt.

Và thật không may là vào thời điểm đó (và kể từ Xcode 4.2) khả năng truy cậpIdentifier chỉ có thể được đặt trong mã, không phải trong Trình tạo giao diện. Không chắc chắn nếu mọi thứ đã được cải thiện kể từ đó. Xem câu hỏi này SO cho biết thêm:

can I set accessibility identifier in interface builder? Xcode4.2

Nhưng như tôi đã đề cập, bạn có thể truy cập UIA bởi automationIdentifier để làm việc nếu bạn có quyền truy cập vào mã nguồn của ứng dụng, mặc dù. (Hoặc có thể ảnh hưởng đến ai đó có quyền truy cập, tôi giả sử!)

Tôi có một dự án về github cho thấy cách đặt bộ tiếp cậnIdentifier trên UILabel (trong nguồn ứng dụng) và sau đó viết kiểm tra UIA để truy cập thành phần cách mã của bạn dường như đang cố gắng làm.

Đầu tiên là tập tin thử nghiệm của tôi, nơi tôi cố gắng xác định vị trí một UILabel hiển thị chuỗi "!":

https://github.com/billagee/UnicodeTapper-iphone4.2/blob/master/UnicodeTapperTests/tests.js

// for iOS 5 - note 4 must be handled differently 
    var charDisplayed = window.staticTexts()["bigCharLabel"].value(); 
    if (charDisplayed == "!") { 
     UIALogger.logPass("Exclamation point displayed at startup"); 
    } else { 
     UIALogger.logFail("Incorrect character displayed: " + charDisplayed); 
    } 

Sau đó, trong nguồn ứng dụng mục tiêu, thiết lập các thuộc tính truy cập của UILabel trông như thế này:

// If device supports it, set accessibility identifiers for the UILabels 
// in order to find them in UIAutomation easily. Note that the 
// accessibilityIdentifier can't be set in IB yet, as of Xcode 4.3.3; 
// also, it's only supported in iOS 5 and up. 
topBarLabel.isAccessibilityElement = YES; 
bigCharLabel.isAccessibilityElement = YES; 
if ([topBarLabel respondsToSelector:@selector(accessibilityIdentifier)]) { 
    topBarLabel.accessibilityIdentifier = @"topBarLabel"; 
    bigCharLabel.accessibilityIdentifier = @"bigCharLabel"; 
} else { 
    topBarLabel.accessibilityLabel = @"topBarLabel"; 
    bigCharLabel.accessibilityLabel = @"bigCharLabel";   
} 

nguồn đầy đủ là ở đây:

https://github.com/billagee/UnicodeTapper-iphone4.2/blob/master/UnicodeTapper/UnicodeTapperViewController.m

+0

Thông tin này đã được chuyển cho nhóm Dev của chúng tôi và rất hữu ích. Rõ ràng là các ứng dụng được thử nghiệm không được thiết kế với tự động hóa trong tâm trí vì vậy đây đã là một kinh nghiệm học tập cho tất cả mọi người. Ứng dụng iOS có nghĩa là để phân phối hàng loạt cần được thiết kế với sự tự động hóa trong tâm trí từ khi bắt đầu. – Wulf

+0

Cảm ơn rất nhiều, nhân tiện! – Wulf

+0

Rất vui vì nó hữu ích! Nếu câu trả lời này và câu trả lời của người đăng bài khác hữu ích, thì việc upvoting chúng luôn được đánh giá cao. Mà nhắc tôi, tôi nên upvote câu hỏi của bạn. –