【问题标题】:How to tap on a specific point using Xcode UITests如何使用 Xcode UITests 点击特定点
【发布时间】:2016-07-17 01:19:27
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: ios swift xcode7 xcode-ui-testing fastlane-snapshot


    【解决方案1】:

    您可以使用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() 取得了很大的成功。 Here's a demo app I put together demonstrating interacting with a web view.


    更新:正如 Michal W. 在 cmets 中指出的那样,您现在可以直接点击坐标,而不必担心对偏移进行归一化。

    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 传递给第二次调用。

    【讨论】:

    • 我不确定这是否正确,因为我需要添加 'coordinateWithOffset' 来执行 x/y 抽头:让 cooridnate = self.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0))。 coordinateWithOffset(CGVector(dx: position.x, dy: position.y)) cooridnate.tap() forums.developer.apple.com/thread/13373
    • 好主意!谢谢@MichałW。我在答案的更新中注意到了评论,因为它已经被接受了。
    • 另一个小优化是使用CGVector.zero而不是CGVector(dx: 0, dy: 0)
    【解决方案2】:

    @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 中为我工作!
    • 这不能在 Swift 3 中编译
    • 我必须以tapCoordinate(at:100, and:200) 的身份运行它,它运行良好!与您使用的未在 Swift 5 中编译的确切示例不同
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      <something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
      

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

      【讨论】:

      • 这非常适合 Swift 4 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 2022-01-15
      相关资源
      最近更新 更多