在 UI 测试中执行完全向左滑动操作?

lea*_*nne 3 ios xctest swift xcode-ui-testing

我已经在表视图中实现了前导和尾随滑动操作。现在,我正在尝试在 XCTest UI 测试中测试它们。

\n\n

测试任一方向的常规滑动很简单:

\n\n
tableCell.swipeRight()\ntableCell.swipeLeft()\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用其中之一会导致显示第一个操作按钮,然后我可以.tap()单击该按钮。

\n\n

然而,测试完全滑动被证明更具挑战性。我已经玩过如何更快或更精确地滑动的这个扩展?

\n\n

我还玩过问题Xcode7 ui testing: staticTexts[\xe2\x80\x9cXX\xe2\x80\x9d].swipeRight() swipes not far enough 的答案

\n\n

这两个本质上都是使用XCUIElement\ 的坐标(withNormalizedOffset:)方法从一个点滑动到另一个点,类似于以下内容:

\n\n
let startPoint = tableCell.coordinate(withNormalizedOffset: CGVector.zero)\nlet finishPoint = startPoint.withOffset(CGVector(dx:xOffsetValue, dy:yOffsetValue))\nstartPoint.press(forDuration: 0, thenDragTo: finishPoint)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我最终得到了一个可以成功执行完全向右滑动的扩展- 但我似乎无法获得完全向左滑动的正确数字。

\n\n

我的代码确实执行了向左滑动,但还不够远。我已经尝试过硬编码数字dx:-300 到 300 的硬编码数字。元素宽度是 414。我相信 0 是最左边,414 是最右边,所以我开始使用该大小作为参考。仍然没有喜悦。

\n\n

我怎样才能让它执行向左完全滑动?

\n\n
extension XCUIElement\n{\n    enum SwipeDirection {\n        case left, right\n    }\n\n    func longSwipe(_ direction : SwipeDirection) {\n        let elementLength = self.frame.size.width\n        let centerPoint: CGFloat = elementLength / 2.0\n        let halfCenterValue: CGFloat = centerPoint / 2.0\n\n        let startOffset: CGVector\n        let endOffset: CGVector\n        switch direction {\n        case .right:  // this one works perfectly!\n            startOffset = CGVector.zero\n            endOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)\n        }\n        case .left:  // "There\'s the rub" as Hamlet might say...\n            startOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)\n            endOffset = CGVector.zero\n\n        let startPoint = self.coordinate(withNormalizedOffset: startOffset)\n        let finishPoint = startPoint.withOffset(endOffset)\n        startPoint.press(forDuration: 0, thenDragTo: finishPoint)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

lea*_*nne 5

知道了!

  • 首先,我不需要使用单元格的帧大小。“标准化”部分意味着您可以使用0.01.0之间的值来表示元素大小的百分比。

  • 其次,在调整大小时,我发现长滑动需要移动单元格宽度的大约 60% 才能激活操作。

我得到的长滑动扩展:

extension XCUIElement
{
    enum SwipeDirection {
        case left, right
    }

    func longSwipe(_ direction : SwipeDirection) {
        let startOffset: CGVector
        let endOffset: CGVector

        switch direction {
        case .right:
            startOffset = CGVector.zero
            endOffset = CGVector(dx: 0.6, dy: 0.0)
        case .left:
            startOffset = CGVector(dx: 0.6, dy: 0.0)
            endOffset = CGVector.zero
        }

        let startPoint = self.coordinate(withNormalizedOffset: startOffset)
        let endPoint = self.coordinate(withNormalizedOffset: endOffset)
        startPoint.press(forDuration: 0, thenDragTo: endPoint)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:CGVector.zero是 Swift 别名CGVector(dx: 0.0, dy: 0.0)