AppleScript: buscando una pestaña en Chrome y guardando la pestaña como una variable

Estoy usando este script que está encontrando la pestaña que quiero, luego enfoco la pestaña.

establezca searchString en "Pestaña que estoy buscando"

tell application "Google Chrome"
    set win_List to every window
    set win_MatchList to {}
    set tab_MatchList to {}
    set tab_NameMatchList to {}
    repeat with win in win_List
        set tab_list to every tab of win
        repeat with t in tab_list
            if searchString is in (title of t as string) then
                set end of win_MatchList to win
                set end of tab_MatchList to t
                set end of tab_NameMatchList to (id of win as string) & ".  " & (title of t as string)
            end if
        end repeat
    end repeat
    if (count of tab_MatchList) is equal to 1 then
        set w to item 1 of win_MatchList
        set index of w to 1
        my setActiveTabIndex(t, searchString)
    else if (count of tab_MatchList) is equal to 0 then
        display dialog "No match was found!" buttons {"OK"} default button 1
    else
        set which_Tab to choose from list of tab_NameMatchList with prompt "The following Tabs matched, please select one:"
        set AppleScript's text item delimiters to "."
        if which_Tab is not equal to false then
            set tmp to text items of (which_Tab as string)
            set w to (item 1 of tmp) as integer
            set index of window id w to 1
            my setActiveTabIndex(t, searchString)
        end if
    end if
end tell
on setActiveTabIndex(t, searchString)
    tell application "Google Chrome"
        set i to 0
        repeat with t in tabs of front window
            set i to i + 1
            if title of t contains searchString then
                set active tab index of front window to i
                return
            end if
        end repeat
    end tell

end setActiveTabIndex

Esto funciona bien, pero ¿cómo puedo guardar el número de pestaña como una variable para que, si necesito hacer más cosas en esta pestaña real, pueda hacer algo como esto (imaginando que el número de pestaña se guarda como "TABNUMBER")?

tell application "Google Chrome"
    set myTab to front window's tab TABNUMBER
    set URL of myTab to "https:..."
end tell

Respuestas (2)

Notas sobre el guión

Estoy enviando esta segunda "respuesta" para abordar algunos detalles sobre el ejemplo de código que proporcionó en su publicación. Como esto no responde a su pregunta directamente (lo que hace mi primera respuesta), y porque mi primera respuesta ya es muy larga; Me pareció sensato componer esto por separado.

Para empezar, la definición de su on setActiveTabIndex(t, searchString)controlador especifica un argumento t, pero luego no utiliza la variable en ninguna parte del controlador. La variable tque se utiliza en realidad proviene del repeat with t in tabs of front windowciclo, donde tse asigna secuencialmente la referencia a cada tabuno de los front window. Por lo tanto, simplemente puede cambiar la declaración del controlador a on setActiveTabIndex(searchString), y luego ajustar el resto de la secuencia de comandos en consecuencia donde se llame al controlador, es decir, eliminando el primer argumento.

Una rareza en la forma en que implementó el repeatciclo en este controlador es cómo declaró una nueva variable ipara que sirviera como contador, luego incrementó manualmente su valor con cada iteración. En su lugar, puede definir identro de la repeatpropia construcción, así:

    repeat with i from 1 to the number of tabs in the front window
        set t to tab i of the front window
        if title of t contains the searchString then
            set the active tab index of the front window to i
            return
        end if
    end repeat

El resto de la secuencia de comandos está bien , pero se basa en una gran cantidad de bucles iterativos manuales que no solo son difíciles de leer dentro de la secuencia de comandos, lo que dificulta discernir lo que sucede en cada etapa, sino que también es menos eficiente en la ejecución.

En su lugar, podría utilizar las colecciones de objetos de AppleScript que se pueden filtrar usando whose(o where).

Por ejemplo, en lugar de:

    repeat with win in win_List
        ...
        repeat with T in tab_list
            if searchString is in (title of T as string) then
                ...
            end if
            ...
        end repeat
    end repeat

puedes usar esto:

    get every tab in every window whose title contains the searchString

Resumen (TL;DR)

Almacenar una referencia a un tabowindow

Ya sea por id(que es fijo):

    set T to the id of the current tab in the front window
    ...
    set the URL of tab id T of the front window to "https://apple.stackexchange.com/"

O por objeto (que es fijo):

    set T to the current tab in the front window
    ...
    set the URL of T to "https://apple.stackexchange.com/"

