Ожидание между событиями GUI - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь написать тест для графического компонента в Dyalog APL, который будет имитировать нажатия кнопок, которые открывают новые окна и нажатия клавиш для заполнения полей формы.Мой первый подход состоял в том, чтобы просто написать последовательность операторов QNQ для постановки в очередь событий:

⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
....

Проблема, однако, заключается в том, что ⎕NQ завершается ошибкой, если целевой объект еще не отображался (например, при открытииокно):

VALUE ERROR: The event contains an invalid object or event name

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

Какой подход долженБеру?

Ответы [ 2 ]

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

Если тестовая функция вызывается асинхронно (с использованием оператора появления «&»), задержки будут работать, как и ожидалось:

∇ Test dummy
    ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
    ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
    ....
∇

Test& 0
0 голосов
/ 22 октября 2018

Проблема в том, что монадический ⎕NQ «отправляет» сообщение во внутреннюю очередь.Первое сообщение не было обработано, когда вы «NQ» второго сообщения, поэтому целевой объект еще не был создан.Используйте левый аргумент от 1 до ⎕NQ, который будет «отправлять» сообщение объекту, а не «публиковать» его.

⎕NQ документация

На моемЯ сделал следующее:

'⎕se.mb.jd' ⎕wc 'MenuItem' 'jd' ('event' 'select' 'jd')

и у меня есть функция jd:

∇jd a
[1]   'f'⎕WC'form'
∇

и функция foo:

∇foo
[1]   1 ⎕NQ'⎕se.mb.jd' 'select'
[2]    ⎕DL 5
[3]   'done'
∇

Когда я запускаюfoo, окно всплывает сразу же, а затем есть 5-секундная задержка, прежде чем я вижу готово в сеансе.

Вы можете попробовать это?Затем мы посмотрим на то, что вы делаете по-другому.

...