2012-12-09 40 views
5

Tôi đang cố viết kịch bản thử nghiệm bằng cách sử dụng tự động hóa trong xcode 4.5.UIACollectionXem các ô và visibleCells

Tôi có một số UICollectionView và tôi muốn nhấp vào một số ô hiện không hiển thị.

Per documentation, tôi nên mong đợi cells trở tất cả tế bào trong giao diện bộ sưu tập, và visibleCells trở về chỉ có những người hiện đang nhìn thấy được.

Thay vì những gì tôi nhìn thấy là các tế bào sẽ chỉ trả lại các tế bào hiện có thể nhìn thấy, và kêu gọi visibleCells dừng kịch bản trên 'undefined' is not a function (evaluating 'collection.visibleCells()')

var target = UIATarget.localTarget(); 
var collection = target.frontMostApp().mainWindow().collectionViews()[0]; 

UIALogger.logMessage("Looking in collection: " + collection); 
UIALogger.logMessage("Cells: " + collection.cells() + " length " + collection.cells().length); 
UIALogger.logMessage("Visible cells: " + collection.visibleCells()); 

Đoạn mã trên sẽ trả về đúng UICollectionView, thứ hai dòng nhật ký in:

Cells: [object UIAElementArray] length 12 

mặc dù tôi có 100 mục trong chế độ xem bộ sưu tập và tập lệnh dòng nhật ký sự cố thứ ba.

Đây có phải là lỗi tài liệu/UIACollectionView không?

Bất kỳ ý tưởng nào làm cách nào tôi có thể yêu cầu tự động cuộn cho đến khi thấy ô có tên "Ô của tôi"? Tôi đã thử sử dụng someCell.scrollToVisible, nhưng tôi cần phải có tế bào để làm điều đó, và tôi không vì tôi không thể lấy nó từ các tế bào.

EDIT:

Theo đề nghị của Jonathan Tôi đã thực hiện một cuộn cày-tìm thấy chức năng. đó là một thực hiện chút cụ thể, vì vậy có thể bạn sẽ cần phải tinh chỉnh isCellWithName. Tôi cũng đang tìm thêm một break trong trường hợp chúng tôi không tìm thấy các tế bào cần thiết trong vòng lặp while, nếu có ai có ý tưởng, cảm thấy tự do để chỉnh sửa này.

function isCellWithName(cell, name) { 
    return (cell.staticTexts()[0].name() == name); 
} 

function getCellWithName(array, name) { 
    for (var i = 0; i < array.length; i++) { 
     if (isCellWithName(array[i], name)) { 
      return array[i]; 
     } 
    } 
    return false; 
} 

function scrollToName(collection, name) { 
    var found = getCellWithName(collection.cells(), name); 
    while (found === false) { 
     collection.dragInsideWithOptions({startOffset:{x:0.2, y:0.99}, endOffset:{x:0.2, y:0},duration:1.0}); 
     found = getCellWithName(collection.cells(), name); 
    } 
    return found; 
} 
+0

Cảm ơn cho các giải pháp. Hoạt động tuyệt vời. – phatmann

Trả lời

3

Tài liệu có vẻ không chính xác. Không có phương pháp visibleCells() trên UIACollectionView. I figured này ra bởi Looping trên tất cả các yếu tố xem bộ sưu tập thuộc tính và in ra tên của họ:

var target = UIATarget.localTarget(); 
var window = target.frontMostApp().mainWindow(); 
var collectionView = window.collectionViews()[0]; 
for (var i in collectionView) { 
    UIALogger.logMessage(i); 
} 

Bảng yếu tố xem, mặt khác, đừng liệt kê tất cả các tế bào với phương pháp cells(). Tôi tự hỏi liệu họ có chọn không làm điều này vì bản chất phức tạp hơn nhiều trong quan điểm của bộ sưu tập. Nó có thể rất tốn kém để thực sự tìm nạp tất cả các ô xem bộ sưu tập, xây dựng các biểu diễn và khung của chúng, và trả về các phần tử nếu bạn có nhiều phần tử. Đó là những gì UI Automation thực hiện khi nó yêu cầu xem bảng cho tất cả các ô. Họ phải tất cả được instantiated và tính toán để có được các đại diện phần tử.

