1 votos

AppleScript: establecer la pestaña de Safari en un índice específico

Tengo un AppleScript que busca la pestaña y ejecuta un JS en la pestaña seleccionada, Es el trabajo debido a este :

set current tab of w to t
        set index of w to 1

pero me gustaría mejorar el código para poder referenciar la pestaña, por el momento como puedes ver sólo estoy refiriendo el ID de la ventana y está bien cuando sé el número de la pestaña pero ¿como puedo referirme también a la pestaña?

do JavaScript "document.getElementsByClassName('myJShere')[0].click();" in tab tab 1 of window id theWindowID

He intentado establecer theTabNumber como (id de t como cadena) pero eso no funciona

t en mi ejemplo actual, devuelve el elemento 3 de {pestaña 1 de la ventana id 6615 de la aplicación "Safari", pestaña 2 de la ventana id 6615 de la aplicación "Safari", pestaña 3 de la ventana id 6615 de la aplicación "Safari", pestaña 4 de la ventana id 6615 de la aplicación "Safari"}

Lo he intentado:

set theTabNumber to item 1 of t
return theTabNumber

pero esta vuelta

tab 3 of window id 6615 of application "Safari"

Supongo que podría utilizar la delimitación de texto, pero eso no parece correcto

full script

set theTABID to 0
set searchpat to "Facebook"

tell application "Safari"
    set winlist to every window
    set winmatchlist to {}
    set tabmatchlist to {}
    set tabnamematchlist to {}
    repeat with win in winlist
        set ok to true
        try
            set tablist to every tab of win
        on error errmsg
            --display dialog name of win as string
            set ok to false
        end try
        if ok then
            repeat with t in tablist
                if searchpat is in (name of t as string) then
                    set end of winmatchlist to win
                    set end of tabmatchlist to t
                    set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (name of t as string)
                    set theTABID to (id of win as string)
                    ##return (index of t as string)
                    --display dialog name of t as string
                else if searchpat is in (URL of t as string) then
                    set end of winmatchlist to win
                    set end of tabmatchlist to t
                    set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (URL of t as string)
                    --display dialog name of t as string
                end if
            end repeat
        end if
    end repeat

    set w to item 1 of winmatchlist
    set t to item 1 of tabmatchlist

    set current tab of w to t
    set index of w to 1

end tell

if theTABID = 0 then

    set searchpat to "Twitter"
    ##set searchpat to "Case Management"
    tell application "Safari"
        set winlist to every window
        set winmatchlist to {}
        set tabmatchlist to {}
        set tabnamematchlist to {}
        repeat with win in winlist
            set ok to true
            try
                set tablist to every tab of win
            on error errmsg
                --display dialog name of win as string
                set ok to false
            end try
            if ok then
                repeat with t in tablist
                    if searchpat is in (name of t as string) then
                        set end of winmatchlist to win
                        set end of tabmatchlist to t
                        set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (name of t as string)
                        set theTABID to (id of win as string)
                        ##return (index of t as string)
                        --display dialog name of t as string
                    else if searchpat is in (URL of t as string) then
                        set end of winmatchlist to win
                        set end of tabmatchlist to t
                        set end of tabnamematchlist to (id of win as string) & "." & 1 & ".  " & (URL of t as string)
                        --display dialog name of t as string
                    end if
                end repeat
            end if
        end repeat

        set w to item 1 of winmatchlist
        set t to item 1 of tabmatchlist

        set current tab of w to t
        set index of w to 1

    end tell
end if

tell application "Safari"
    do JavaScript "document.getElementsByClassName('a8c37x1j ni8dbmo4 stjgntxs l9j0dhe7 ltmttdrg g0qnabr5 ')[0].click();" in current tab of window id theTABID
end tell

1voto

user3439894 Puntos 5883

Si sólo está tratando de establecer el valor de la índice de pestañas de item 1 of t a un variable Entonces, ¿hay alguna razón por la que no se pueda usar simplemente set theTabNumber to index of item 1 of t en lugar de set theTabNumber to item 1 of t ? -- Esto código , set theTabNumber to index of item 1 of t devuelve un entero que representa el r/o índice de la ficha ordenados de izquierda a derecha en ese ventana .

Dicho esto, mirando el código en su OP, tal como está codificado, el do JavaScript ... comando se va a ejecutar independientemente del resultado de ambos cadenas de búsqueda Lo cual, por supuesto, no tiene ningún sentido.

Si está realizando pruebas para múltiples cadenas de búsqueda es más lógico ejecutar diferentes do JavaScript ... comandos basado en el resultados .

