Hi-Applescript在这里结束。
我实际上并没有尝试运行下面的脚本本身,但我正在尝试找到一种能够达到这种效果的AppleScript语言结构(在我熟悉的语言中工作得很好,哈哈):< / p>
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表现如预期(或具有预期的属性),至少克服了这个问题。感谢大家拯救我摆脱这场噩梦!
答案 0 :(得分:1)
正如您所发现的,AppleScript没有 truthy 和 falsy 的概念 - 评估为true
或false
的唯一值是布尔值(值或表达式)。与此一致,0,空字符串和missing value
都不能强制转换为false
。
如果要测试GUI脚本操作是否成功,则必须将返回值与预期值进行比较,例如通过将返回值的类与 UI元素类层次结构,即
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
或通过将代码包装在try … on error
块中来利用OSA对异常的大量使用,即
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
我将不会评论您的示例代码,其中包含一些错误,这些错误会阻止它按预期工作,正如您所说的那样,您实际上并没有尝试运行它...
答案 1 :(得分: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