默認(rèn)情況下布近,UICollectionView的可訪問元素只有UICollectionViewCell获茬,自己手動添加的其他視圖软舌,在自動化測試中沒有辦法直接訪問,導(dǎo)致部分case無法做自動化測試乾胶。
最近研究了一下,發(fā)現(xiàn)對于UICollectionView朽寞,UITableView這些視圖识窿,需要自己維護(hù)容器視圖的AccessibilityElements。具體的脑融,就是重新實現(xiàn)NSObject (UIAccessibilityContainer)和NSObject (UIAccessibility)分類的幾個方法喻频。
1.- (BOOL)isAccessibilityElement
返回YES,所有子視圖的可訪問性會被隱藏肘迎,不可訪問半抱;返回NO,則相反脓恕。
2.- (NSInteger)accessibilityElementCount
返回可訪問視圖元素的數(shù)量
3.- (id)accessibilityElementAtIndex:(NSInteger)index
通過索引值返回可訪問視圖元素
4.- (NSInteger)indexOfAccessibilityElement:(id)element
通過視圖元素返回索引值
當(dāng)前需求只為了滿足自動化測試,需要自己維護(hù)容器視圖的AccessibilityElements窿侈,所以為了跟業(yè)務(wù)代碼解耦炼幔,打算使用category對UICollectionView進(jìn)行擴(kuò)展。為了方便添加可訪問的視圖史简,在UICollectionView新增加一個extraAccessibilityElements的屬性乃秀,它是一個可變數(shù)組。
@property (nonatomic, strong) NSMutableArray * extraAccessibilityElements;
Objective-c中category本身是不能增加屬性定義的圆兵,但是通過運(yùn)行時綁定對象的方法跺讯,可以動態(tài)的給對象綁定一個屬性。首先聲明一個全局靜態(tài)字符串變量殉农,用來標(biāo)識綁定關(guān)系刀脏。
static NSString *_extraAccessibilityElementsKey = @"extraAccessibilityElementsKey";
接著手動實現(xiàn)set和get方法
在UICollectionView(AutomateTest)的+(void)load方法中添加對初始化方法和addSubView方法的hook處理,
上面代碼的作用是
1.在類初始化方法執(zhí)行完成后超凳,初始化屬性extraAccessibilityElements數(shù)組愈污。
2.在添加子視圖的操作后,將子視圖加入到extraAccessibilityElements數(shù)組中轮傍。
接著重載AccessibilityElements相關(guān)方法暂雹。
這樣在自動化測試的時候就可以訪問UICollectionView中手動添加的視圖元素了。而且在代碼結(jié)構(gòu)上完全和業(yè)務(wù)代碼解耦了创夜,我們不需要修改任何代碼杭跪,將實現(xiàn)文件加入到工程中就可以了。