Dicho esto, como ejercicio (espero que no sea inútil) he decidido escribir un manipulador desde cero que hace lo siguiente:

  • Toma un cadena de búsqueda .
  • Busca en el nombre de cada ficha de cada ventana para el cadena de búsqueda .
  • Si el cadena de búsqueda no se encuentra en el nombre busca en el URL para ello.
  • Si el cadena de búsqueda se encuentra, trae el objetivo ficha y ventana al frente y devuelve un lista con el índice de pestañas y ID de ventana .
  • Si el cadena de búsqueda no se encuentra, devuelve un lista con valor que falta para cada artículo de la lista que puede ser utilizado como el bandera para ejecutar un cadena de búsqueda .

Para las pruebas, con múltiples Windows teniendo múltiples pestañas con al menos uno de ellos configurado como "https://www.facebook.com" o "https://twitter.com" en diferentes pruebas del ejemplo AppleScript código y no ha iniciado sesión en ninguno de los dos, buscará "Facebook" o "Twitter" para llevar su Windows al frente y ser el ficha actual para ejecutar un do JavaScript ... comando que hará clic en el Crear una nueva cuenta botón en Facebook o el Inscríbete botón en Twitter .

Nota: El código que trae el objetivo ventana al frente y fija el objetivo ficha a la ficha actual se puede comentar y utilizar lo que se devuelve de la manipulador para dirigirnos a la ficha por su índice y el ventana por su id para que se pueda hacer en segundo plano si se quiere.

Ejemplo AppleScript código :

findTabContainingSearchString("Facebook")
if result does not contain missing value then
    tell application "Safari" to tell document 1 to do JavaScript ¬
        "document.getElementsByClassName('_42ft _4jy0 _6lti _4jy6 _4jy2 selected _51sy')[0].click();"
else
    findTabContainingSearchString("Twitter")
    if result does not contain missing value then
        tell application "Safari" to tell document 1 to do JavaScript ¬
            "document.getElementsByClassName('css-901oao r-1awozwy r-jwli3a r-6koalj r-18u37iz r-16y2uox r-1qd0xha r-a023e6 r-vw2c0b r-1777fci r-eljoum r-dnmrzs r-bcqeeo r-q4m81j r-qvutc0')[0].click();"
    end if
end if

on findTabContainingSearchString(searchString)
    tell application "Safari"
        set tabIndex to missing value
        set winID to missing value
        set winList to windows
        repeat with w in winList
            set tabList to (tabs of w whose name contains searchString)
            try
                set tabIndex to (get index of first item of tabList)
            end try
            if tabIndex is not missing value then
                set winID to id of w
                exit repeat
            else
                set tabList to (tabs of w whose URL contains searchString)
                try
                    set tabIndex to (get index of first item of tabList)
                end try
                if tabIndex is not missing value then
                    set winID to id of w
                    exit repeat
                end if
            end if
        end repeat
        if winID is not missing value then
            set current tab of window id winID to tab tabIndex of window id winID
            set index of window id winID to 1
        end if
        return tabIndex & winID
    end tell
end findTabContainingSearchString

Métodos alternativos

Si ha comentado el if winID is not missing value then bloque en el manipulador para ejecutar el do JavaScript ... comando en el fondo, cambiar:

tell application "Safari" to tell document 1 to do JavaScript ¬

Para:

set {tabIndex, winID} to result
tell application "Safari" to tell tab tabIndex of window id winID to do JavaScript ¬

O utilizar un enfoque aún más diferente:

set {tabIndex, winID} to findTabContainingSearchString("Facebook")
if {tabIndex, winID} does not contain missing value then
tell application "Safari" to tell tab tabIndex of window id winID to do JavaScript ¬

0 votos

Gracias, eso es genial, sólo me pregunto, si quiero hacer JavaScript dentro de todas las pestañas coincidentes, ¿sólo tengo que cambiar "primer elemento" y añadir una declaración de repetición aquí: try set tabIndex to (get index of first item of tabList) end try

0 votos

@Kevin, en tu OP, tal y como está codificado, no estabas actuando sobre múltiples pestañas que contiene el mismo cadena de búsqueda si se encuentra más de una, sólo se actúa sobre la primera ficha devuelto. El manipulador que escribí hace lo mismo. Dicho esto, cualquier código puede ser modificado para hacer algo diferente, aunque depende de lo que uno esté tratando de hacer en cuanto a la facilidad de la código puede ser modificado. Te sugiero que intentes modificarlo para adaptarlo a una necesidad diferente a la tuya y si te quedas atascado en alguna parte, publica otra pregunta. Gracias.

0 votos

@Kevin, En otras palabras creo que esta respuesta cubre lo que estabas haciendo y cualquier cosa diferente debería ser una pregunta diferente para no enturbiar lo que ya se ha presentado. Este sitio funciona mejor con una pregunta por pregunta. Estaré más que feliz de ayudar en lo que pueda si terminas publicando otra pregunta para cubrir algo explícitamente diferente a lo que se preguntó en tu OP aquí.

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