Applescript - Google Chrome activate a certain win

2020-02-23 07:33发布

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 :)

6条回答
乱世女痞
2楼-- · 2020-02-23 08:13

Set the index and then open Chrome.

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

Source

查看更多
Explosion°爆炸
3楼-- · 2020-02-23 08:21

if you run this

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

it will do the whole thing even if its run from script editor.

heres another way, this one was already spelled out by someone else just in more steps:

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

if youre willing to save it as an application and assign it to a hotkey, you can do this:

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

though i suppose at that point you may aswell simply hit command+`. Unless of course, your applescript involves a series of steps creating a series of steps, as is likely the case. If it involves a series of steps, something like the first line of the second code sample would be all you'd need, provided you assign it to a hotkey and hit the hotkey when chrome is already activated (or the line comes after chrome is activated in your code).

查看更多
何必那么认真
4楼-- · 2020-02-23 08:22

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
查看更多
家丑人穷心不美
5楼-- · 2020-02-23 08:27

In addition to the solutions regarding activating the desired window, (at least) newer Chrome versions also support windows’ active tab index property:

tell window 1
    set active tab index to 5
end tell
查看更多
看我几分像从前
6楼-- · 2020-02-23 08:36

As mklement mentioned, changing the index raises the window, but for example keyboard shortcuts are still registered by the previously frontmost window.

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

Another option is to tell System Events to AXRaise window 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
查看更多
戒情不戒烟
7楼-- · 2020-02-23 08:37

Try:

tell application "Google Chrome"
    activate
    set index of window 1 to 1
    delay 3
    set index of window 2 to 1
end tell
查看更多
登录 后发表回答