将光标放在 UITest 下 UITextView 的末尾

Posted

技术标签:

【中文标题】将光标放在 UITest 下 UITextView 的末尾【英文标题】:Place cursor at the end of UITextView under UITest 【发布时间】:2016-07-22 09:38:45 【问题描述】:

这就是我在 UITests 中清除 UITextFieldsUITextViews 的方式。

extension XCUIElement 

   func clear() 

      tap()

      while (value as! String).characters.count > 0 
         XCUIApplication().keys["delete"].tap()
      
   

使用示例:

descriptionTextView.type("Something about Room.")
descriptionTextView.clear()

如果我运行 UITests,它总是在 UITextView 的开头点击。

最后怎么点击?

【问题讨论】:

【参考方案1】:

您可以点击右下角将光标置于文本视图的末尾。

此外,您可以通过准备一个包含多个XCUIKeyboardKeyDeletedeleteString 来提高删除速度,该XCUIKeyboardKeyDelete 可以一次擦除整个文本字段。

extension XCUIElement 
   func clear() 
      guard let stringValue = self.value as? String else 
          XCTFail("Tried to clear and enter text into a non string value")
          return
      

      let lowerRightCorner = self.coordinateWithNormalizedOffset(CGVectorMake(0.9, 0.9))
      lowerRightCorner.tap()

      let deleteString = [String](count: stringValue.characters.count + 1, repeatedValue: XCUIKeyboardKeyDelete)
      self.typeText(deleteString.joinWithSeparator(""))
   

【讨论】:

我面临同样的问题,我正在将文本字段检查到 safari 浏览器中。但这个解决方案对我不起作用。你能帮我计算元素的精确向量点吗?【参考方案2】:

这是适用于 Swift 5.3 (Xcode 12) 的 Tomas Camin 解决方案:

extension XCUIElement 
    public func clear() 
        guard let stringValue = self.value as? String else 
            XCTFail("Tried to clear and enter text into a non string value")
            return
        

        let lowerRightCorner = self.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.9))
        lowerRightCorner.tap()

        let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: stringValue.count)
        self.typeText(deleteString)
    

【讨论】:

第一个解决方案在没有本地化和奇怪的 tap() 行为的情况下工作。谢谢

以上是关于将光标放在 UITest 下 UITextView 的末尾的主要内容,如果未能解决你的问题,请参考以下文章

textview - 开始编辑时将光标放在文本末尾

UITextview 光标移动到行尾

如何让 UIScrollView 滚动到 UITextView 的光标位置?

UITextView 向左递增字符

UITextView如何将光标保持在键盘上方

Xcode 7 中的 UITest:如何测试键盘布局(keyboardType)