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

1

Estoy usando este script que busca la pestaña que quiero, luego enfoca la pestaña.

establece 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 la pestaña como una variable, por lo que si necesito hacer más cosas en esta pestaña real, puedo hacer algo como esto (imaginar el número de la 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
    
pregunta Kevin 24.06.2018 - 16:26

2 respuestas

1

Notas sobre el guión

Estoy enviando esta segunda "respuesta" para abordar algunos detalles sobre el ejemplo de código que proporcionaste en tu publicación. Como esto no responde a tu 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 comenzar, su definición de controlador on setActiveTabIndex(t, searchString) especifica un argumento t , pero luego no hace uso de la variable en ninguna parte del controlador. La variable t que es utilizada en realidad proviene del bucle repeat with t in tabs of front window , donde a t se le asigna secuencialmente la referencia a cada tab del 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 bucle repeat en este controlador es cómo declaró una nueva variable i para que actúe como contador, y luego incremente manualmente su valor con cada iteración. En su lugar, puede definir i dentro de la propia construcción repeat , como esto:

    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 está bien , pero se basa en muchos bucles iterativos manuales que no solo son difíciles de leer en el script, lo que dificulta discernir lo que sucede en cada etapa: pero también es menos eficiente en la ejecución.

En su lugar, puede utilizar colecciones de objetos de AppleScript que pueden filtrarse 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
    
respondido por el CJK 24.06.2018 - 20:35
1

Resumen (TL; DR)

Almacene una referencia a un tab o window

O 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ás preguntando sobre la propiedad id de la pestaña. Debes tener en cuenta que hay dos maneras de hacer referencia a Chrome tabs y windows usando números:

Referencia a Tabs / Windows por id / index

  

❶ ・ Por index : por ejemplo, tab 2 of window 1

Esto se refiere a la posición ordenada de la pestaña de izquierda a derecha, es decir, tab 1 se refiere a left tab , tab 2 se 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 cierras la mitad de las tres pestañas, tab 3 se convierte en tab 2 .

Con la colección windows , index es la posición ordenada de la ventana desde la parte frontal hasta la posterior, ordenada según la ventana que recibió el foco más recientemente. window 1 es sinónimo de front window , y actualmente tiene el foco. Cuando cambias a una ventana Chrome diferente, ahora se convierte en window 1 , y el window 1 anterior ahora es window 2 .

Por lo tanto, hacer referencia a un objeto y almacenar referencias a ese objeto por su propiedad index es un método muy poco confiable, con la excepción de las referencias a front window o front tab donde solo importa que el objeto tenga 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 propiedad index es una propiedad con nombre para los objetos window , que se pueden leer y establecidos (configúrelo en 1 para ponerlo al frente). Aunque los objetos tab son referidos por una propiedad index , no es una propiedad con nombre que uno pueda leer o establecer.

  

❷ ・ Por id : por ejemplo, tab id 54 of window id 53

Esta es una propiedad única , fija asignada a cada objeto en el momento de su creación, y generalmente aumenta de valor a medida que cada nuevo objeto en una familia de similares Se crea objetos. Entonces, en términos generales , 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 puede almacenar objetos de forma confiable y segura para su uso posterior, sabiendo que seguirán haciendo referencia al mismo objeto exacto, independientemente de en qué lugar del script se evalúe la variable y cómo ha cambiado la disposición de los objetos (hasta que se destruye el objeto).

Configuración y obtención de la variable

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

cualquiera almacena su valor real de propiedad id , luego haga referencia al tab por su id más adelante, cuyo valor será el valor de la variable;

o puede almacenar todo el objeto en una variable de AppleScript. Esto es a menudo lo más fácil.

Por id

Para almacenar por id , puedes hacerlo así:

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

En Chrome , el active tab of the front window podría devolver tab id 34 of window id 2045 . El id de ese objeto tab es 34 , por lo que a T se le asigna el valor 34 .

Luego, más adelante, para realizar acciones en esa misma pestaña, que puede que ya no sea el active tab , puedes hacerlo de esta manera:

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

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

Tenga en cuenta que la referencia es a tab id T y not tab T , que sería tab 34 (es decir, index 34, si tuvieras 34 pestañas abiertas). Se incluirá la etiqueta id must .

Por objeto

Para almacenar el objeto tab , que a menudo es preferible, lo haces así:

    set T to the front tab of the front window

Aunque implícitamente he usado los valores de index aquí, AppleScript realmente hace referencia a tab y a window , tanto por sus valores de id (que lo hace en casi todas las situaciones). Así que si 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 objeto tab a una variable como esta:

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

y T contendrán tab id 30 of window id 2045 , a los que más tarde podrás llamar para realizar acciones dentro de / upon:

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

o

    tell T to close
    
respondido por el CJK 24.06.2018 - 19:22

Lea otras preguntas en las etiquetas