Nhưng, để trả lời câu hỏi lớn hơn của bạn, cách cuộn đến một ô cụ thể. Bạn có thể cuộn liên tục vào chế độ xem bằng cử chỉ vuốt không? Nó không phải là cách thuận tiện nhất để làm điều đó và chúng tôi "hư hỏng" bởi khả năng di chuyển đến các yếu tố không nhìn thấy được với các khung nhìn bảng. Nhưng từ quan điểm kiểm tra hành vi người dùng, việc vuốt một số tiền nhất định là những gì người dùng sẽ phải làm. Thử nghiệm có thể được cấu trúc để phản ánh điều này và liệu nó có đáp ứng nhu cầu của bạn không?

+0

Bạn nên báo cáo lỗi này cho apple: http://bugreport.apple.com – Daniel

+0

Cảm ơn câu trả lời, tôi đã mở một báo cáo lỗi cho điều này (id: 12844375, liên kết: https://bugreport.apple.com/ cgi-bin/WebObjects/RadarWeb.woa/4/wo/LiIXHvYJovJIBFBOjSPrR0/14.66) – marmor

+0

Tôi đã quản lý để thêm chức năng này theo gợi ý bằng cách kéo và thả, xem EDIT để OP – marmor

0

Tôi không thể nhận được @marmor dragInsideWithOptions() bit để hoạt động theo kiểu chung.Thay vào đó, tôi đang sử dụng hàm value() của collectionView để lấy chỉ mục của trang hiện tại so với trang cuối cùng, như trong "trang 3 của 11". Sau đó, tôi sử dụng các phương thức scrollUp() và scrollDown() của collectionView để đi qua các trang cho đến khi chúng ta tìm thấy những gì chúng ta đang theo dõi. Tôi đã viết một phần mở rộng cho TuneUp 's uiautomation-ext.js mà dường như làm các trick, và nhiều hơn nữa:

function animationDelay() { 
    UIATarget.localTarget().delay(.2); 
} 

extend(UIACollectionView.prototype, { 
    /** 
    * Apple's bug in UIACollectionView.cells() -- only returns *visible* cells 
    */ 

    pageCount: function() { 
    var pageStatus = this.value(); 
    var words = pageStatus.split(" "); 
    var lastPage = words[3]; 
    return lastPage; 
    }, 

    currentPage: function() { 
    var pageStatus = this.value(); 
    var words = pageStatus.split(" "); 
    var currentPage = words[1]; 
    //var lastPage = words[3]; 
    return currentPage; 
    }, 

    scrollToTop: function() { 
    var current = this.currentPage(); 
    while (current != 1) { 
     this.scrollUp(); 
     animationDelay(); 
     current = this.currentPage(); 
    } 
    }, 

    scrollToBottom: function() { 
    var current = this.currentPage(); 
    var lastPage = this.pageCount(); 
    while (current != lastPage) { 
     this.scrollDown(); 
     animationDelay(); 
     current = this.currentPage(); 
    } 
    }, 

    cellCount: function() { 
    this.scrollToTop(); 
    var current = this.currentPage(); 
    var lastPage = this.pageCount(); 
    var cellCount = this.cells().length; 
    while (current != lastPage) { 
     this.scrollDown(); 
     animationDelay(); 
     current = this.currentPage(); 
     cellCount += this.cells().length; 
    } 
    return cellCount; 
    }, 

    currentPageCellNamed: function(name) { 
    var array = this.cells(); 
    for (var i = 0; i < array.length; i++) { 
     var cell = array[i]; 
     if (cell.name() == name) { 
      return cell; 
     } 
    } 
    return false; 
    }, 

    cellNamed: function(name) { 
    // for performance, look on the current page first 
    var foundCell = this.currentPageCellNamed(name); 
    if (foundCell != false) { 
     return foundCell; 
    } 
    if (this.currentPage() != 1) { 
     // scroll up and check out the first page before we iterate 
     this.scrollToTop(); 
     foundCell = this.currentPageCellNamed(name); 
     if (foundCell != false) { 
      return foundCell; 
     } 
    } 

    var current = this.currentPage(); 
    var lastPage = this.pageCount(); 
    while (current != lastPage) { 
     this.scrollDown(); 
     animationDelay(); 
     current = this.currentPage(); 

     foundCell = this.currentPageCellNamed(name); 
     if (foundCell != false) { 
      return foundCell; 
     } 
    } 
    return false; 
    }, 

    /** 
    * Asserts that this collection view has a cell with the name (accessibility identifier) 
    * matching the given +name+ argument. 
    */ 
    assertCellNamed: function(name) { 
    assertNotNull(this.cellNamed(name), "No collection cell found named '" + name + "'"); 
    } 
});