PERO no por index(que cambia).


Tiene un par de opciones al almacenar referencias a objetos (como tabs) en AppleScript. Específicamente, está preguntando sobre la idpropiedad de la pestaña. Debe tener cuidado aquí: hay dos formas de hacer referencia a Chrome tabs y windowsusar números:

Referenciando Tabs/ Windowspor id/index

❶・Por index: ej.tab 2 of window 1

Esto se refiere a la posición ordenada de la pestaña de izquierda a derecha, es decir , tab 1se refiere a left tab, tab 2se refiere a la pestaña a la derecha de tab 1, etc.

Estos índices cambian si las pestañas se mueven, abren y cierran. Por ejemplo, si cierra la mitad de tres pestañas, tab 3se convierte en tab 2.

Con la windowscolección, indexes la posición ordenada de la ventana desde la parte delantera hasta la trasera, ordenada por la ventana que recibió el foco más recientemente. window 1es sinónimo de front window, y actualmente tiene foco. Cuando cambias a una ventana diferente de Chrome , esta ahora se convierte en window 1, y la anterior window 1ahora es window 2.

Por lo tanto, hacer referencia a un objeto y almacenar referencias a ese objeto por su indexpropiedad es un método muy poco confiable, con la excepción de las referencias a front windowo front tabdonde solo importa que el objeto tenga el foco actualmente, independientemente de cuál sea. Por lo tanto, tell the front tab of the front window to...es un uso perfectamente razonable del index, y probablemente el único.

Tenga en cuenta que la indexpropiedad es una propiedad con nombre para windowlos objetos, que se puede leer y configurar (configúrelo 1para traerlo al frente). Aunque tabuna propiedad hace referencia a los objetos index, no es una propiedad con nombre que se pueda leer o establecer.

❷・Por id: ej.tab id 54 of window id 53

Esta es una propiedad única y fija asignada a cada objeto en el momento de su creación, y su valor suele aumentar a medida que se crea cada nuevo objeto en una familia de objetos similares. Entonces, en términos generales , window id 2088se creó después de window id 25.

Es importante destacar que idproporciona un valor de referencia fijo con el que puede almacenar objetos de manera confiable y segura en variables para su uso posterior, sabiendo que aún se referirán exactamente al mismo objeto, independientemente de dónde se evalúe la variable en su secuencia de comandos y cómo se organicen los objetos. ha cambiado (hasta que el objeto es destruido).

Establecer y obtener la variable

Cuando desee asignar una referencia a tabo windowa una variable, puede optar por:

almacenar su idvalor de propiedad real, luego hacer referencia a él tabmás idtarde, cuyo valor será el valor de la variable;

o puede almacenar todo el objeto en una variable AppleScript. Esto suele ser lo más fácil.

Porid

Para almacenar porid , puede hacerlo así:

    set T to the id of the active tab of the front window

En Chrome , active tab of the front windowpodría volver tab id 34 of window id 2045. El idde ese tabobjeto es 34, por lo que Tse le asigna el valor 34.

Luego, más adelante, para realizar acciones en esa misma pestaña, que puede que ya no sea la active tab, puedes hacerlo así:

    tell tab id T of the front window to execute JavaScript...

(suponiendo que front windowtodavía sea window id 2045; de lo contrario, también tendrá que almacenar el window idvalor en un valor separado).

Tenga en cuenta que la referencia es atab id T y no tab T , que sería tab 34(es decir, index34, si tuviera 34 pestañas abiertas). La idetiqueta debe estar incluida.

por objeto

Para almacenar el tabobjeto en sí, lo que a menudo es preferible, lo hace así:

    set T to the front tab of the front window

Aunque he usado indexvalores implícitamente aquí, AppleScript en realidad hace referencia a tabambos windowpor sus idvalores (que lo hace en casi todas las situaciones). Entonces, si evalúa T, encontrará que contiene tab id 34 of window id 2045y no tab 1 of window 1.

También puede asignar el tabobjeto a una variable como esta:

    set T to the first tab of window id 2045 whose URL is "chrome://newtab/"

y Tcontendrá tab id 30 of window id 2045, al que luego puede llamar para realizar acciones dentro/sobre:

    set the URL of T to "https://stackexchange.com"

o

    tell T to close
eso es perfecto gracias, estoy fuera de la oficina por unos días pero no puedo esperar para probar todo esto. gracias.