5

xcode4.5で自動化を使用してテストスクリプトを作成しようとしています。

があり、UICollectionView現在表示されていないセルをクリックしたい。

ドキュメントによると、コレクションビューのすべてのセルを返し、現在表示されているセルのみcellsを返すことを期待する必要があります。visibleCells

代わりに、セルは現在表示されているセルのみを返し、visibleCellsを呼び出すとスクリプトが停止します。'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());

上記のコードは、右UICollectionViewの2番目のログ行を返します。

Cells: [object UIAElementArray] length 12

コレクションビューに100個のアイテムがあり、3番目のログ行でスクリプトがクラッシュします。

これはドキュメント/UIACollectionViewのバグですか?

「マイセル」という名前のセルが表示されるまでスクロールするように自動化に指示するにはどうすればよいですか?を使ってみましsomeCell.scrollToVisibleたが、それを行うにはセルが必要です。セルから取得できないため、使用しません。

編集:

Jonathanが提案したように、私はscroll-till-found関数を実装しました。これは実装に少し固有なので、おそらく微調整する必要がありますisCellWithName。また、whileループで必要なセルが見つからなかった場合に備えて、休憩を追加することも検討しています。アイデアがあれば、これを自由に編集してください。

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;
}
4

2 に答える 2

3

ドキュメントは明らかに正しくありません。visibleCells()にメソッドはありませんUIACollectionView。すべてのコレクションビュー要素のプロパティをループし、それらの名前を出力することで、これを理解しました。

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

一方、テーブルビュー要素は、cells()メソッドを使用してすべてのセルを一覧表示します。コレクションビューの性質がはるかに複雑なため、これを行わないことを選択したのではないかと思います。すべてのコレクションビューセルを実際にフェッチし、それらの表現とフレームを作成し、それらが多数ある場合は要素を返すのは非常にコストがかかる可能性があります。これは、UIオートメーションがすべてのセルのテーブルビューを要求するときに行うことです。要素表現を取得するには、すべてをインスタンス化して計算する必要があります。

しかし、あなたのより大きな質問に答えるために、特定のセルにスクロールする方法。スワイプジェスチャで一貫してスクロールして表示できますか?これは最も便利な方法ではなく、テーブルビューで非表示の要素にスクロールする機能に「甘やかされて」います。しかし、ユーザーの行動テストの観点からは、特定の量をスワイプすることは、とにかくユーザーがしなければならないことです。これを反映するようにテストを構成できますか?それはあなたのニーズに対応しますか?

于 2012-12-10T01:47:57.543 に答える
0

@marmordragInsideWithOptions()ビットを一般的な方法で機能させることができませんでした。代わりに、「3/11ページ」のように、collectionViewのvalue()関数を使用して、現在のページと最後のページのインデックスを取得しています。次に、collectionViewのscrollUp()メソッドとscrollDown()メソッドを使用して、目的のページが見つかるまでページをウォークスルーします。TuneUpuiautomation-ext.jsの拡張機能を作成しました。これは、このトリックを実行しているようです。

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 + "'");
  }
});
于 2013-10-01T21:41:07.690 に答える