Applescript - Google Chrome активирует определенное окно

Вы, ребята, знаете, как активировать n-е окно Google Chrome с помощью Applescript? Например, если у меня открыто три окна Google Chrome, как активировать второй?

Я пробовал много разных комбинаций, например: сообщите вкладке 3 окна 2, чтобы активировать

Я также заметил, что:

сообщить приложению "Google Chrome"   указать окно 1 для активации end tell

и

сообщить приложению "Google Chrome"   указать окно 2 для активации end tell

дают те же результаты, он активирует только последнее окно открыт, это ошибка?

Заранее спасибо:)

Ответ 1

TL;DR

Использование set index of window <n> to 1 не полностью эффективно, поскольку оно действительно не активирует окно - оно делает его видимым.

Обходные пути (примеры предполагают, что вы хотите активировать окно 2):

  • Отвечать Яру предлагает прагматичное обходное решение, хотя не совсем понятно, почему он работает. Однако у него есть то преимущество, что не требуется, чтобы вызывающее приложение было разрешено для вспомогательного доступа, в отличие от следующих решений.

  • user495470 answer указывает на надежное и универсальное решение, которое также работает с приложениями, отличными от AppleScript:

    tell application "System Events" to tell process "Google Chrome"
        perform action "AXRaise" of window 2
        set frontmost to true
    end tell
    
  • В качестве альтернативы используйте обработчик AppleScript, определенный ниже, следующим образом:

    • tell application "Google Chrome" to my activateWin(it, window 2)

В то время как ответ adayzdone должен работать и почти есть, есть уловка - что может быть или не быть проблемой (наблюдается в Chrome 21.0.1180.89 на Mountain Lion) [обновление: по-прежнему действует с Chrome 47.0.2526.106 на OSX 10.11.2]:

Пока решение покажет нужное окно в качестве переднего окна, Chrome не будет рассматривать его как переднее окно, если другое окно было ранее активным. Вы можете указать кнопки неактивного закрытия/мин/зум-заголовка, по какому заголовку окна находится галочка, а также тому, что быстрые клавиши, такие как Cmd-L, не будут применяться к нужному окну.

Если ваше следующее действие будет состоять в том, чтобы щелкнуть где-нибудь в окне в любом случае, это может быть не проблема, так как такой щелчок полностью активирует нужное окно.

В противном случае вы можете использовать достаточно надежный способ обхода GUI-скриптов (с благодарностью адаптированный из общего решения здесь):

Обновление. К сожалению, проблема не активирования окна, индекс которого вы устанавливаете на 1, кажется, влияет на ВСЕ приложения (опыт OS X 10.8.3). Здесь общая функция, которая правильно активирует данное окно в данном приложении AppleScriptable с использованием графического интерфейса пользователя.

# Activates the specified window (w) of the specified AppleScriptable
# application (a).
    # Note that both parameters must be *objects*.
# Example: Activate the window that is currently the 2nd window in Chrome:
#   tell application "Google Chrome"
#       my activateWin(it, window 2)
#   end tell
on activateWin(a, w)
    tell application "System Events"
        click menu item (name of w) of menu 1 of menu bar item -2 ¬
                   of menu bar 1 of process (name of a)
    end tell
    activate a
end activateWin

С другой стороны, то, что ОП пыталось использовать, например, activate window 1, похоже, было нарушено во ВСЕХ приложениях в OS X 10.8.3, а также при запуске основного приложения, спецификации окна. игнорируется.

Здесь оригинальный, более дидактический код:

tell application "Google Chrome"
    # Each window is represented by the title of its active tab
    # in the "Window" menu.
    # We use GUI scripting to select the matching "Window" menu item
    # and thereby properly activate the window of interest.
    # NOTE: Should there be another window with the exact same title,
    # the wrong window could be activated.

    set winOfInterest to window 2 # example
    set winTitle to name of winOfInterest

    tell application "System Events"
        # Note that we must target the *process* here.
        tell process "Google Chrome"
            # The app menu bar.
            tell menu bar 1
                # To avoid localization issues,
                # we target the "Window" menu by position - the next-to-last
                # rather than by name.
                click menu item winTitle of menu 1 of menu bar item -2
            end tell
        end tell
    end tell
    # Finally, activate the app.
    activate
end tell

Ответ 2

Try:

tell application "Google Chrome"
    activate
    set index of window 1 to 1
    delay 3
    set index of window 2 to 1
end tell

Ответ 3

Как упоминалось в mklement, изменение индекса вызывает окно, но, например, горячие клавиши по-прежнему регистрируются в предыдущем переднем окне.

tell application "Google Chrome"
    set index of window 2 to 1
end tell

Другой вариант - сообщить системным событиям в окно AXRaise 1:

tell application "Google Chrome"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Google Chrome"
    perform action "AXRaise" of window 1
end tell

Ответ 4

Установите индекс, а затем откройте Chrome.

tell application "Google Chrome"
    set index of window 2 to 1
    delay 0.01
    do shell script "open -a Google\\ Chrome"
end tell

Источник

Ответ 5

В дополнение к решениям относительно активации желаемого окна (по крайней мере) новые версии Chrome также поддерживают свойство windows active tab index:

tell window 1
    set active tab index to 5
end tell

Ответ 6

если вы запустите этот

activate application "Google Chrome"
tell application "System Events" to keystroke "`" using command down

он выполнит все это, даже если его запустить из редактора script.

иначе, этот уже был прописан кем-то еще несколькими шагами:

tell application "System Events" to tell process "Google Chrome" to perform action "AXRaise" of window 2
activate application "Google Chrome"

если вы хотите сохранить его в качестве приложения и назначить ему горячую клавишу, вы можете сделать это:

tell application "Google Chrome" to set index of window 2 to 1

хотя я предполагаю, что в этот момент вы можете просто нажать команду + `. Если, конечно, ваш applescript не включает в себя ряд шагов, создающих последовательность шагов, как это, вероятно, так. Если он включает в себя несколько этапов, то, как первая строка второго образца кода, будет все, что вам нужно, если вы назначите его горячей клавише и нажмите горячую клавишу, когда хром уже активирован (или строка появляется после того, как хром активируется в вашем коде).