如何使用Xcode UITest点击特定点



我想使用Xcode UI测试和Fastlane快照来制作Cordova应用程序的屏幕截图。基本上,由于我的整个应用程序只是一个web视图,所有的Xcode UI测试助手方法都变得无关紧要,我只想点击特定的点,例如tap(x: 10, y: 10)应该在{10px; 10px}点产生一个点击。

这可能很简单,但我不知道怎么做。

谢谢。

您可以使用XCUICoordinate API点击特定点。不幸的是,你不能只说"点击10,10"参考一个像素坐标。您需要创建相对于实际视图具有相对偏移的坐标。

我们可以使用上面提到的web视图与相对坐标进行交互。

let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()

旁注,但您是否尝试过直接与web视图交互?我使用app.links["Link title"].tap()app.staticTexts["A different link title"].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)

我发现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()

将零点传递到归一化向量,然后传递到实际点(10,60)

相关内容

最新更新