2

嗨,Applescript 小节在这里。

我实际上并没有尝试运行下面的脚本,但我正在尝试找到一个 AppleScript 语言结构来实现这种效果(它在我熟悉的语言中运行良好,哈哈):

set adoc to choose file
tell application "Finder"
    tell application "TextEdit"
        open adoc
    end tell
    tell application process "Textedit" of application "System Events"
        if (click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of application process "TextEdit" of application "System Events") then
            display dialog "It worked boss!"
        end if
    end tell
end tell

基本上,我正在编写一个旧应用程序的 GUI 脚本,并且需要在每一步都知道是否发生了事件。我知道我可以通过询问“打印”窗口是否存在来推断事件的成功,但是由于我不会进入的原因,我不想从事件的预期结果中推断事件,我想知道是否它发生了。有没有办法在 AppleScript 中做到这一点?谢谢!


有趣的是,出于我愚蠢深奥的目的,所提供的两个答案的组合让我完成了编写一些非常古老的应用程序的脚本。在某些情况下,可能会出现具有相似按钮的两个可能窗口之一,其中 {x,y} 解决方案(出于我的目的,在某些情况下更有效)不起作用,因为我仍然可以正确单击错误的按钮,其中 try...on 错误策略的应用(我实际上觉得有点愚蠢,没有考虑过),这并没有给我同样的精确度,因为我正在使用的一些 UI 元素很奇怪而且不t 表现如预期(或具有预期的属性),至少克服了这个问题。感谢大家把我从这个噩梦中拯救出来!

4

2 回答 2

1

正如您所发现的, AppleScript没有真值和值的概念——唯一的值评估为正确的布尔值(值truefalse表达式)。与此一致,既不是 0,也不是空字符串,也不missing value能被强制转换为false.

如果您想测试您的 GUI 脚本操作是否成功,您必须将返回值与预期值进行比较,例如将返回值的类与UI 元素类层次结构中目标对象的类进行比较, IE

if class of (click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of process "TextEdit" of application "System Events") is menu item then
    display dialog "It worked, Boss"
end if

或通过将代码包装在一个块中来利用 OSA 对异常的大量使用try … on error,即

try
    click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of process "TextEdit" of application "System Events"
    display dialog "It worked, Boss"
on error errorMessage
    log errorMessage
end try

我将避免评论您的示例代码,其中包括几个错误,这些错误将阻止它按预期工作,正如您所说,您实际上并没有尝试运行它......

于 2012-05-01T18:50:38.573 回答
1

只是另一种方法。对于动作和点击,它会在成功时返回对象或另一个对象。匹配这些对象以确保除了目标之外没有其他对象已收到该操作。

tell application "System Events"
    tell process "Safari"
        if (count of windows) < 1 then return --there are no windows, no reason to continue
        tell window 1
            tell checkbox 1 of group 1
                if (click it) is not it then
                    --click has failed; stop 
                    return
                end if
            end tell
        end tell
    end tell
end tell

--编辑:为 adayzdone 添加了一些示例代码,向他展示它如何与打印一起工作

tell application "Safari" to activate --comment//uncomment this line
tell application "System Events"
    tell process "Safari"
        set theTarget to menu bar item 3 of menu bar 1
        set {xPos, yPos} to position of theTarget
        if (click at {xPos, yPos}) is not theTarget then
            return false
        end if
        set theTarget to last menu item of menu 1 of menu bar item 3 of menu bar 1
        set {xPos, yPos} to position of theTarget
        if (click at {xPos, yPos}) is not theTarget then
            return false
        end if
        return true
    end tell
end tell
于 2012-05-01T23:09:48.257 回答