默认情况下,UICollectionView的可访问元素只有UICollectionViewCell,自己手动添加的其他视图,在自动化测试中没有办法直接访问,导致部分case无法做自动化测试。
最近研究了一下,发现对于UICollectionView,UITableView这些视图,需要自己维护容器视图的AccessibilityElements。具体的,就是重新实现NSObject (UIAccessibilityContainer)和NSObject (UIAccessibility)分类的几个方法。
1.- (BOOL)isAccessibilityElement
返回YES,所有子视图的可访问性会被隐藏,不可访问;返回NO,则相反。
2.- (NSInteger)accessibilityElementCount
返回可访问视图元素的数量
3.- (id)accessibilityElementAtIndex:(NSInteger)index
通过索引值返回可访问视图元素
4.- (NSInteger)indexOfAccessibilityElement:(id)element
通过视图元素返回索引值
当前需求只为了满足自动化测试,需要自己维护容器视图的AccessibilityElements,所以为了跟业务代码解耦,打算使用category对UICollectionView进行扩展。为了方便添加可访问的视图,在UICollectionView新增加一个extraAccessibilityElements的属性,它是一个可变数组。
@property (nonatomic, strong) NSMutableArray * extraAccessibilityElements;
Objective-c中category本身是不能增加属性定义的,但是通过运行时绑定对象的方法,可以动态的给对象绑定一个属性。首先声明一个全局静态字符串变量,用来标识绑定关系。
static NSString *_extraAccessibilityElementsKey = @"extraAccessibilityElementsKey";
接着手动实现set和get方法
在UICollectionView(AutomateTest)的+(void)load方法中添加对初始化方法和addSubView方法的hook处理,
上面代码的作用是
1.在类初始化方法执行完成后,初始化属性extraAccessibilityElements数组。
2.在添加子视图的操作后,将子视图加入到extraAccessibilityElements数组中。
接着重载AccessibilityElements相关方法。
这样在自动化测试的时候就可以访问UICollectionView中手动添加的视图元素了。而且在代码结构上完全和业务代码解耦了,我们不需要修改任何代码,将实现文件加入到工程中就可以了。