2013-02-11 28 views
5

Tôi chỉ mới bắt đầu với Giao diện người dùng tự động hóa cho ứng dụng iOS của mình và đã gặp sự cố. Tôi không thể đính kèm ảnh chụp màn hình vì vậy tôi sẽ cố gắng hết sức để mô tả kịch bản của mình.Yếu tố Tự động hóa giao diện người dùng iOS không tìm thấy phần tử phụ

Tôi đang xây dựng cho iOS 6.0 và đang sử dụng bảng phân cảnh. Ứng dụng sẽ khởi chạy với màn hình có bộ điều khiển điều hướng. Bộ điều khiển chế độ xem gốc chứa chế độ xem chính có 1 chế độ xem phụ UIView chiếm 60% màn hình dưới cùng và điều khiển phân đoạn nằm phía trên chế độ xem phụ đó. Tôi đã có thể định cấu hình khả năng truy cập cho chế độ xem chính (nhãn "chế độ xem chính"). Tôi sau đó có thể xác định vị trí yếu tố này trong bài kiểm tra của tôi không có vấn đề. Tuy nhiên, tôi hiện đang gặp sự cố khi tìm bộ điều khiển được phân đoạn. Vì vậy, tôi quyết định đăng xuất độ dài của "elements()" và "segementedControls()" từ phần tử "mainview" của tôi và độ dài của mỗi mảng là 0. Vì vậy, bằng cách nào đó khi thử nghiệm đang chạy ứng dụng của tôi, nó nói rằng không có phụ -trạng thái trên quan điểm chính của tôi.

Một điều cần lưu ý là tôi không thể tìm thấy bất kỳ phần trợ năng nào trong trình kiểm tra nhận dạng của trình chỉnh sửa bảng phân cảnh cho điều khiển được phân đoạn. Tuy nhiên, tôi tạm thời thêm một nút vào khung nhìn chính và cấu hình bằng nhãn trợ năng, chỉ để kiểm tra xem các phần tử() hoặc các nút() sau đó có hiển thị một phần tử cho khung nhìn chính khi chạy thử nghiệm của tôi không, nhưng các mảng này vẫn còn trở lại trống rỗng, ngay cả với nút.

Dưới đây là kịch bản của tôi:

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

function selectListView() { 
var testName = "selectListView"; 

UIALogger.logStart(testName); 

var view = app.mainWindow().elements()["mainview"]; 
if (!view.isValid()) { 
    UIALogger.logFail("Could not locate main view");  
} 

UIALogger.logMessage("Number of elements for sub element: " + view.elements().length); 

var segmentedControl = view.segmentedControls()[0]; 
if (!segmentedControl.isValid()) { 
    UIALogger.logFail("Could not locate segmented control on physician collection parent view"); 
} 

var listButton = segmentedControl.buttons()[1]; 
if (!listButton.isValid()) { 
    UIALogger.logFail("Could not locate list button on segemented controller on physician collection parent view"); 
} 

UIALogger.logMessage("Tapping List button on physician collection view's segmented control"); 
listButton.tap(); 

UIALogger.logPass(testName); 
} 

selectListView(); 

Bất kỳ trợ giúp đánh giá rất cao.

CHỈNH SỬA: Tôi đã thêm mã này vào tập lệnh của mình để tìm kiếm toàn bộ phân cấp chế độ xem từ cửa sổ chính, đặt giá trị nhãn trợ năng cho điều khiển được phân đoạn của tôi trong initWithCoder (vì tôi dường như không thể đặt nó trong trình chỉnh sửa bảng phân cảnh cho một điều khiển phân đoạn, như tôi đã nói ở trên) và vẫn không thể tìm thấy nguyên tố này - nó như thể nó chỉ là không có trong hệ thống phân cấp xem, mặc dù đó là trên màn hình và chức năng tốt:

function traverse(root, name) { 
if (root.name() == name) { 
    return root; 
} 

var elements = root.elements(); 

for (var i = 0; i < elements.length; i++) { 
    var e = elements[i]; 

    var result = traverse(e, name); 
    if(result != null) { 
     return result; 
    } 
} 

return null; 
} 

function selectListView() { 
var testName = "selectListView"; 

var segmentedControl = traverse(UIATarget.localTarget().frontMostApp().mainWindow(), "mysegementedcontrol"); 
if (segmentedControl == null) { 
    UIALogger.logMessage("Still could not find it"); 
} 

.... 
} 

EDIT: nhập cuộc gọi đến app.logElementTree() và vẫn không có kiểm soát phân đoạn nào trong tầm nhìn ("PhysicianCollectionParentView" là "chế độ xem chính" của tôi - bạn có thể thấy, không có phần tử con nào ở đó):

enter image description here

EDIT: Dưới đây là một số ảnh chụp màn hình. Đầu tiên cho thấy bộ điều khiển xem "chính" của tôi. Tiếp theo cho thấy rằng ngoài việc kiểm soát phân đoạn cũng có một subview UIView. Điểm thứ 3 hiển thị điểm vào cơ bản cho ứng dụng trong bảng phân cảnh của tôi.

