0 votos

¿Cómo convierto el nombre de una página específica del navegador en sólo "esta página"?

Con la cantidad de spam que la red Stack Exchange ha estado viendo recientemente, decidí reducir el número de clics que necesito para marcar estos mensajes, mediante el uso de una acción 'Watch Me Do' en Automator.
Clic, clic, clic, hace una grabación, que luego quería simplemente reproducir cada vez que quería levantar una bandera.
No funciona.

Nunca había utilizado "Watch me do", así que tuve que investigar un poco para averiguar cómo podía examinar lo que había grabado. Ahora lo tengo como Applescript.
Extracto, muy abreviado a sólo la llamada pertinente
¬ nuevas líneas añadidas para facilitar la lectura aquí, sin dejar de ser capaz de copiar / pegar a script Editor.

-- Click the “Flag” button.

    set uiScript to "click UI Element \"Flag\" of group 7 of group 8 of ¬ 
        UI Element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of ¬ 
        splitter group 1 of window \"Long long spammy page name\" ¬ 
        of application process \"Safari\""

Por lo tanto, parece que ha registrado el título exacto de la página, lo cual es completamente inútil. Ni siquiera puedo probar que funciona en la misma página, porque no puedo repetir la acción de marcar.

Lo que tengo que averiguar es cómo genérico que uiScript para que sólo sea "mi ventana actual".
Tuve la ingenua idea de que tal vez podría cambiar la referencia a window 1 pero eso no funcionó y mi limitado talento se agotó en ese momento.

¿Existe un sustituto sencillo de "esta ventana"?

1voto

Mockman Puntos 16

Este es un script preliminar. Usando la función click facilitará la especificación del elemento ui en cuestión. Utilice comando-Mayúsculas-4 para obtener el punto de mira con las coordenadas de píxeles mientras pasa el ratón por encima del elemento deseado. En mi caso, es x=375, y=385.

tell application "Safari"
    activate
    delay 0.4
    tell application "System Events" to tell application process "Safari"

        set bf to click at {375, 385} -- or wherever the `flag` 'button' is on your screen
        --> button "Flag" of group 12 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window "applescript - How do I convert a specific browser page name to just be \"this page\"? - Ask Different" of application process "Safari" of application "System Events"

    end tell
end tell

Ahora que conoces el especificador, puedes agilizar el script.

tell application "Safari"
    activate
    delay 0.4
    tell application "System Events" to tell application process "Safari"

        -- since you are inside a tell block, strip out extraneous
        set bf to button "Flag" of group 12 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1
        click bf
    end tell
end tell

En estas páginas, grupos son varios fragmentos de la página.

Si hace algo así y recorre algunos de los grupos, verá el patrón:

        set g8 to group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of front window
        UI elements of group 5 of g8
        --> {static text "So, it seems it has recorded the exact page title, which is completely useless. I can't even test it works on the same page, because I can't repeat the flagging action." of group 5 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window "applescript - How do I convert a specific browser page name to just be \"this page\"? - Ask Different" of application process "Safari" of application "System Events"}

Como puede ver, grupo 5 especifica el párrafo que comienza con "Así pues, parece ". *El grupo 6 se refiere al párrafo siguiente. Para mí, grupo 12 es el flag botón.

set g8 to group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of front window
set bflag to UI elements of group 12 of g8 whose title is "Flag"
--> {button "Flag" of group 12 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window "applescript - How do I convert a specific browser page name to just be \"this page\"? - Ask Different" of application process "Safari" of application "System Events"}
properties of item 1 of bflag

Aquí están las propiedades. Las he movido fuera del bloque de código para facilitar el formateo. Tenga en cuenta que he utilizado item 1 of anterior porque el resultado de la línea anterior era una lista.

--> {valor mínimo:valor missing, orientación:valor missing, posición:{365, 458}, clase:botón, descripción papel: "botón", accesibilidad descripción:"", enfocado:false, título: "Bandera", tamaño:{27, 18}, valor:valor missing, ayuda: "Marcar este post para problemas serios o atención del moderador", activado:true, valor máximo:valor missing, papel: "AXButton", contenido completo:{}, subpapel:valor missing, seleccionado:false, nombre: "Bandera", descripción:""}

1voto

wch1zpink Puntos 11

Observando la muestra AppleScript el código que has proporcionado...

