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
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 t
que se utiliza en realidad proviene del repeat with t in tabs of front window
ciclo, donde t
se asigna secuencialmente la referencia a cada tab
uno 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 repeat
ciclo en este controlador es cómo declaró una nueva variable i
para que sirviera como contador, luego incrementó manualmente su valor con cada iteración. En su lugar, puede definir i
dentro de la repeat
propia 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
Almacenar una referencia a un tab
owindow
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 id
propiedad de la pestaña. Debe tener cuidado aquí: hay dos formas de hacer referencia a Chrome tabs
y windows
usar números:
Tabs
/ Windows
por 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 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 cierra la mitad de tres pestañas, tab 3
se convierte en tab 2
.
Con la windows
colección, index
es 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 1
es 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 1
ahora es window 2
.
Por lo tanto, hacer referencia a un objeto y almacenar referencias a ese objeto por su index
propiedad 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 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 index
propiedad es una propiedad con nombre para window
los objetos, que se puede leer y configurar (configúrelo 1
para traerlo al frente). Aunque tab
una 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 2088
se creó después de window id 25
.
Es importante destacar que id
proporciona 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).
Cuando desee asignar una referencia a tab
o window
a una variable, puede optar por:
almacenar su id
valor de propiedad real, luego hacer referencia a él tab
más id
tarde, 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.
id
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 window
podría volver tab id 34 of window id 2045
. El id
de ese tab
objeto es 34
, por lo que 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 la active tab
, puedes hacerlo así:
tell tab id T of the front window to execute JavaScript...
(suponiendo que front window
todavía sea window id 2045
; de lo contrario, también tendrá que almacenar el window id
valor 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, index
34, si tuviera 34 pestañas abiertas). La id
etiqueta debe estar incluida.
Para almacenar el tab
objeto en sí, lo que a menudo es preferible, lo hace así:
set T to the front tab of the front window
Aunque he usado index
valores implícitamente aquí, AppleScript en realidad hace referencia a tab
ambos window
por sus id
valores (que lo hace en casi todas las situaciones). Entonces, 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 tab
objeto 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
, al que luego puede llamar para realizar acciones dentro/sobre:
set the URL of T to "https://stackexchange.com"
o
tell T to close
Kevin