lea*_*nne 3 ios xctest swift xcode-ui-testing
我已经在表视图中实现了前导和尾随滑动操作。现在,我正在尝试在 XCTest UI 测试中测试它们。
\n\n测试任一方向的常规滑动很简单:
\n\ntableCell.swipeRight()\ntableCell.swipeLeft()\n
Run Code Online (Sandbox Code Playgroud)\n\n使用其中之一会导致显示第一个操作按钮,然后我可以.tap()
单击该按钮。
然而,测试完全滑动被证明更具挑战性。我已经玩过如何更快或更精确地滑动的这个扩展?
\n\n我还玩过问题Xcode7 ui testing: staticTexts[\xe2\x80\x9cXX\xe2\x80\x9d].swipeRight() swipes not far enough 的答案。
\n\n这两个本质上都是使用XCUIElement\ 的坐标(withNormalizedOffset:)方法从一个点滑动到另一个点,类似于以下内容:
\n\nlet 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\nextension 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
知道了!
首先,我不需要使用单元格的帧大小。“标准化”部分意味着您可以使用0.0到1.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)