我想使用Fastlane Snapshot的Xcode UI测试来制作Cordova应用的截图。基本上,由于我的整个应用程序只是一个Web视图,所有Xcode UI测试助手方法变得无关紧要,我只想点击特定点,例如tap(x: 10, y: 10)
应该点{10px; 10px}
点击。
这可能很简单,但我无法弄明白该怎么做。
感谢。
答案 0 :(得分:31)
您可以使用XCUICoordinate
API点按特定点。不幸的是,您不能只是说“点击10,10”引用像素坐标。您需要创建具有实际视图的相对偏移的坐标。
我们可以使用提到的网页视图与相对坐标进行交互。
let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
旁注,但您是否尝试直接与网络视图进行互动?我使用app.links["Link title"].tap()
或app.staticTexts["A different link title"].tap()
取得了很大的成功。 Here's a demo app I put together demonstrating interacting with a web view.
更新:正如Michal W.在评论中指出的那样,您现在可以直接点击坐标 ,而无需担心规范化偏移。
let normalized = webView.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0))
let coordinate = normalized.coordinateWithOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
请注意,我将0,0传递给规范化的向量,然后将实际的点10,10传递给第二次调用。
答案 1 :(得分:13)
@joe为了远离Joe Masilotti的方法,我把我放在l1
中,并给全球和本地参数提供介词短语。
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()
}
答案 2 :(得分:5)
我发现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)
答案 3 :(得分:2)
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
将.zero传递给标准化向量,然后传递给实际点(10,60)