26

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

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

谢谢。

4

4 回答 4

43

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()or取得了很多成功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 传递给第二次调用。

于 2016-03-29T14:39:20.223 回答
20

@joe 为了进一步偏离 Joe Masilotti 的方法,我将我的方法放入 an 中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)
于 2017-03-24T21:47:38.877 回答
8

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

现在,当我需要点击给定位置时,我只需提供 aCGPoint并针对我的XCUIApplication喜欢调用它:

let point = CGPoint(x: xCoord, y: yCoord)
app.tapCoordinate(at: point)
于 2020-03-02T18:06:42.887 回答
6
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()

将 .zero 传递给归一化向量,然后传递实际点 (10,60)

于 2017-11-08T10:21:03.207 回答