Как закрыть все или только некоторые вкладки в Safari с помощью AppleScript? - PullRequest
1 голос
/ 23 марта 2010

Я сделал очень простой 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, январь 2008 г.), а также на Mac Pro G5 под Tiger, и сценарий завершился неудачно на обоих, хотя и с гораздо менее описательной ошибкой на Tiger.

Запуск сценария несколько раз закрывает несколько вкладок каждый раз, пока не остается ни одной, но всегда завершается ошибкой с той же ошибкой после закрытия нескольких вкладок. Под леопардом я получаю ошибку выхода за границы. Так как я использую быстрое перечисление (не использую «повторить от 0 до количества элементов в окнах»), я не вижу, как я могу получить ошибку выхода за границы этого ...

Моя цель - использовать Cocoa Scripting Bridge для закрытия вкладок в Safari из моего приложения Objective-C Cocoa, но Scripting Bridge не работает таким же образом. Не удаляемые вкладки отображаются в отладчике Xcode как NULL, в то время как другие вкладки являются действительными объектами, из которых я могу получить значения обратно (например, их заголовок). На самом деле я сначала попробовал использовать Scripting Bridge, а затем сказал себе, почему бы не попробовать это прямо в AppleScript, и я был удивлен, увидев такие же результаты.

У меня должно быть явное упущение или что-то там ... (мне кажется, это ошибка в поддержке Safari AppleScript ...: S) Я использовал повторяющиеся циклы и быстрое перечисление Obj-C 2.0 для перебора коллекций раньше с нулевыми проблемами, так что я действительно не вижу, что здесь не так.

Кто-нибудь может помочь?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 24 марта 2010

У меня есть скрипт, который закрывает все вкладки, но не нуждается в цикле повторения.

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

Посмотрите, работает ли это для вас.

Примечание: измените «Переполнение стека» на любое название заголовка вкладка, которую вы хотите оставить открытой.

4 голосов
/ 23 марта 2010

это работает для меня красиво и просто

  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
...