Как отличить заголовки от статического текста в iOS 13 с помощью тестов пользовательского интерфейса XCTest - PullRequest
0 голосов
/ 06 ноября 2019

Работая на iOS 13 с использованием последних версий Xcode 11, я не могу найти способ различать заголовки и статический текст в тестах пользовательского интерфейса XCTest.

Если я использую Xcode 11, но работаю на iOS 12Я все еще могу найти представления с признаком .header путем фильтрации по типам элементов .other с помощью XCTest, но в iOS 13 представления с признаком .header теперь просто определяются по типу элемента .staticText с помощью XCTest, даже если вы не установили в приложении черту доступности .staticText.

Это создает для нас проблему, потому что мы используем ее, чтобы убедиться, что мы не забываем правильно установить черты заголовка в представлениях. для обеспечения доступности, а также чтобы быть в состоянии убедиться, что в тестах мы смотрим на правильный экран.

По общему признанию, возможность находить заголовки только по .other невелика, но по крайней мере это былокакой-то способ отличить заголовки от обычного текста.

Вот пример кода для объяснения:

// ViewController.swift

headerLabel.isAccessibilityElement = true // headerLabel is just a UILabel IBOutlet
headerLabel.accessibilityTraits = [.header]
headerLabel.text = "My Header"

// ViewControllerTests.swift

XCTAssertTrue(XCUIApplication().otherElements["My Header"].firstMatch.waitForExistence(timeout: 30)) // This fails on iOS 13 but works on iOS 12 :(
XCTAssertTrue(XCUIApplication().staticTexts["My Header"].firstMatch.waitForExistence(timeout: 30)) // This fails on iOS 12 but works on iOS 13...

Если вы po XCUIApplication() в Xcode, вы можете увидеть, что на iOS 13 заголовок теперьдзюst * staticText так же, как и любой другой ярлык.

Я пытался объединить различные accessibilityTraits (так как вы можете иметь более одного), например:

headerLabel.accessibilityTraits = [.header, .staticText]

Но это не такпомощь.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Хорошо, после нескольких дней расследования у нас есть обходной путь. К сожалению, он использует частный API, но мы не слишком беспокоимся, поскольку он предназначен для тестов и лучше, чем любой другой обходной путь, который мы пробовали до сих пор.

Используя частный API, можно выяснитьUIAccessibilityTraits представления, который представляет XCUIElement:

var underlyingAccessibilityTraits: UIAccessibilityTraits {
    guard let rawValue = value(forKey: "traits") as? UInt64 else { return [] }
    return UIAccessibilityTraits(rawValue: rawValue)
}

Теперь, когда у нас есть черты, мы можем запросить их так же, как и любые другие OptionSet:

element.underlyingAccessibilityTraits.contains(.header)

И мы можем использовать это для построения нашего собственного запроса, вместо использования XCUIElementQuery:

let allElementsMatchingID = XCUIApplication().descendants(matching: .any).matching(.any, identifier: id) // id is an optional string as an ID, like when using `XCUIApplication().otherElements[id]`
let allHeaders = allElementsMatchingID.allElementsBoundByAccessibilityElement.filter { $0.underlyingAccessibilityTraits.contains(.header) }
let element = allHeaders[index] // index is an int, like when using `element(boundBy: 0`

Недостатком этого (кроме необходимости использования частного API) является то, что в отличие от обычных XCUIElementQuery s, это приведет к сбою, если индекс выходит за границы, но если вы всегда ожидаете, что элемент будет существовать, это не такая уж большая проблема.

0 голосов
/ 06 ноября 2019

Вы можете добавить префикс к accessibilityIdentifier вашего заголовка, чтобы отличать его от статического текста, например:

myHeader.accessibilityIdentifier = "Header" + title

и просто использовать то же, что и раньше, для статического текста

myLabel.accessibilityIdentifier = title
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...