-- Haga clic en el botón "Bandera".

set uiScript to "click UI Element \"Flag\" of group 7 of group 8 of ¬ 
    UI Element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of ¬ 
    splitter group 1 of window \"Long long spammy page name\" ¬ 
    of application process \"Safari\""

Me di cuenta de que aquí no había suficiente para identificar cuál era el problema. Yo también he utilizado Automatismos "Mírame hacer" luego copió esos pasos grabados en script Editor.app .

Utilicé Automatismos "Mírame hacer" para generar un AppleScript que haga clic en el botón "Bandera". Luego pegué la "acción grabada" (el siguiente código) en script Editor.app .

-- Click the “Flag” button.
delay 4.881676
set timeoutSeconds to 2.0
set uiScript to "click UI Element \"Flag\" of group 12 of group 9 of UI Element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1 of application process \"Safari\""
my doWithTimeout(uiScript, timeoutSeconds)

on doWithTimeout(uiScript, timeoutSeconds)
    set endDate to (current date) + timeoutSeconds
    repeat
        try
            run script "tell application \"System Events\"\n" & uiScript & "\nend tell"
            exit repeat
        on error errorMessage
            if ((current date) > endDate) then
                error "Can not " & uiScript
            end if
        end try
    end repeat
end doWithTimeout

El problema es que el código anterior es prolijo y no es fácil de entender. Pero si lo analizamos con detenimiento, podemos ver que, en cierto sentido, se puede reducir.

El siguiente código es mi versión de reescribir el código creado por Automatismos "Mírame hacer" .


tell application "System Events"
    tell application process "Safari"
        click UI element "Flag" of group 12 of group 9 of ¬
            UI element 1 of scroll area 1 of group 1 of group 1 ¬
            of tab group 1 of splitter group 1 of window 1
    end tell
end tell

Por lo tanto, parece que ha registrado el título exacto de la página, que es completamente inútil. Ni siquiera puedo probar que funciona en la misma página, porque no puedo repetir la acción de marcar.

Lo que necesito averiguar es cómo genericizar esa llamada uiScript a sólo sea "mi ventana actual". Tuve la ingenua idea de que tal vez podría cambiar la referencia a la ventana 1, pero que no funcionó y mi talento limitado corrió en ese punto.

¿Existe un sustituto sencillo de "esta ventana"?

Después de repetidas pruebas de mi versión de cómo intentaba hacer clic en el botón "Bandera", pronto me di cuenta de que el problema no era con la "ventana 1", pero que 1 o más de los números de elemento se cambian (grupo 7) puede ser ahora (grupo 8) ... por ejemplo.

Por ahora, sin embargo, no necesitará usar el código anterior para hacer clic en el botón "Bandera" porque ya le proporcioné una opción alternativa que debería funcionar siempre para eso... Con el siguiente código.


En Safari seleccione "Permitir JavaScript desde eventos de Apple" en el menú Desarrollador.

Lo siguiente AppleScript debería funcionarte.

clickFlag(0) -- 0 = 1st Flag button, 1 = 2nd Flag button, etc.

on clickFlag(theNumber)
    tell application "Safari"
        do JavaScript "document.getElementsByClassName" & ¬
            "('js-flag-post-link s-btn s-btn__link js-gps-track')[" & ¬
            theNumber & "].click();" in document 1
    end tell
end clickFlag

Lo bueno del método anterior es que Safari ni siquiera necesita ser la aplicación principal y el código funcionará en la pestaña visible en ese momento.


Yendo un paso más allá, lo siguiente AppleScript el código hará clic en el primer botón "Marcar" de la página y, a continuación, intentará hacer clic en la opción "Spam".

NOTA: El siguiente código AppleScript sólo está pensado para el primer mensaje de cualquier tema.

clickFlag(0) -- Clicks the "Flag" button

