Safari AppleScript: no se pueden filtrar las pestañas de Windows inactivo

4

Tengo un poco de AppleScript que me frustra mucho. Necesito obtener una lista de todas las pestañas de Safari, luego filtrarlas. Esperaba que esto fuera muy simple. No lo es.

tell application "Safari"
    set tabSet to {}
    repeat with w in (get every window)
        repeat with t in (get every tab of w)
            set the end of tabSet to t
        end repeat
    end repeat
    --set tabSet to every tab of every window -- a one-liner here would be convenient

    set firstTab to first item of tabSet -- works, see edit
    set targetTab to first item of tabSet whose name is "Untitled" -- this fails
end tell

En primer lugar, every tab of every window devuelve una lista anidada de listas de pestañas (agrupadas por ventana) en lugar de solo una lista plana. Acabo de terminar con las repeticiones. (Si hay es una manera de hacer que esto sea de una sola línea, sería bueno). Pero hasta ahora, todo bien.

El resultado que estaba obteniendo de first item of tabSet me estaba desechando porque parecía que estaba devolviendo una forma de toda la lista:

item 1 of {tab 1 of window id 15557 of application "Safari", tab 2 of window id 15557 of application "Safari", tab 3 of window id 15557 of application "Safari", tab 4 of...

El problema real se produce en la línea de filtro donde trato de obtener el first item of tabSet whose name is "Untitled" . (Reemplazar con un nombre válido por supuesto). Entonces, me sale este error:

error "Safari got an error: Can’t get tab 1 of window id 15561 whose name = \"Untitled\". Invalid index." number -1719

EDIT 2:

He añadido el siguiente bloque:

repeat with t in tabSet
    set n to (get name of t)
    try
        set targetTab to (first item in tabSet whose name is n)
        set targetWindow to (first window whose tabs contains targetTab)
        log (get id of targetWindow) & (get name of t)
    on error
        log "ERROR: " & n
    end try
end repeat

Esto reveló que, una vez más, el problema no era lo que parecía, sino que era algo completamente diferente:

Solo se pueden filtrar las pestañas en la ventana frontal . Parece que la declaración first item of tabSet whose name is "Untitled" falla si la pestaña "Sin título" está en una ventana que no sea la ventana frontal.

¿Alguna idea?

    
pregunta Whimsical Seaplane 01.06.2018 - 22:04

1 respuesta

0

Así es como AppleScript se refiere a los elementos de las listas. No estás haciendo nada malo.

Cuando dices el "primer elemento" de una lista, obtienes el "elemento 1 de { alguna lista }", que es literalmente equivalente al primer elemento de la lista, como es de esperar. en otros idiomas.

Los 3 de estos son equivalentes y se refieren exactamente a la misma cosa, aunque se muestren de manera diferente.

tab 1 of window id 1
item 1 of {tab 1 of window id 1}
item 1 of {tab 1 of window id 1, tab 2 of …, …}

Puede obtener propiedades de este elemento como si nunca hubiera estado en una lista.

set targetName to name of targetTab -- gets the name of the tab

Puede ser confuso que venga de otros idiomas ver la lista completa que se muestra cuando solo desea un solo elemento, pero es probable que tenga un rendimiento, ya que no intenta extraer nada de la lista ni mostrar una representación diferente de el elemento solo porque no desea ver el resto de la lista en algún tipo de resultado.

    
respondido por el grg 01.06.2018 - 22:12

Lea otras preguntas en las etiquetas