如何使用Xcode UITests点击特定点

33

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

这可能非常简单,但我无法弄清楚如何做到这一点。

谢谢。

4个回答

49
你可以使用XCUICoordinate API触击特定点。不幸的是,你不能只是引用像素坐标“tap 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["链接标题"].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传递给第二次调用。


2
我不确定这是正确的,因为我需要添加“coordinateWithOffset”来执行x/y轴的点击:let 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
- Michał W.
1
好主意!感谢 @MichałW。我已经在答案的更新中注明了该评论,因为它已经被接受了。 - Joe Masilotti
1
另一个小优化是使用CGVector.zero而不是CGVector(dx: 0, dy: 0) - adamjansch

23

@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)

在 Swift 3 中对我有用! - mmd1080
这在Swift 3中无法编译。 - Doug Amos
我必须将其运行为 tapCoordinate(at:100, and:200),它完美地工作了!不像你使用的确切示例,在Swift 5中无法编译。 - Tadej Magajna
你救了我的一天! - Neelam Verma

12

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

6
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()

将零向量和实际点(10,60)传递给归一化向量。

1
这对于Swift 4来说非常棒 :) - Olivia Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接