tell application "System Events"
    tell application process "Safari"
        set frontmost to true
        repeat until frontmost
            delay 0.1
        end repeat
        repeat until UI element 1 of scroll area 1 of group 1 of group 1 of ¬
            tab group 1 of splitter group 1 of window 1 exists
            delay 0.1
        end repeat
        delay 0.1 -- can probably be removed
        try
            click radio button 1 of group 1 of group 1 of group 2 of group 13 ¬
                of group 9 of UI element 1 of scroll area 1 of group 1 of ¬
                group 1 of tab group 1 of splitter group 1 of window 1
        on error from offendingObject
            log offendingObject
            repeat with i from 1 to 20
                try
                    click radio button 1 of group 1 of group 1 of ¬
                        group 2 of group i of group 9 of UI element 1 ¬
                        of scroll area 1 of group 1 of group 1 of ¬
                        tab group 1 of splitter group 1 of window 1
                    exit repeat
                on error from offendingObject
                    try
                        click radio button 1 of group 1 of group 1 of group 2 ¬
                            of group i of group 8 of UI element 1 of ¬
                            scroll area 1 of group 1 of group 1 of ¬
                            tab group 1 of splitter group 1 of window 1
                        exit repeat
                    end try
                end try
            end repeat
        end try
    end tell
end tell

on clickFlag(theNumber)
    tell application "Safari"
        do JavaScript "document.getElementsByClassName" & ¬
            "('js-flag-post-link s-btn s-btn__link js-gps-track')[" & ¬
            theNumber & "].click();" in document 1
    end tell
end clickFlag

Si miras mi on error from offendingObject anterior, utilizo el comando on error from que registrará el elemento real que desencadena el error. Por ejemplo, el resultado del registro de errores puede ser algo como (*group 2 of group 13 of group 9 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1 of application process Safari*) . Lo que esto nos está diciendo es que el "grupo 2" provocó el error. Aunque esto es cierto, el problema real está en el segundo elemento "grupo 13". No hay grupo 2 porque no hay grupo 13. Resumiendo, el problema es casi siempre el segundo elemento del registro de errores. Por eso uso los comandos de repetición... Intenta grupo 1, luego grupo 2, etc ... Todo el camino hasta el grupo 20 hasta que encuentre el valor correcto.


Este siguiente .GIF demuestra el uso del código directamente arriba, en 4 pestañas diferentes en 1 ventana de Safari. He probado el código con éxito en 2 macs diferentes con 2 versiones diferentes de MacOS y 2 versiones diferentes de Safari. Lo que hace es hacer clic en el botón "Bandera", a continuación, seleccione "Spam". He omitido los comandos para pulsar automáticamente el botón "Marcar pregunta" para que el código se pueda utilizar con fines de prueba en el primer mensaje de cualquier tema. Puedo añadir esos comandos más adelante. Haciendo eso se automatizaría todo el proceso.

enter image description here

0voto

Tetsujin Puntos 23061

Sólo para cerrar el círculo en esto, siguiendo el duro trabajo de wch1zpink, esto es lo que finalmente funcionó. No estoy seguro de cómo, pero lo hace y eso es lo suficientemente bueno para mí ;)

clickFlag(0) -- Clicks the "Flag" button

tell application "System Events"
    tell application process "Safari"
        set frontmost to true
        repeat until frontmost
            delay 0.1
        end repeat
        repeat until UI element 1 of scroll area 1 of group 1 of group 1 of ¬
            tab group 1 of splitter group 1 of window 1 exists
            delay 0.1
        end repeat
        delay 0.1 -- can probably be removed
        try         
            --on error from offendingObject
            --log offendingObject
            --repeat with i from 1 to 20
            try
                click static text 1 of group 1 of group 1 of group 1 of group 2 of group 8 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1

                --exit repeat
                --on error from offendingObject
                try
                    click UI element "Flag question" of group 8 of group 8 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1
                    --exit repeat
                end try
            end try
            --end repeat
        end try
    end tell
end tell

on clickFlag(theNumber)
    tell application "Safari"
        do JavaScript "document.getElementsByClassName" & ¬
            "('js-flag-post-link s-btn s-btn__link js-gps-track')[" & ¬
            theNumber & "].click();" in document 1
    end tell
end clickFlag

Había que saltar un aro más. Guardar esto como un Servicio [Acción Rápida] significaba que Gatekeeper lo bloquearía y no permitiría que se ejecutara.

La solución era guardar el script como una aplicación, y luego lanzar la propia aplicación desde automator, como un Servicio. Un poco grumoso, pero funciona.

Descubierto a partir de Stack Overflow - com.automator.runner.xpc no tiene acceso asistivo - no se puede hacer clic al ejecutar una acción rápida

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