XCUIElement - получить значение изображения

У меня есть переменная типа .Image и class XCUIElement. Что-то вроде этого:

var image = app.descendantsMatchingType(.Image).elementAtIndex(0)

Есть ли способ извлечь фактическое изображение, чтобы сравнить его с другим изображением?

Я пробовал опробовать метод value, но он возвращает строку. Отбрасывание его на UIImage всегда терпит неудачу.

Ответ 1

Недавно у меня был разговор об этом с евангелистом Apple Developer Tools. В настоящее время нет способа получить доступ к реальному изображению с помощью изображения, кнопки и т.д. Аналогичным образом, нет доступа к другим свойствам представлений, которые могут представлять интерес, например "isHidden" или "attribittedText" и т.д. Я был сказал, что инженеры из команды тестирования UI заинтересованы в тех случаях, когда люди хотят получить доступ к этим свойствам, поэтому было бы очень полезно - как для них, так и для других людей, которые хотят эту функцию, - если бы вы напишите сообщение об ошибке/запрос функции, запрашивая его https://bugreport.apple.com

Как подсказка относительно свойства value на XCUIElement, по крайней мере на данный момент это похоже на свойство "accessibilityValue" любого представления, которое XCUIElement ссылается. Поэтому, если вы задали эту accessibilityValue представления, которое вас интересует, чтобы содержать некоторую информацию, которую вы заинтересованы в проверке, то это может помочь в тестировании. Две вещи, о которых нужно знать:

1) Несмотря на то, что свойство "value" XCUIElement имеет тип "id", типом свойства accessibilityValue является "NSString". Я не знаю, что произойдет, если вы попытаетесь заставить некоторое нестроковое значение (например, изображение) в accessibilityValue, а затем попытаться извлечь его из свойства value из XCUIElement, но я подозреваю, что это не сработает. Частично потому, что:

2) Свойство accessibilityValue представления фактически используется функцией Apple VoiceOver для нарушения зрения. Когда значение установлено, оно будет считаться громким, когда пользователь нажимает на этот элемент (поэтому он должен быть строкой).

Я также затронул эту проблему, не имея возможности более подробно получить доступ к свойствам представления через XCUIElement: http://www.danielhall.io/exploring-the-new-ui-testing-features-of-xcode-7

Ответ 2

Я знаю, что это может быть не совсем то, что вы ищете, но мне удалось написать тест, который проверяет, изменилось ли визуальное представление UIImage на экране.

Я использую метод screenshot() из XCUIElement, который возвращает экземпляр XCUIScreenshot:

let myImage = XCUIApplication().images["myAccessibilityIdentifier"]
let screenshotBefore = myImage.screenshot()
//...
//do some actions that change the image being displayed
//...
let screenshotAfter = myImage.screenshot()

//Validating that the image changed as intended
XCTAssertNotEqual(screenshotBefore.pngRepresentation, screenshotAfter.pngRepresentation)

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

Важно сравнивать представления PNG, используя свойство pngRepresentation, но не объекты XCUIScreenshot, поскольку эти два объекта всегда будут различаться внутри.

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