Applescript - Google Chrome activate a certain window

m41n1 picture m41n1 · Apr 28, 2012 · Viewed 9.3k times · Source

Do you guys know how to activate the n-th Google Chrome window with Applescript? For example, if I have three Google Chrome windows opened, how do activate the second?

I've tried many different combinations, e.g.: tell tab 3 of window 2 to activate

I've also noticed that:

tell application "Google Chrome" tell window 1 to activate end tell

and,

tell application "Google Chrome" tell window 2 to activate end tell

produce the same results, it only activates the last window opened, Is this a bug?

Thanks in advance :)

Answer

mklement0 picture mklement0 · Sep 8, 2012

tl;dr

Using set index of window <n> to 1 isn't fully effective in that it doesn't truly activate the window - it does make it visible, though.

Workarounds (examples assume you want to activate window 2):

  • Yar's answer offers a pragmatic workaround, though it's not entirely clear why it works. It does, however, have the advantage of not requiring the calling application to be authorized for assistive access, unlike the following solutions.

  • user495470's answer hints at a robust and generic solution that also works with non-AppleScriptable applications:

    tell application "System Events" to tell process "Google Chrome"
        perform action "AXRaise" of window 2
        set frontmost to true
    end tell
    
  • Alternatively, use the AppleScript handler defined below as follows:

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

While adayzdone's answer should work and almost does, there is a catch - which may or may not be a problem (observed on Chrome 21.0.1180.89 on Mountain Lion) [update: still applies as of Chrome 47.0.2526.106 on OSX 10.11.2]:

While the solution will show the desired window as the front window, Chrome will NOT treat it as the front window if a different window was previously active. You can tell by the inactive close/min/zoom title-bar buttons, by what window title the checkmark is next to, and by the fact that keyboard shortcuts such as Cmd-L will not apply to the desired window.

If your next action will be to click somewhere on the window anyway, this may not be a problem, as such a click will fully activate the desired window.

Otherwise, you can employ a reasonably robust GUI-scripting workaround (gratefully adapted from a generic solution here):

Update: Sadly, the problem of not actually activating the window whose index you set to 1 seems to affect ALL apps (experienced on OS X 10.8.3). Here's a generic function that properly activates a given window in a given AppleScriptable app using GUI scripting.

# 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

On a side note, what the OP tried - e.g., activate window 1 - seems to be broken in ALL apps on OS X 10.8.3 as well - while the underlying application is activated, the window spec. is ignored.

Here's the original, more didactic code:

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's 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