swift 如何使用XCTest测试staticTexts是否包含字符串

nukf8bse  于 2023-01-04  发布在  Swift
关注(0)|答案(5)|浏览(154)

在Xcode UI测试中,如何测试staticTexts是否包含字符串?
在调试器中,我可以运行类似下面这样的代码来打印出staticTexts的所有内容:但是如何测试字符串是否存在于所有内容中的任何地方呢?
我可以像app.staticTexts["the content of the staticText"].exists?一样检查每个静态文本是否存在,但是我必须使用该静态文本的确切内容。我怎么能只使用可能只是该内容的一部分的字符串呢?

vlju58qv

vlju58qv1#

可以使用NSPredicate过滤元素。

let searchText = "the content of the staticText"
  let predicate = NSPredicate(format: "label CONTAINS[c] %@", searchText)
  let elementQuery = app.staticTexts.containing(predicate)
  if elementQuery.count > 0 {
    // the element exists
  }

使用CONTAINS[c]可以指定搜索不区分大小写。
查看Apple predicate 编程指南

chy5wohz

chy5wohz2#

首先,你需要为你想要访问的静态文本对象设置一个可访问性标识符,这样你就可以不用搜索它所显示的字符串就可以找到它。

// Your app code
label.accessibilityIdentifier = "myLabel"

然后,您可以通过在XCUIElement上调用.label来编写测试,以获取所显示字符串的内容,从而Assert所显示的字符串是否是您想要的字符串:

// Find the label
let myLabel = app.staticTexts["myLabel"]
// Check the string displayed on the label is correct
XCTAssertEqual("Expected string", myLabel.label)

要检查它是否包含某个字符串,请使用range(of:),如果找不到您给予的字符串,它将返回nil

XCTAssertNotNil(myLabel.label.range(of:"expected part"))
ifmq2ha2

ifmq2ha23#

我在构建XCTest时遇到了这个问题,我需要验证文本块中的动态字符串。我构建了这两个函数来解决我的问题:

func waitElement(element: Any, timeout: TimeInterval = 100.0) {
    let exists = NSPredicate(format: "exists == 1")

    expectation(for: exists, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: timeout, handler: nil)
}

func waitMessage(message: String) {
    let predicate = NSPredicate(format: "label CONTAINS[c] %@", message)
    let result = app.staticTexts.containing(predicate)
    let element = XCUIApplication().staticTexts[result.element.label]
    waitElement(element: element)
}

我知道这个帖子很老了,但我希望这能帮助到一些人。

qybjjes1

qybjjes14#

您可以创建一个扩展来简单地在XCUIElement上使用它。

extension XCUIElement {
    
    func assertContains(text: String) {
        let predicate = NSPredicate(format: "label CONTAINS[c] %@", text)
        let elementQuery = staticTexts.containing(predicate)
        XCTAssertTrue(elementQuery.count > 0)
    }
}
    • 用法:**
// Find the label
let yourLabel = app.staticTexts["AccessibilityIdentifierOfYourLabel"].firstMatch

// assert that contains value
yourLabel.assertContains(text: "a part of content of the staticText")
ergxz8rk

ergxz8rk5#

// Encapsulate your code
    func yourElement() -> XCUIElement {
        let string = "The European languages are members of the same family."
        let predicate = NSPredicate(format: "label CONTAINS[c] '\(string)'")
        return app.staticTexts.matching(predicate).firstMatch
    }

    // To use it
    XCTAssert(yourPage.yourElement().waitForExistence(timeout: 20))

相关问题