UITesting -> 导航栏标题中的UISearchBar返回XCUIElement.Type其他

3
我正在为一个UIViewController的navigationItem设置titleView为一个UISearchBar。这在应用程序中运行良好,但现在我正在尝试添加一些UITesting,当我通过XCUIElementQuery搜索该元素时,它返回XCUIElement.Type作为.other,而不是我预期的.searchField。随后,当我尝试使用XCUIApplication().typeText("abcd")在字段中输入文本时,我的测试会崩溃。下面是一些示例代码:
在视图控制器中:
override func viewDidLoad() {
        let searchBar = UISearchBar()
        searchBar.isAccessibilityElement = true
        searchBar.accessibilityIdentifier = "search-bar" 

        searchBar.delegate = self.searchViewController
        self.navigationItem.titleView = searchBar
}

在UITest中:
func testEnterTextInSearchBar() {        
    let app = XCUIApplication()
    let searchBarElement = app.descendants(matching: .any).matching(identifier: "search-bar").firstMatch
    searchBarElement.tap()
    app.typeText("test")
}

崩溃了!!! 因为它认为类型是 .other 而不是 .searchField

错误信息是:"元素或其任何后代均没有键盘焦点。元素:属性:其他,0x608000192f10,特征:8589934592,标识符:'search-bar'"

只要软件键盘启用,使用app.keys["x"].tap()也可以正常工作。


我认为这是UITest框架中的一个bug。我尝试了不同的方法,但即使录制测试,它仍然会给出相同的错误。也许应该在Apple上报一个雷达? - joern
1
请确保模拟器的硬件键盘连接已禁用。您可以在“硬件”-->"键盘"--> "连接硬件键盘"中找到它,该选项应为禁用状态。 - Mahmud Riad
感谢回复。我也倾向于这是一个错误。我尝试过断开硬件键盘。当它被断开时,我可以让app.keys["D"].tap()函数工作(虽然你必须从大写字符开始,然后使用小写字符,否则它无法找到键)。 - drew2dev
2
好的,我认为问题在于 searchBar.isAccessibilityElement = true 这会将可访问性类型修改为.other而不是.searchField。删除该行似乎可以解决问题。 - drew2dev
然而,我没有发现的是UISearchBar元素上的取消按钮不在UITesting可访问性层次结构中! - drew2dev
2
你好,来自2019年的问候,这个问题仍然存在。将isAccessibilityElement设置为false有帮助。 - Steffen Andersen
1个回答

1

步骤1:禁用硬件键盘。您可以在此找到它:

Hardware --> Keyboard --> Connect Hardware keyboard [Disable this option]

步骤2:
 func testEnterTextInSearchBar() {        
 let app = XCUIApplication()

 // use one of below two  code
 let searchBarElement = app.otherElements["search-bar"].tap().firstMatch
 //let searchBarElement = app.searchFields["search-bar"].tap().firstMatch


 searchBarElement.tap()
 searchBarElement.typeText("test")

}

请告诉我结果。

See comment above. Thanks! - drew2dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接