Как определить, какая часть текста в виде прокрутки видна на экране из теста пользовательского интерфейса XCode? - PullRequest
0 голосов
/ 19 ноября 2018

Я новичок в среде тестирования пользовательского интерфейса XCode. Я могу успешно манипулировать элементами экрана, но не могу понять, как создать значимое утверждение о том, какой текст виден в режиме прокрутки.

Тест, который я хотел бы написать, будет выглядеть следующим образом: запустите приложение, наберите много текста в текстовом представлении (достаточно, чтобы первая строка прокручивалась вне поля зрения), утверждая, что первая строка текста не видна, прокрутите представление вверх до верха, затем подтвердите, что первая строка теперь видна. Обратите внимание, что цель этого теста - убедиться, что мое приложение правильно подключено, а не тестировать код Apple.

XCUIApplication позволяет мне печатать в моем экземпляре NSTextView, а также позволяет прокручивать связанный NSScrollView. Но как мне утверждать, видна ли первая строка текста в данный момент? Атрибут value в XCUIElement предоставляет все текстовое содержимое представления, независимо от того, отображается оно в данный момент или нет.

Методы accessibilityRange (forLine :) и accessibilityString (for :) в NSTextView были бы идеальными, но я не могу понять, как получить к ним доступ, поскольку тест пользовательского интерфейса имеет доступ только к XCUIElement, а не к базовому NSTextView.

Я что-то пропустил или есть лучший способ подойти к этому?

1 Ответ

0 голосов
/ 20 ноября 2018

Если вы установили идентификатор доступности в раскадровке или в коде для текстового представления, вы можете получить текстовое представление через (при условии, что вы дали ему идентификатор «textview1» и окно, в котором он находится, имеет идентификатор доступности по умолчанию «Window»). ):

let textview1TextView = app.windows["Window"].textViews["textview1"]

но на самом деле это не даст вам того, что вам нужно.

Вместо этого установите идентификатор доступности скроллвью и получите:

let scrollview = app.windows["Window"].scrollViews["scrollview1"]

Затем используйте его, чтобы получить полосы прокрутки (в этом случае у вас должна быть только одна; вы можете использовать scrollbars.count для проверки.

let scrollbars = scrollview.scrollBars
print("scrollbars count: \(scrollbars.count)")

Затем вы можете использовать атрибут значения полосы прокрутки, чтобы получить его значение: (вы конвертируете XCUIElemenTypeQueryProvider в XCUIElement, чтобы вы могли получить его значение):

let val = scrollbars.element.value

это будет 0 сверху и значение с плавающей запятой при прокрутке (одна строка текста в моем тестовом коде показала значение {{0.02409638554216868}}.

Документация, которая поможет вам в дальнейшем изучении:

XCUIElementTypeQueryProvider

XCUIElementAttributes

Обратите внимание, что вы можете поставить точку останова в середине теста, запустить ее и затем использовать консоль отладчика для проверки:

(lldb) po scrollbars.element.value
    t =   749.66s Find the ScrollBar ▿ Optional<Any>
  - some : 0

(lldb) po scrollbars.element.value
    t =   758.17s Find the ScrollBar ▿ Optional<Any>
  - some : 0.05421686746987952

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


OK OP теперь отметил, что их интересует конкретный текст, показывающий или нет, а не первую видимую строку или нет (на что я ранее ответил выше).

Вот немного хака, но я думаю, что это сработает:

Используйте XCUICoordinate метод click(forDuration:, thenDragTo:), чтобы выбрать первую строку текста (используйте рамку вида для вычисления координат), а затем используйте typeKey( modifierFlags:), чтобы вызвать команду редактирования "копировать" в меню редактирования. Затем используйте методы NSPasteboard, чтобы получить содержимое картона и проверить текст.

Вот быстрый тест, который я сделал для проверки подхода (выделение первой строки текста с помощью XCUICoordinate, как отмечено выше, оставлено в качестве упражнения для читателя):

NSPasteboard.general.clearContents()

// stopped at break point on next line and I manually selected the text of the first line of text in my test app and then hit continue in the debugger

textview1TextView.typeKey("c", modifierFlags:.command)
print( NSPasteboard.general.pasteboardItems?.first?.string(forType: NSPasteboard.PasteboardType.string) ?? "none" );

-> «текст первой строки» был напечатан на консоли.

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

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