如何检查 UI 测试用例中 XCUI 元素的背景颜色?

How to check background color of the XCUIElement in UI test cases??

我正在处理一个问题,我需要将文本字段的背景颜色更改为白色。我想为其添加 UI 测试用例以检查 XCUIElement(即文本字段)的背景颜色是否为白色。我搜索了它,但没有找到任何有用的答案。我想知道是否可以在 UI 测试用例中检查背景颜色。

我正在看马特的回答,但没有弄清楚。

想法?

就像评论中回复的人一样,我们不能通过 UI 测试来做到这一点,但我认为我们仍然有 2 种方法可以实现这一点:

  1. Snapshot Tests:

     import SnapshotTesting
     ...
     func test_view_matchesSnapshot() {
         let view = makeYourView()
         assertSnapshot(matching: view, as: .wait(for: 1.5, on: .image))
     }
    
  2. 单元测试:

     func test_view_shouldHaveTextFieldWithExpectedBackgroundColor() throws {
         let view = makeYourView()
    
         let textFieldBackgroundColor = try XCTUnwrap(
             view.textField.backgroundColor, 
             "textField.backgroundColor is nil"
         )
    
         let expectedTextFieldBackgroundColor = UIColor.white
    
         XCTAssertEqual(
             textFieldBackgroundColor.toHexString(),
             expectedTextFieldBackgroundColor.toHexString(),
             "textField doesn't have expected backgroundColor"
         )
     }
    

*Utility hex getters 用于比较两个 UI可以找到颜色

**如果您的 textField 是私有的,那么您可以使用 this great solution 我们的单元测试应该是这样的:

    func test_view_shouldHaveTextFieldWithExpectedBackgroundColor() throws {
        let view = makeYourView()

        let textField = try XCTUnwrap(
            YourViewMirror(reflecting: view).textField, 
            "Can't find textField property"
        )

        let textFieldBackgroundColor = try XCTUnwrap(
            textField.backgroundColor, 
            "textField.backgroundColor is nil"
        )

        let expectedTextFieldBackgroundColor = UIColor.white

        XCTAssertEqual(
            textFieldBackgroundColor.toHexString(),
            expectedTextFieldBackgroundColor.toHexString(),
            "textField doesn't have expected backgroundColor"
        )
    }

哪里

final class YourViewMirror: MirrorObject {
    init(reflecting yourView: YourView) {
        super.init(reflecting: yourView)
    }
    var textField: UITextField? {
        extract()
    }
}

class MirrorObject {
    let mirror: Mirror
    init(reflecting: Any) {
        self.mirror = Mirror(reflecting: reflecting)
    }

    func extract<T>(variableName: StaticString = #function) -> T? {
        return mirror.descendant("\(variableName)") as? T
    }
}