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

2024-01-11

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

为了测试此功能,我创建了一个单屏项目,其中一个按钮位于视图中央。然后我运行了以下 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)
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在横向模式下点击 (x,y) 坐标 的相关文章

随机推荐

  • 删除/隐藏 Total_sales WooCommerce 自定义字段

    有没有办法去除total sales显示时自定义字段the meta对于一个产品 我可以将编辑器中的条目更改为其他名称和值 但它会神奇地再次出现并且不会被删除 我会为此使用 the meta key 过滤器 您有几种选择 当然您可以将它们组
  • 检查变量是否在 SASS 中定义

    正如标题所说 我正在尝试检查 SASS 中是否定义了变量 如果这有什么不同的话 我正在使用指南针 我发现 Ruby 的等价物是 defined foo 在黑暗中尝试了一下 但它只是给了我错误 defined expected was 我找到
  • 调整 tiff 大小并保持透明度和 c#

    我正在尝试调整 RGB 8 位 Tif 的大小并保持其在 c 中的透明度 我尝试过以下代码 using Image thumbnail new Bitmap 1500 1500 using Bitmap source new Bitmap
  • PHP 对象父/子递归

    我有一个父子面向对象关系 父对象有许多子对象 每个子对象都通过引用知道它的父对象 父母也可以是孩子 基本上它是一棵树 当我做一个var dump 在根对象上它说 父 gt 递归很多次 生成的描述会很长 我想知道我是否做错了什么 如果是 我对
  • 如何使用反射通过字符串名称调用API?

    如何通过字符串名称调用另一个AppService中的API 示例 我在 MyAppService 中有一个 API 如下所示 public class MyAppService MyAppServiceBase IMyAppService
  • R、dplyr:n_distinct的累积版本

    我有一个数据框如下 它是按列排序的time Input df data frame time 1 20 grp sort rep 1 5 4 var1 rep c A B 10 head df 10 time grp var1 1 1 1
  • 如何在 C++ 中将 std::thread::id 转换为字符串?

    如何打字std thread id在C 中字符串 我正在尝试对由生成的输出进行类型转换std this thread get id 到字符串或字符数组 auto myid this thread get id stringstream ss
  • 从服务器加载 pdf 并嵌入到 Vue 应用程序中

    我有一个返回 pdf 文件的 api 我试图在 vue js 中显示它 并发现 vue pdf 组件看起来应该可以完成这项工作 这是github上的项目 https github com FranckFreiburger vue pdf 我
  • LEFT JOIN 查询不返回第一个表中的所有行

    使用管理工作室SQL Server 2008 R2 试图做一个LEFT JOIN我需要返回第一个表中的所有行 无论该行是否能够与第二个表关联 不确定我的解释是否正确 这就是我现在得到的 select a id a name b store
  • 更改 ggplot2 barplot 中躲避条的顺序

    我有一个数据框df all我使用下面的代码使用 ggplot2 将其绘制在条形图中 我想翻转躲闪条的顺序 也就是说 标记为 单数 的条位于标记为 复数 的条之前 ggplot df all aes gram V1 fill number g
  • 使用nodejs将微软文档转换为pdf [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您知道有什么库可以使用 NodeJS 将 Microsoft Office 文档 例如 Word doc 或 Excel xlsx 转换为
  • ARCore 兼容设备

    下一款兼容 ARCore 的 Android 智能手机有哪些 是否有已知的未来兼容设备列表 也许有一个总体项目时间表 我们即将购买一些设备用于 AR 开发评估 起初我们考虑尝试其中一款 Tango 设备 我们已经对 Tango 有了很好的体
  • 如何添加简单的用户角色 - ASP.NET MVC C#

    我对 ASP NET MVC 还很陌生 并且一直在研究添加用户角色的许多不同方法 对于我的 ASP NET MVC 站点 我想使用当您创建新的 ASP NET MVC 项目时自动为您创建的用户数据库 其中包含表 AspNet角色 AspNe
  • 动态控制 @Formula 列的延迟/急切加载

    我们有一些带有 Hibernate 注释的属性的实体 Formula注解 注释中的 SQL 片段主要运行标量子查询 例如COUNT查询 例如 我们有一个四层深的一对多关系层次结构 A lt B lt C lt D where lt 标记一对
  • 在 Rmarkdown 文本中使用变量

    我正在创建一个 Rmarkdown 文档 我的代码块检查数据集中的列 行数并将信息保存在变量中 r echo FALSE warning FALSE df dimenzions lt dim demo 我想使用存储在变量中的数据 信息rma
  • .Net WebApi 中的多个 Await 异步

    我们有许多异步控制器和服务 它们利用await async关键词 许多操作看起来有点像 public async Task
  • 如何将字符串转换为base64字节数组,这有效吗?

    我正在尝试编写一个将字符串转换为 base64 字节数组的函数 我尝试过这种方法 public byte stringToBase64ByteArray String input byte ret System Text Encoding
  • Drupal 7 默认 .htaccess

    我正在寻找 Drupal 7 的默认 htaccess 代码 由于某种原因 安装根本没有更新 htaccess 文件并且它是空白的 任何帮助将不胜感激 因为我在任何地方都找不到这个 实际上 Drupal 官方源代码在 GitHub 上 ht
  • Objective-C:检索 Class 实例的超类的首选方法

    我想知道以下两种方法中的哪一种是检索 a 的超类的正确方法或首选方法Class多变的 Class getSuperclass Class cls return cls superclass Class getSuperclass Class
  • 无法在横向模式下点击 (x,y) 坐标

    在 Xcode 8 Swift 3 中 使用坐标 withNormalizedOffset CGVector 函数与 XCUIElement 交互似乎仅在纵向模式下有效 为了测试此功能 我创建了一个单屏项目 其中一个按钮位于视图中央 然后我