UIACollectionView细胞VS visibleCells(UIACollectionVi

2019-08-03 18:30发布

我试着写在Xcode 4.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 ,第二日志行打印:

Cells: [object UIAElementArray] length 12

虽然我在集合视图100项和第三日志行崩溃脚本。

这是一个文档/ UIACollectionView错误?

任何想法如何,我可以告诉自动化滚动,直到它看到的小区,其名称为“我的手机”? 我已经尝试使用someCell.scrollToVisible ,但我需要有电池要做到这一点,和我没有,因为我无法从细胞得到它。

编辑:

正如乔纳森建议我已经实现了一个滚动,直到发现的功能。 这是一个有点特殊的实现,所以你可能需要调整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;
}

Answer 1:

该文档是不正确明显。 没有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自动化一样。 他们必须全部被实例化,并以获得元素表示计算的。

不过,要回答你的更大的问题,如何滚动到一个特定的细胞。 你可以持续滚动它到视图与滑动手势? 这不是做最便捷的方式,我们正在通过滚动与表视图不可见元素的能力“宠坏了”。 但是,从用户行为测试的角度来看,刷卡一定是用户无论如何都会做。 可以在测试结构化,以反映这一点,它会满足您的需求?



Answer 2:

我不能得到的@marmor dragInsideWithOptions()位以通用的方式工作。 相反,我使用的CollectionView的价值()函数来获取当前页与最后一页的指标,如“11第3页”。 然后,我用的CollectionView的scrollUp()和下滚()方法,通过网页走,直到我们找到了我们所追求。 我写了一个扩展的TuneUp的uiautomation-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 + "'");
  }
});


文章来源: UIACollectionView cells vs visibleCells