XCTest如何在UITextview中点击Url(Link)?

时间:2016-12-28 00:43:05

标签: xcode8 xctest ios-ui-automation

enter image description here

我已将accessibilityIdentifier添加到源代码中。 并做了:

let privacypolicyurl = app.tables.textViews["privacyPolicy"]
privacypolicyurl.tap()

另一种方式:

let privacypolicyurl =
    app.tables.textViews.containing(.link,identifier:"privacy Policy").element
privacypolicyurl.tap()

然后尝试使用po app.links进行调试 看到这个:

  

链接0x618000173140:特征:8589934594,{{261.7,592.3},{74.7,17.5}},标签:'隐私政策'       }

所以,我想出了

let cooridnate = 
  app.tables.textViews["privacyPolicy"].coordinate(withNormalizedOffset: CGVector(dx: 261.7, dy: 592.3))
cooridnate.tap()

不幸的是,这些都不适合我。请帮忙搞清楚。

2 个答案:

答案 0 :(得分:1)

从调试输出的外观来看,没有指定链接包含在哪个视图中就可以了 - 链接可能不在你认为它在里面的视图中。应该没问题:

app.links["Privacy Policy"].tap()

我看到你对坐标的思考,但是你想首先得到元素的坐标对象,然后在XCUICoordinate上使用withOffset方法,因为它采用具有绝对值的向量。 coordinateWithNormalizedOffset采用具有相对值的向量,因此在您的示例中,您将尝试点击元素宽度的261倍的点,位于元素原点的右侧。

答案 1 :(得分:0)

UITextViews中的链接有以下奇怪的行为:

  • link.tap()在“Synthesize event”
  • 期间提供错误
  • link.coordinate()返回零值
  • link.accessibilityFrame()返回零值

但是我们可以使用link元素的框架来访问链接。 您可以使用以下扩展名:

import XCTest

extension XCUIElement {

  public func tapFrameCenter() {
      let frameCenterCoordinate = self.frameCenter()
      frameCenterCoordinate.tap()
  }

  func frameCenter() -> XCUICoordinate {
      let centerX = self.frame.midX
      let centerY = self.frame.midY

      let normalizedCoordinate = XCUIApplication().coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
      let frameCenterCoordinate = normalizedCoordinate.withOffset(CGVector(dx: centerX, dy: centerY))

      return frameCenterCoordinate
  }
}