This shows the "master" view controller

This shows that in addition to the segmented control there is also an UIView subview

This shows the basic entry point part of my storyboard file

Đây là phần mở rộng lớp cho "chủ nhân" điều khiển quan điểm của tôi ở đây, cho thấy thị trường tiêu thụ cho điều khiển phân đoạn và subview UIView khác:

@interface PhysicianCollectionMasterViewController() 
@property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl; 
@property (strong, nonatomic) IBOutlet UIView *physicianCollectionView; 
@end 

EDIT: Đây là một cái gì đó rất thú vị - Tôi quyết định đi với một thương hiệu mới tập lệnh được tạo trong các công cụ và tận dụng lợi thế của tính năng ghi.Khi tôi nhấp vào kiểm soát phân đoạn của tôi, đây là hoạt Javascript nó tạo ra để cho tôi xem nó như thế nào đã truy cập một trong các nút trên điều khiển phân đoạn của tôi:

var target = UIATarget.localTarget(); 

target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}}); 

Vì vậy, tôi đoán trường hợp xấu nhất tôi có thể đi với một cái gì đó như thế này , nhưng nó không có ý nghĩa với tôi rằng UI Automation chỉ không nghĩ rằng điều khiển tồn tại. Lạ quá. Phải có một cái gì đó tôi đang thiếu nhưng thiết lập của tôi là rất cơ bản tôi không thể tưởng tượng những gì nó có thể được.

+0

upvoted để bạn có thể hopefulyl thêm bức ảnh scree bây giờ ... –

+0

Hãy thử gọi 'app.logElementTree();' từ kịch bản của bạn nó sẽ đăng nhập cây nguyên tố hoàn chỉnh cho màn hình hiện tại . –

+0

Cảm ơn bạn đã upvote! Cũng cảm ơn thông tin về logElementTree(). Tôi sẽ chạy nó và đăng đầu ra ở đây. – fogwolf

Trả lời

4

Khi bạn đặt khả năng truy cậpLabel cho một phần tử và gắn cờ nó là isAccessibilityElement = YES;, các phần phụ của phần tử đó sẽ bị ẩn. Cho tự động hóa, bạn nên sử dụng accessibilityIdentifier thay vì accessibilityLabel và thiết lập isAccessibilityElement = NO;

Trong mã C mục tiêu của bạn sau khi physicianCollectionView được trả lại, loại bỏ các nhãn và khả năng tiếp cận cờ và làm điều này thay vì:

physicianCollectionView.accessibilityIdentifier = @"PhysicianCollectionParentView"; 
physicianCollectionView.isAccessibilityElement = NO; 

Đối với yếu tố cuối cùng trong phần tử cây, mà không có quan điểm phụ, thiết lập isAccessibilityElement = YES;

+0

Cảm ơn tôi sẽ thực hiện cú đánh này! – fogwolf

1

Nếu bạn đã không thử nó đã có, bạn có thể thử thêm một sự chậm trễ ở phần đầu của kịch bản của bạn:

UIATarget.localTarget().delay(3); 

tôi nghĩ rằng nó có thể là ứng dụng của bạn không được thực hiện render/hiệu ứng động trước logElementTree() mà bạn đã đăng ở trên. Chúng tôi thêm sự chậm trễ ngay từ đầu và giữa mỗi lần chuyển đổi ứng dụng trong các tập lệnh thử nghiệm tự động của chúng tôi để đảm bảo rằng màn hình đã hoàn tất hiển thị.

EDIT: Sau khi rối tung xung quanh với thiết lập của bạn trong một ứng dụng thử nghiệm, tôi tin rằng vấn đề của bạn là bạn đang bật Trợ năng trên UIView có chứa kiểm soát được phân đoạn của bạn. Với khả năng truy cập vô hiệu hóa trên UIView, tôi có thể nhận được UISegmentedControl để hiển thị trong cây phần tử, nhưng một khi tôi kích hoạt nó, UIView sau đó bắt đầu hiển thị như là một UIAElement không có con. Đề xuất của tôi là vô hiệu hóa trợ năng cho UIView chứa và chỉ sử dụng trợ năng cho các điều khiển cơ sở (như nút, ô xem bảng hoặc nút điều khiển phân đoạn của bạn).

+0

Thanks.I đã thử điều này nhưng sẽ thử lại. Bạn đề nghị thời gian nào? Tôi đã thử 5 giây nhưng sẽ làm nó rung lên chỉ để xem. Việc kiểm soát segemented chắc chắn là có thể nhìn thấy nhưng có thể trì hoãn đủ thời gian sẽ chăm sóc nó. – fogwolf

+0

Vui lòng xem phần chỉnh sửa cho câu trả lời gốc. – Bradford2000

+0

Sửa lỗi đó cho tôi! Cảm ơn bạn đã dành rất nhiều thời gian để giúp tôi. – fogwolf

Các vấn đề liên quan