我有一个UICollectionView,我想点击一些当前不可见的单元格.
Per documentation,我应该期望单元格返回集合视图中的所有单元格,而visibleCells只返回当前可见的单元格.
相反,我所看到的是,单元格只返回当前可见的单元格,调用visibleCells会停止’undefined’上的脚本不是一个函数(评估’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,但是我需要让单元格来做这件事,而我却不能从单元格中获取它.
EDIT:
正如Jonathan所建议的那样,我实现了一个滚动查找函数.
它有点特定于实现,因此您可能需要调整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; }
解决方法
var target = UIATarget.localTarget(); var window = target.frontMostApp().mainWindow(); var collectionView = window.collectionViews()[0]; for (var i in collectionView) { UIALogger.logMessage(i); }
另一方面,表视图元素使用cells()方法列出所有单元格.我想知道他们是否选择不这样做是因为收集视图的复杂性要复杂得多.实际获取所有集合视图单元格,构建它们的表示和框架,并且如果你有很多元素,则返回元素可能非常昂贵.这就是UI Automation在询问所有单元格的表视图时所做的事情.必须对它们进行实例化和计算才能获得元素表示.
但是,要回答更大的问题,如何滚动到特定的单元格.您是否可以通过滑动手势将其一直滚动到视图中?这不是最方便的方法,我们被表视图滚动到不可见元素的能力“破坏”了.但是从用户行为测试的角度来看,滑动一定量是用户无论如何都要做的事情.测试的结构是否可以反映这一点,是否可以满足您的需求?