如何使用Xcode UITests点击特定点

Dmi*_*nko 22 ios swift xcode7 xcode-ui-testing fastlane-snapshot

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

这可能很简单,但我无法弄清楚如何做到这一点.

谢谢.

Joe*_*tti 33

您可以使用XCUICoordinateAPI点按特定点.不幸的是,您不能只是说"点击10,10"引用像素坐标.您需要创建具有实际视图的相对偏移的坐标.

我们可以使用提到的Web视图与相对坐标进行交互.

let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
Run Code Online (Sandbox Code Playgroud)

旁注,但您是否尝试直接与网络视图进行交互?我使用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()
Run Code Online (Sandbox Code Playgroud)

请注意,我将0,0传递给规范化的向量,然后将实际的点10,10传递给第二次调用.

  • 我不确定这是正确的,因为我需要添加'coordinateWithOffset'来执行x / y点击:让cooridnate = self.coordinateWithNormalizedOffset(CGVector(dx:0,dy:0))。coordinateWithOffset(CGVector(dx:position。 x,dy:position.y))cooridnate.tap()https://forums.developer.apple.com/thread/13373 (2认同)

Las*_*awk 16

@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()
}
Run Code Online (Sandbox Code Playgroud)

通过给全局一个可识别的名称,我可以很容易地理解该实例,例如:

tapCoordinate(at x: 100, and y: 200)
Run Code Online (Sandbox Code Playgroud)


Cod*_*der 6

我发现 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我需要点击给定位置时,我只需提供一个CGPoint并根据我的XCUIApplication喜好调用它:

let point = CGPoint(x: xCoord, y: yCoord)
app.tapCoordinate(at: point)
Run Code Online (Sandbox Code Playgroud)


Sta*_*low 5

<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
Run Code Online (Sandbox Code Playgroud)

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