Xcode UI测试集合视图单元在iOS 11

时间:2017-10-18 21:49:54

标签: ios xcode ios11 xcode-ui-testing

我们使用此代码模拟在Xcode UI测试中点击UICollectionView的第一个单元格:

XCUIElementQuery *query = [application descendantsMatchingType:XCUIElementTypeAny];
XCUIElement *collectionView = [query objectForKeyedSubscript:collectionViewAccessibilityIdentifier];
XCUIElement *targetCell = [lensesCollectionView.cells elementBoundByIndex:cellIndex];
if (targetCell.hittable) {
    [targetCell tap];
}

这在iOS 10上工作正常,但在iOS 11上停止工作。targetCell无论如何都不会hittable。在sleep(10)之前添加XCUIElement *targetCell = [lensesCollectionView.cells elementBoundByIndex:lensIndex]并没有帮助。

我已经看过其他地方提到的hacky解决方案,例如

func forceTapElement() {   
    if self.isHittable {   
        self.tap()   
    } else {   
        var coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))   
        coordinate.tap()   
    }  
}

但这看起来并不干净。实现这一目标的最简洁方法是什么?

更新:如果我尝试点击它而不检查hittable我收到此错误:

  

错误:错误-25204在元素pid上执行AXAction 2003:43616,elementOrHash.elementID:4882574576.240

2 个答案:

答案 0 :(得分:3)

事实证明, iOS 11 上的自定义集合视图单元格isAccessibilityElementNO(奇怪的是,它是{{1} } iOS 10 )。明确地将其设置为YES可以解决问题。

答案 1 :(得分:0)

里卡多的答案应该是被接受的答案。 为清楚起见,我们遇到了同样的问题,并在UICollectionViewCell的Class文件中解决了它。 在initWithCoder:中,我们添加了属性isAccessibilityElement

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];

    if (self != nil) {
        self.isAccessibilityElement = YES;
    }

    return self;
}

我们现在可以在Xcode 9.1中运行与Xcode 8相同的测试脚本,并正确地点击了单元格。

感谢您提供这个出色的解决方案。