如何使用 Xcode UITests 点击特定点
How to tap on a specific point using Xcode UITests
我想使用 Xcode UI 测试和 Fastlane Snapshot 来制作 Cordova 应用程序的屏幕截图。基本上,由于我的整个应用程序只是一个网络视图,所有 Xcode UI 测试辅助方法都变得无关紧要,我只想点击特定的点,例如tap(x: 10, y: 10)
应在点 {10px; 10px}
处产生敲击。
这可能很简单,但我不知道该怎么做。
谢谢。
您可以使用 XCUICoordinate
API 点击特定点。不幸的是,您不能只说 "tap 10,10" 引用像素坐标。您将需要创建与实际视图具有相对偏移的坐标。
我们可以使用提到的网页视图与相对坐标进行交互。
let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
旁注,但您是否尝试过直接与网络视图交互?我使用 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. 在评论中指出的那样,您现在可以直接点击坐标,而不用担心规范化偏移量。
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)
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
将.zero传给归一化向量然后实际点(10,60)
我发现 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)
我想使用 Xcode UI 测试和 Fastlane Snapshot 来制作 Cordova 应用程序的屏幕截图。基本上,由于我的整个应用程序只是一个网络视图,所有 Xcode UI 测试辅助方法都变得无关紧要,我只想点击特定的点,例如tap(x: 10, y: 10)
应在点 {10px; 10px}
处产生敲击。
这可能很简单,但我不知道该怎么做。
谢谢。
您可以使用 XCUICoordinate
API 点击特定点。不幸的是,您不能只说 "tap 10,10" 引用像素坐标。您将需要创建与实际视图具有相对偏移的坐标。
我们可以使用提到的网页视图与相对坐标进行交互。
let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
旁注,但您是否尝试过直接与网络视图交互?我使用 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. 在评论中指出的那样,您现在可以直接点击坐标,而不用担心规范化偏移量。
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)
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
将.zero传给归一化向量然后实际点(10,60)
我发现 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)