在 UI 测试中执行向左滑动的完整动作?
Perform a full swipe left action in UI Tests?
我已经在 table 视图中实现了前导和尾随滑动操作。现在,我正在尝试在 XCTest UI 测试中测试它们。
要测试向任一方向的常规滑动很容易:
tableCell.swipeRight()
tableCell.swipeLeft()
使用其中之一会导致显示第一个操作按钮,然后我可以在该按钮上 .tap()
。
但是,事实证明,测试完全滑动更具挑战性。我玩过 this extension from How do I swipe faster or more precisely?
我也玩过 from the question 。
这两个本质上都是使用XCUIElement's coordinate(withNormalizedOffset:)方法从一个点滑动到另一个点,类似如下:
let startPoint = tableCell.coordinate(withNormalizedOffset: CGVector.zero)
let finishPoint = startPoint.withOffset(CGVector(dx:xOffsetValue, dy:yOffsetValue))
startPoint.press(forDuration: 0, thenDragTo: finishPoint)
我最终得到了一个 成功地向右滑动的扩展 - 但我似乎无法获得 完整 [=] 的正确数字40=]向左滑动.
我的代码确实执行了向左滑动,但还不够远。我已经尝试将 dx:
的硬编码数字从 -300 到 300。元素宽度为 414。我认为 0 是最左边,414 是最右边,所以我开始使用该尺寸作为参考.仍然,没有快乐。
我怎样才能让它向左滑动?
extension XCUIElement
{
enum SwipeDirection {
case left, right
}
func longSwipe(_ direction : SwipeDirection) {
let elementLength = self.frame.size.width
let centerPoint: CGFloat = elementLength / 2.0
let halfCenterValue: CGFloat = centerPoint / 2.0
let startOffset: CGVector
let endOffset: CGVector
switch direction {
case .right: // this one works perfectly!
startOffset = CGVector.zero
endOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)
}
case .left: // "There's the rub" as Hamlet might say...
startOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)
endOffset = CGVector.zero
let startPoint = self.coordinate(withNormalizedOffset: startOffset)
let finishPoint = startPoint.withOffset(endOffset)
startPoint.press(forDuration: 0, thenDragTo: finishPoint)
}
}
知道了!
首先,我不需要使用单元格的框架大小。 "normalized" 部分意味着您可以使用从 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)
}
}
注意:CGVector.zero
是 CGVector(dx: 0.0, dy: 0.0)
的 Swift 别名
我已经在 table 视图中实现了前导和尾随滑动操作。现在,我正在尝试在 XCTest UI 测试中测试它们。
要测试向任一方向的常规滑动很容易:
tableCell.swipeRight()
tableCell.swipeLeft()
使用其中之一会导致显示第一个操作按钮,然后我可以在该按钮上 .tap()
。
但是,事实证明,测试完全滑动更具挑战性。我玩过 this extension from How do I swipe faster or more precisely?
我也玩过
这两个本质上都是使用XCUIElement's coordinate(withNormalizedOffset:)方法从一个点滑动到另一个点,类似如下:
let startPoint = tableCell.coordinate(withNormalizedOffset: CGVector.zero)
let finishPoint = startPoint.withOffset(CGVector(dx:xOffsetValue, dy:yOffsetValue))
startPoint.press(forDuration: 0, thenDragTo: finishPoint)
我最终得到了一个 成功地向右滑动的扩展 - 但我似乎无法获得 完整 [=] 的正确数字40=]向左滑动.
我的代码确实执行了向左滑动,但还不够远。我已经尝试将 dx:
的硬编码数字从 -300 到 300。元素宽度为 414。我认为 0 是最左边,414 是最右边,所以我开始使用该尺寸作为参考.仍然,没有快乐。
我怎样才能让它向左滑动?
extension XCUIElement
{
enum SwipeDirection {
case left, right
}
func longSwipe(_ direction : SwipeDirection) {
let elementLength = self.frame.size.width
let centerPoint: CGFloat = elementLength / 2.0
let halfCenterValue: CGFloat = centerPoint / 2.0
let startOffset: CGVector
let endOffset: CGVector
switch direction {
case .right: // this one works perfectly!
startOffset = CGVector.zero
endOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)
}
case .left: // "There's the rub" as Hamlet might say...
startOffset = CGVector(dx: centerPoint + halfCenterValue, dy: 0)
endOffset = CGVector.zero
let startPoint = self.coordinate(withNormalizedOffset: startOffset)
let finishPoint = startPoint.withOffset(endOffset)
startPoint.press(forDuration: 0, thenDragTo: finishPoint)
}
}
知道了!
首先,我不需要使用单元格的框架大小。 "normalized" 部分意味着您可以使用从 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)
}
}
注意:CGVector.zero
是 CGVector(dx: 0.0, dy: 0.0)