gpt4 book ai didi

swift3 - 无法在横向模式下点击 (x,y) 坐标

转载 作者:行者123 更新时间:2023-12-01 13:40:40 25 4
gpt4 key购买 nike

在 Xcode 8/Swift 3 中,使用坐标(withNormalizedOffset: CGVector)函数与 XCUIElement 交互似乎只能在纵向模式下工作。

为了测试此功能,我创建了一个单屏项目,其中一个按钮位于 View 中央。然后我运行了以下 UI 测试:

func testExample() {

XCUIDevice.shared().orientation = .portrait

let window = XCUIApplication().windows.element(boundBy: 0)

let centerPoint = window.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))

centerPoint.tap()
}

这成功地点击了按钮。但是,如果我在 LandscapeLeft 或 LandscapeRight 中运行相同的测试,则不会点击该按钮。打印坐标的屏幕点显示它在纵向和横向模式下都位于按钮的框架内。

对于 Xcode 7/Swift 2 中的所有方向,相同的逻辑都是成功的:
func testExample() {

XCUIDevice.sharedDevice().orientation = .LandscapeLeft

let window = XCUIApplication().windows.elementBoundByIndex(0)

let centerPoint = window.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))

centerPoint.tap()
}

我是否遗漏了什么,或者这是一个合法的框架错误?它与从 Swift 2 中的 CGVectorMake 到 Swift 3 中的 CGVector(dx: dy:) 的转换有关吗?

最佳答案

同样的问题——屏幕点是正确的,但实际的手势坐标搞砸了。这个解决方法对我有用:

class SmartXCUICoordinate
{
let element: XCUIElement
let normalizedOffset: CGVector

init(element: XCUIElement, normalizedOffset offset: CGVector) {
self.element = element
self.normalizedOffset = offset
}

var realCoordinate: XCUICoordinate {
guard XCUIDevice.shared().orientation.isLandscape else {
return element.coordinate(withNormalizedOffset: normalizedOffset)
}

let app = XCUIApplication()
_ = app.isHittable // force new UI hierarchy snapshot

let screenPoint = element.coordinate(withNormalizedOffset: normalizedOffset).screenPoint

let portraitScreenPoint = XCUIDevice.shared().orientation == .landscapeLeft
? CGVector(dx: app.frame.width - screenPoint.y, dy: screenPoint.x)
: CGVector(dx: screenPoint.y, dy: app.frame.height - screenPoint.x)

return app
.coordinate(withNormalizedOffset: CGVector.zero)
.withOffset(portraitScreenPoint)
}

func tap() {
realCoordinate.tap() // wrap other XCUICoordinate methods as needed
}
}

extension XCUIElement
{
func smartCoordinate(withNormalizedOffset normalizedOffset: CGVector) -> SmartXCUICoordinate {
return SmartXCUICoordinate(element: self, normalizedOffset: normalizedOffset)
}
}

已知问题:不适用于您的应用不支持的方向。

关于swift3 - 无法在横向模式下点击 (x,y) 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40558447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com