1 votos

AppleScript : buscar una pestaña en chrome y guardar la pestaña como una variable

Estoy usando este script que es encontrar la pestaña que quiero, y luego llevar la pestaña a foco.

set searchString to "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 actual 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

2voto

qarma Puntos 71

Resumen (TL;DR)

Almacena una referencia a un tab o window

O bien 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 cuando almacena referencias a objetos (como tabs ) en AppleScript. En concreto, se pregunta por el id de la pestaña. Aquí hay que tener cuidado: hay dos formas de referenciación Cromo tabs y windows usando números:

Referencia Tabs / Windows por id / index

❶・By index : p. ej. tab 2 of window 1

Esto se refiere a la ordenado posición de la pestaña de más a la izquierda a más a la derecha, es decir tab 1 se refiere al left tab , tab 2 se refiere a la pestaña a la derecha de tab 1 etc

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

Con la windows colección, el index es el ordenado posición de la ventana, de la más delantera a la más trasera, ordenada según la ventana que recibió el foco más recientemente. window 1 es sinónimo de la front window y actualmente tiene enfoque. Cuando se cambia a un Cromo esto se convierte ahora en window 1 y el anterior window 1 es ahora window 2 .

Por lo tanto, referenciar un objeto y almacenar referencias a ese objeto por su index es un método muy poco fiable, con la excepción de las referencias al front window o front tab donde sólo importa que el objeto tenga actualmente el foco, 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 el index es una propiedad con nombre para window objetos, que pueden ser leídos y set (ponerlo en 1 para llevarlo al frente). Aunque tab los objetos son referidos por un index no es una propiedad con nombre que se pueda leer o establecer.

❷・By id : p. ej. tab id 54 of window id 53

Este es un único , fijo asignada a cada objeto en el momento de su creación, y normalmente asciende en valor a medida que se crea cada nuevo objeto de una familia de objetos similares. Por lo tanto, en general , window id 2088 se creó después de window id 25 .

Es importante destacar que el id proporciona un valor de referencia fijo con el que puedes almacenar de forma fiable y segura objetos en variables para su uso posterior, sabiendo que seguirán refiriéndose exactamente al mismo objeto independientemente de en qué parte de tu script se evalúe la variable y de cómo haya cambiado la disposición de los objetos (hasta que el objeto sea destruido).

Cómo establecer y obtener la variable

Cuando se desea asignar una referencia a un tab o un window a una variable, puede elegir:

o bien almacenar su actual id y, a continuación, hacer referencia al valor de la propiedad tab por su id más adelante, cuyo valor será el de la variable;

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

Por id

A tienda por id , puedes hacerlo así:

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

En Cromo El active tab of the front window podría volver tab id 34 of window id 2045 . El id de eso tab el objeto es 34 Así que T se le asigna el valor 34 .

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

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

(suponiendo que el front window sigue siendo window id 2045 ; de lo contrario, tendrá que almacenar el window id en un valor separado también).

Tenga en cuenta que la referencia es a un tab id T y no tab T , que sería tab 34 (es decir index 34, si tiene 34 pestañas abiertas). El id etiqueta debe se incluya.

Por objeto

Para almacenar el tab objeto mismo, lo que a menudo es preferible, se hace así:

    set T to the front tab of the front window

Aunque he utilizado implícitamente index aquí, AppleScript realmente hace referencia al tab y el window tanto por su id (que lo hace en casi todas las situaciones). Por lo tanto, si se evalúa T encontrará que contiene tab id 34 of window id 2045 y no tab 1 of window 1 .

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

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

y T contendrá tab id 30 of window id 2045 que luego se puede llamar para realizar acciones dentro/sobre:

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

o

    tell T to close

1voto

qarma Puntos 71

Notas sobre el script

Presento esta segunda "respuesta" para abordar algunos aspectos específicos del ejemplo de código que ha proporcionado en su mensaje. Como esto no responde directamente a tu pregunta (lo que sí hace mi primera respuesta), y porque mi primera respuesta ya es muy larga; me pareció sensato componerla por separado.

Para empezar, su on setActiveTabIndex(t, searchString) especifica un argumento t pero luego no hace uso de la variable en ninguna parte del manejador. La variable t que es utilizado en realidad proviene de la repeat with t in tabs of front window bucle, donde t se asigna secuencialmente la referencia a cada tab de la front window . Por lo tanto, basta con cambiar la declaración del manipulador por on setActiveTabIndex(searchString) y luego ajustar el resto del script en consecuencia siempre que se llame al manejador, es decir, eliminando el primer argumento.

Una rareza en la forma de implementar el repeat en este manejador es como declaró una nueva variable i para que sirva de contador, y luego incrementar manualmente su valor con cada iteración. En su lugar, puede definir i dentro del repeat construirse a sí mismo, 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 del script es Vale pero se basa en un montón de bucles iterativos manuales que no sólo son difíciles de leer dentro del script -difícil de discernir lo que está sucediendo en cada etapa- sino que también es menos eficiente en la ejecución.

En su lugar, puede utilizar Colecciones de objetos de AppleScript que puede ser filtrado utilizando 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

-1voto

wch1zpink Puntos 11

He aquí un ejemplo rápido si tuviera dos pestañas abiertas en Google Chrome

tell application "Google Chrome"
    tell its window 1
        set tabNames to title of every tab

        set tabOne to item 1 of tabNames
        set tabTwo to item 2 of tabNames

        set the URL of tab tabOne to "https://apple.stackexchange.com/questions/328596/applescript-searching-for-a-tab-on-chrome-and-saving-the-tab-as-a-variable"

        set the URL of tab tabTwo to "https://www.macosxautomation.com/index.html"

    end tell
end tell

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X