示例项目
这是一个显示问题的示例项目。它是基于 Storyboard的,但构建界面的方法并不重要。这是UIViewController
与 UIScrollView
对于整个屏幕和 128 点高度 View ,位于此 UIScrollView
之上。
在 ScrollView 内有一个 UIView
有2000 pts
高度和UIButton
在中心。
链接在这里:https://github.com/JakubMazur/UITestsDemo
问题
- 我正在尝试使用
XCUITest
点击这个绿色按钮使用app.buttons["Tap Me!"].tap()
- XCUITest 从屏幕上的元素获取标识符,以确保整个 ScrollView 工作正常。
- 根据 Apple Developer Forum 上的一个帖子的回复由 Apple 框架工程师编写 我不应该手动滚动才能找到该按钮,是的,这部分是正确的。
- 执行 (1) 中的代码时发生的情况是按钮滚动到足以在屏幕上可见,但它仍然不可点击,因为其他(紫色 View )位于
UIScrollView
之上
什么在起作用
如果我运行这样编写的测试:
func testThatDoWorkButItsSlow() {
app.scrollViews.firstMatch.swipeUp()
app.buttons[buttonLabel].tap()
}
向上滚动,然后寻找一个可以工作的按钮,但它很慢而且不准确,几乎无法使用。
我不能做什么
禁用userInteractions
在紫色 View 上。在实际示例中,我仍然需要对此(紫色) View 进行触摸。
问题
- 对于这种情况,有没有办法在 XCTest 中使用精确滚动?
- 或者有没有办法设置
contentOffset
与tap()
的操作相比,将scrollview设置为其他值将使该按钮在屏幕上更加居中? - 或者有一种方法可以快速滚动到底部(没有动画),并且可能只向上移动每个元素?
最佳答案
我的建议是使用 XCUUICooperative.press(forDuration:thenDragTo:) 方法进行滚动。
https://developer.apple.com/documentation/xctest/xcuicoordinate/1615003-press
您可以为黄色 View 创建一个 XCUICooperative,然后将其稍微向上拖动以显示按钮并使其可点击。
在大多数情况下,自动滚动应该可以工作,但在这种情况下似乎需要手动滚动/拖动。
关于ios - XCUI测试: Can't tap element on scrollview while views are stack on each other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74221274/