Xcode UITest有时找不到XCUIElement的属性

时间:2018-01-03 10:45:31

标签: xcode properties xcode-ui-testing xcuitest

在我的UI测试中,找到了某些XCUIElement的框架属性,但没有找到其他框架属性 下面使用的辅助功能标识符在故事板中设置,appsetUp()中初始化为XCUIApplication()

这是故事板布局:

enter image description here

测试中使用的两个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属性,而在第二种情况下找不到。{1}}属性。

编辑

Oletha在下面指出,当我尝试阅读addShoppingItemTextField的{​​{1}}属性时,我的常量XCUIElementQueryframe,应该解决。
实际上,当程序在测试错误断点处停止并且我打印其描述时,我得到了

textField

但是,虽然启用了辅助功能,但辅助功能标识符设置为Printing description of addShoppingItemTextField: Query chain: →Find: Target Application 0x6080000a6ea0 ↪︎Find: Descendants matching type TextField ↪︎Find: Elements matching predicate '"TextField" IN identifiers' ,但查找失败:

enter image description here

我也插入了应用

TextField
<{1>}中的

,并正确打印出print(textField.accessibilityIdentifier!)

作为一种解决方法,我将测试设置为录制,然后点击viewDidLoad()。这创建了访问TextField的代码。然后我将let textField替换为(右侧由录制生成):

textField

现在代码可以正常运行。

所以在我看来,addShoppingItemTextField = app.textFields["TextField"]的辅助功能标识符的查询无效。

编辑2

我放弃了:在没有更改故事板中的任何内容的情况下,测试现在停止时出现相同的测试错误(未找到匹配的匹配项:匹配谓词的元素'“WatchNotOK”IN标识符')第let addShoppingItemTextField = app.otherElements.containing(.navigationBar, identifier:"WatchNotOK") .children(matching: .other).element.children(matching: .other).element .children(matching: .other).element 行。这确实起作用。
这向我表明Xcode UI测试已经破解。

3 个答案:

答案 0 :(得分:13)

我联系了Apple,他们发现了我的错误:
我的主视图控制器的视图将accessibility属性设置为true。这是错的; 必须设置为false

enter image description here

docsisAccessibilityElement

中提供了相关说明

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

只要我将主视图的辅助功能设置为false,UI测试就会成功。

答案 1 :(得分:1)

除了上述答案外,我想补充一点。 这可能是因为您正在访问的 XCUIElement在屏幕上不可用。 假设您正在执行登录屏幕的测试用例,并且模拟器正在使用仪表板(而不是登录屏幕)启动。这与我的情况有关。我试图注销然后执行测试用例。错误消失

答案 2 :(得分:0)

问题不在于元素上找不到frame属性,而是找不到元素本身。

每个XCUIElement都来自XCUIElementQuery。正如您所期望的那样,第一次尝试解析查询时,不是addShoppingItemTextField的值,而是第一次访问exists上的属性(addShoppingItemTextField除外)

因此,当您尝试访问frame对象上的XCUIElement属性时,查找该元素的查询已解决,但找不到该元素 - 因此您收到错误说&# 39;没有找到匹配项目......&#39;在您访问frame的行上。这可能有点误导,但您遇到的问题是无法找到该元素。尝试调整您的查询。