我正在使用Xcode 7中的UI测试自动化应用程序。我有一个带有XCUIElements(包括按钮等)的滚动视图。有时XCUIElements是可见的,有时它们在scrollview上隐藏得太远(取决于我在scrollview上的位置)。
有没有办法将项目滚动到视图中,或者可以判断它们是否可见?
由于
答案 0 :(得分:14)
很遗憾Apple尚未在scrollTo
上提供任何.visible
方法或XCUIElement
参数。也就是说,您可以添加几个辅助方法来实现某些功能。以下是我在Swift中的表现。
首先检查元素是否可见:
func elementIsWithinWindow(element: XCUIElement) -> Bool {
guard element.exists && !CGRectIsEmpty(element.frame) && element.hittable else { return false }
return CGRectContainsRect(XCUIApplication().windows.elementBoundByIndex(0).frame, element.frame)
}
不幸的是,如果元素已加载但不在屏幕上,.exists
将返回true。另外,我们必须检查目标元素的框架是否大于0乘0(有时也是如此) - 然后我们可以检查这个框架是否在主窗口内。
然后我们需要一种向上或向下滚动可控量的方法:
func scrollDown(times: Int = 1) {
let topScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.05))
let bottomScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.90))
for _ in 0..<times {
bottomScreenPoint.pressForDuration(0, thenDragToCoordinate: topScreenPoint)
}
}
func scrollUp(times: Int = 1) {
let topScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.05))
let bottomScreenPoint = app.mainWindow().coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.90))
for _ in 0..<times {
topScreenPoint.pressForDuration(0, thenDragToCoordinate: bottomScreenPoint)
}
}
更改topScreenPoint和bottomScreenPoint的CGVector值将更改滚动操作的比例 - 请注意,如果您太靠近屏幕边缘,则会拉出其中一个OS菜单。
使用这两种方法,您可以编写一个循环,以一种方式滚动到给定的阈值,直到元素变为可见,然后如果它找不到它的目标,则滚动另一种方式:
func scrollUntilElementAppears(element: XCUIElement, threshold: Int = 10) {
var iteration = 0
while !elementIsWithinWindow(element) {
guard iteration < threshold else { break }
scrollDown()
iteration++
}
if !elementIsWithinWindow(element) { scrollDown(threshold) }
while !elementIsWithinWindow(element) {
guard iteration > 0 else { break }
scrollUp()
iteration--
}
}
这最后一种方法效率不高,但它至少可以让你在屏幕上找到元素。当然,如果您知道在给定测试中您的目标元素总是高于或低于您的起点,那么您可以在此处编写scrollDownUntil
或scrollUpUntill
方法而不使用阈值逻辑。
希望这有帮助!
答案 1 :(得分:5)
我必须做的就是在我的UI测试代码中实际向上或向下滑动。你试过这个吗?
XCUIApplication().swipeUp()
或者你也可以做WhateverUIElement.swipUp(),它会相对于那个元素向上/向下滚动。
希望他们能够修复自动滚动或自动查找功能,因此我们不必手动执行此操作。
答案 2 :(得分:2)
您应该检查isHittable
属性。
如果未隐藏视图,则相应的XCUIElement是可命中的。但有一点需要注意。 &#34;查看1&#34;可以通过&#34; View 2&#34;重叠,但是对应于&#34; View 1&#34;可以打到。
答案 3 :(得分:2)
由于你在桌面视图的底部有一些XCUIElements(表格页脚视图),在UI测试中滚动tableview一直到底部的方式,假设你的tableview有很多数据,是{{1 }}
tap()
也可以完成这项任务,但问题是当你的测试数据很大时,需要永远滑动,而不是直接跳转到tableView底部的.swipeUp()
。
更特别地说:
.tap()
答案 4 :(得分:0)
看起来这是一个已知的错误: - (