如何使用AppleScript关闭Safari中的所有或仅一些选项卡?

时间:2010-03-23 20:30:56

标签: scripting safari applescript scripting-bridge

我制作了一个非常简单的AppleScript来关闭Safari中的标签。问题是,它有效,但不完全。 只关闭了几个标签。以下是代码:

tell application "Safari"
    repeat with aWindow in windows
        repeat with aTab in tabs of aWindow
            if [some condition is encountered] then
                aTab close
            end if
        end repeat
    end repeat
end tell

我也试过这个剧本:

tell application "Safari"
    repeat with i from 0 to the number of items in windows
        set aWindow to item i of windows
        repeat with j from 0 to the number of tabs in aWindow
            set aTab to item j of tabs of aWindow
            if [some condition is encountered] then
                aTab close
            end if
        end repeat
    end repeat
end tell

...但它也不起作用(相同的行为)。

我在我的系统(MacBook Pro jan 2008)以及Tiger下的Mac Pro G5上尝试了这一点,并且脚本都失败了,尽管Tiger的描述性错误要少得多。

每次运行脚本几次会关闭几个选项卡,直到没有剩余,但在关闭几个选项卡后总是会失败并出现相同的错误。在Leopard下我得到一个越界错误。由于我使用的是快速枚举(不使用“从0重复到窗口中的项目数量”),我看不出我怎么能得到一个越界错误...

我的目标是使用Cocoa Scripting Bridge从我的Objective-C Cocoa应用程序中关闭Safari中的选项卡,但脚本桥以相同的方式失败。不可删除的选项卡在Xcode调试器中显示为NULL,而其他选项卡是有效的对象,我可以从中获取值(例如它们的标题)。事实上,我首先尝试使用Scripting Bridge然后告诉自己为什么不直接在AppleScript中尝试这一点,我很惊讶地看到相同的结果。

我必须有一个明显的遗漏或其他东西......(似乎是Safari AppleScript支持我的一个错误......:S)我使用了重复循环和Obj-C 2.0快速枚举来迭代收藏之前没有问题,所以我真的不明白这里有什么问题。

任何人都可以提供帮助吗?

提前致谢!

3 个答案:

答案 0 :(得分:5)

我有一个关闭所有标签但不需要重复循环的脚本。

set closeTab to "Stack Overflow" as string
tell application "Safari"
    close (every tab of window 1 whose name is not equal to closeTab)
end tell

看看它是否适合你。

注意:将“Stack Overflow”更改为标题名称 您要保持打开的标签。

答案 1 :(得分:4)

这对我而言非常简单

  tell application "Safari"
    close every window
  end tell

好的,你必须从计数到1,否则当你关闭窗口时计数将被关闭

  tell application "Safari"
    repeat with i from (count of windows) to 1 by -1
        repeat with j from (count of tabs of window i) to 1 by -1
            set thistab to tab j of window i
            set foo to name of thistab
            if foo is not equal to "bar" then close thistab
        end repeat
    end repeat
  end tell

答案 2 :(得分:0)

两个提供的答案都很好,但我认为最好将两者结合起来。通过这种方式,您将关闭所有 chrome 窗口的所有选项卡,并且比第一个答案更简洁:

set closeTab to  "Post Attendee" as string
tell application "Google Chrome"
    repeat with i from (count of windows) to 1 by -1
          close (every tab of window i whose name is not equal to closeTab)
    end repeat
end tell