做IOS自動化的過程中,會遇到兩個問題,需要開發對代碼的支持。
1. 用instruments總是會獲取不到一些UI元素
2. 客戶端中沒有固定的ID供
測試代碼來確定頁面元素。然后只能通過target.frontMostApp().mainWindow().scrollViews()[0].tableViews()[0].cells()[0].tap(); 這樣的方式來定位元素。
第一個問題產生的原因是在客戶端開發的過程,需要自定義大量的UIView來滿足需求。這些UI有兩種構建方式,
1. 用原生的UI組件來拼接
2. 通過一些自己來畫
instruments 是通過元素的isAccessibilityElement屬性來判定元素是否可見。
解決方案:
1. 原生的UI組件的isAccessibilityElement默認是YES的。自定義的UI組件的isAccessibilityElement屬性是NO,當isAccessibilityElement為NO時,instruments將無法捕獲。而且
蘋果的UI還有覆蓋性之說,所以這種情況,我們需要將自定義的 UI的子UI的isAccessibilityElement屬性置為YES,而不是自定義的UI本身,instruments就能獲取到。
如
@interface SNCommentHeaderView : UIView { UIImageView *headerBgView; UILabel *titleLabel; } - (id)initWithFrame:(CGRect)frame { NSLog(@"SNCommentHeaderView_init"); self = [super initWithFrame:frame]; if (self) { // Initialization code headerBgView = [[UIImageView alloc] initWithImage:[UIImage skinImageNamed:@"comment_sectionheader_title_bg.png"]]; CGRect bgFrame = headerBgView.frame; bgFrame.origin.y = 10; headerBgView.frame = bgFrame; headerBgView.isAccessibilityElement = YES; [self addSubview:headerBgView]; titleLabel = [[UILabel alloc] initWithFrame:UIEdgeInsetsInsetRect(bgFrame, UIEdgeInsetsMake(0, 0, 1.5, 0))]; titleLabel.backgroundColor = [UIColor clearColor]; titleLabel.font = [UIFont fontWithName:BOLD_FONT_NAME size:12]; titleLabel.textAlignment = UITextAlignmentCenter; titleLabel.textColor = [UIColor skinColorForKey:SNSkinCommentSectionHeaderColor]; titleLabel.isAccessibilityElement = YES; [self addSubview:titleLabel]; } return self; } |
2. 非原生控件成的UI,instruments暫時是不支持獲取的。在蘋果官方文檔中又一套非正式的創建自定義UI的方式。針對這種情況,只能通過去定位他的父節點定位了。如果需要驗證的話,可以將自定義UI的內容通過設置accessibilityIdentifier或者accessibilityLabel,然后通過父節點取得值來驗證。
做IOS自動化,只能通過target.frontMostApp().mainWindow().scrollViews()[0].tableViews()[0].cells()[0].tap(); 這樣來定位坐標是個很原始的方式,而且需要變化比較快,一旦UI方式改變,case會受到很大的影響。所以假使在源碼中通過對一些比較固定或case中功能點的元素設置accessibilityIdentifier,然后腳本可以通過這accessibilityIdentifier來定位元素,可以大大減少自動化腳本的維護成本,也可大大提高開發速度。