0

我正在尝试为 Dyalog APL 中的图形组件编写一个测试,它将模拟打开新窗口的按钮单击和用于填写表单字段的击键。我的第一种方法是简单地编写一系列 ⎕NQ 语句用于排队事件:

⎕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 语句之间插入几秒钟的暂停,但这没有任何区别,因为执行是同步的。

我应该采取什么方法?

4

2 回答 2

2

这里的问题是 monadic ⎕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 秒的延迟。

你能试试吗?然后,我们将看看你正在做什么不同的事情。

于 2018-10-22T11:21:45.957 回答
0

如果异步调用测试函数(使用生成运算符“&”),延迟将按预期工作:

∇ Test dummy
    ⎕NQ '#.foo.barButton' 'Select'   ⍝ open window
    :While 0=⎕NC '#.foo.bar.bazTab'
        ⎕DL 1
    :EndWhile
    ⎕NQ '#.foo.bar.bazTab' 'Select'  ⍝ select tab in opened window
    ....
∇

Test& 0

2022-02-18 更新:插入了一个循环,等待窗口显示。

于 2018-11-05T13:34:20.740 回答