在我的UI测试中,找到了一些XCUIElement的frame属性,但没有找到其他。
下面使用的辅助功能标识符在 Storyboard 中设置,并且appsetUp()中初始化为XCUIApplication()

这是 Storyboard 布局:

Xcode UITest有时找不到XCUIElement的属性-LMLPHP

测试中使用的两个UI元素是“文本字段”和“添加按钮”。

以下是相关代码:

func test() {
    // given
    let mainViewNavigationBar = app.navigationBars[„NavBar“]
    let navBarHeight = mainViewNavigationBar.frame.size.height
    print("navBarHeight: \(navBarHeight)") // is printed out correctly

    let addShoppingItemTextField = app.textFields["TextField"]
    let textFieldHeight = addShoppingItemTextField.frame.size.height // error breakpoint here
    print("textFieldHeight: \(textFieldHeight)")
}

测试在第二行的错误断点处停止,并显示以下消息:
No matches found for Find: Descendants matching type TextField from input {(
    Application, 0x60000019f070, pid: 13114, label: ‚xxx‘
)}

我不明白为什么在第一种情况下找到了应该为所有frame定义的XCUIElement属性,但在第二种情况下却找不到。

编辑

Oletha在下面指出,我的常数addShoppingItemTextField是一个XCUIElementQuery,当我尝试读取frametextField属性时,应将其解析。
确实,当程序在测试错误断点处停止并打印其描述时,我得到
Printing description of addShoppingItemTextField:
Query chain:
 →Find: Target Application 0x6080000a6ea0
  ↪︎Find: Descendants matching type TextField
    ↪︎Find: Elements matching predicate '"TextField" IN identifiers'

但是,尽管启用了辅助功能,并且将辅助功能标识符设置为TextField,但是查找失败:

Xcode UITest有时找不到XCUIElement的属性-LMLPHP

我也插入了应用程序
print(textField.accessibilityIdentifier!)

输入viewDidLoad(),并正确打印出TextField

解决方法是,将测试设置为录音,然后点击textField。这创建了用于访问textField的代码。然后,我将let addShoppingItemTextField = app.textFields["TextField"]替换为(右侧是由记录生成的):
let addShoppingItemTextField = app.otherElements.containing(.navigationBar, identifier:"WatchNotOK")
.children(matching: .other).element.children(matching: .other).element
.children(matching: .other).element

现在,代码可以正常运行了。

因此在我看来,对textField的可访问性标识符的查询无法正常工作。

编辑2

我放弃了:在 Storyboard 中不进行任何更改,测试现在会在let navBarHeight = mainViewNavigationBar.frame.size.height行中以相同的测试错误(找不到与Find:匹配谓词““WatchNotOK” IN标识符”的元素匹配)停止测试。这确实一直奏效。
这向我表明Xcode UI测试已损坏。

最佳答案

我联系了苹果公司,他们发现了我的错误:
我的主 View Controller 的 View 的accessibility属性设置为true。这是错误的;必须将设置为false:

Xcode UITest有时找不到XCUIElement的属性-LMLPHP

可以在docsisAccessibilityElement中找到说明:

除非接收方是标准UIKit控件,否则此属性的默认值为false,在这种情况下,该值为true。
辅助应用程序只能获取有关可访问性元素表示的对象的信息。因此,如果您实现了残障用户应该可以访问的自定义控件或 View ,请将此属性设置为true。这种做法的唯一异常(exception)是,该 View 仅充当其他应可访问的其他项目的容器。这样的 View 应实现UIAccessibilityContainer协议(protocol),并将此属性设置为false。

一旦将主 View 的可访问性设置为false,UI测试就成功了。

关于Xcode UITest有时找不到XCUIElement的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48075816/

10-13 09:00