我想使用Xcode UI测试和Fastlane快照制作Cordova应用程序的截图。由于我的整个应用程序只是一个Web视图,所有Xcode UI测试助手方法都变得无关紧要,我只想点击特定的点,例如tap(x: 10, y: 10)
应该在点{10px; 10px}
处产生一个点击。
这可能非常简单,但我无法弄清楚如何做到这一点。
谢谢。
我想使用Xcode UI测试和Fastlane快照制作Cordova应用程序的截图。由于我的整个应用程序只是一个Web视图,所有Xcode UI测试助手方法都变得无关紧要,我只想点击特定的点,例如tap(x: 10, y: 10)
应该在点{10px; 10px}
处产生一个点击。
这可能非常简单,但我无法弄清楚如何做到这一点。
谢谢。
XCUICoordinate
API触击特定点。不幸的是,你不能只是引用像素坐标“tap 10,10”。你需要使用相对于实际视图的偏移量创建坐标。let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
顺便提一下,您尝试过直接与Web视图进行交互吗?我使用app.links["链接标题"].tap()
或app.staticTexts["另一个链接标题"].tap()
取得了很多成功。 这是一个演示如何与Web视图交互的演示应用程序。
更新: 如Michal W.在评论中指出的那样,现在您可以直接点击坐标,而不必担心规范化偏移量。
let normalized = webView.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let coordinate = normalized.withOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
注意我将0,0传递给归一化向量,然后将实际点10,10传递给第二次调用。
@joe 在 Joe Masilotti 的方法上进行了一些延伸,我将我的放在了一个 extension
中,并给全局和本地参数添加了介词短语。
func tapCoordinate(at xCoordinate: Double, and yCoordinate: Double) {
let normalized = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let coordinate = normalized.withOffset(CGVector(dx: xCoordinate, dy: yCoordinate))
coordinate.tap()
}
通过为全局变量命名一个可识别的名称,我可以轻松地理解该实例,例如:
tapCoordinate(at x: 100, and y: 200)
tapCoordinate(at:100, and:200)
,它完美地工作了!不像你使用的确切示例,在Swift 5中无法编译。 - Tadej Magajna我发现Laser的答案在Xcode 11上运行良好,但对其进行了一些微调,以便将其轻松集成到我的测试中。
extension XCUIApplication {
func tapCoordinate(at point: CGPoint) {
let normalized = coordinate(withNormalizedOffset: .zero)
let offset = CGVector(dx: point.x, dy: point.y)
let coordinate = normalized.withOffset(offset)
coordinate.tap()
}
}
现在,当我需要点击特定位置时,我只需提供一个CGPoint
,并对我的XCUIApplication
调用此函数,如下所示:
let point = CGPoint(x: xCoord, y: yCoord)
app.tapCoordinate(at: point)
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
cooridnate.tap()
https://forums.developer.apple.com/thread/13373 - Michał W.
CGVector.zero
而不是CGVector(dx: 0, dy: 0)
。 - adamjansch