1 votos

Safari - AppleScript no se desplaza a la siguiente sección de un libro en línea de bookdown

Estoy escribiendo un script para imprimir una sección de un bookdown libro en línea como PDF, luego pasar a la siguiente sección, y así sucesivamente.

La parte de impresión funciona (los códigos clave son de esta página):

tell application "Safari"

    activate

    tell application "System Events"
        key code 35 using command down -- activar elemento de menú imprimir
    end tell

    delay 0.5

    set i to 0
    repeat while i < 15
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 48 -- presionar tab 15 veces
        end tell
    end repeat

    tell application "System Events"
        key code 49 -- presionar espacio
    end tell

    set i to 0
    repeat while i < 2
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 125 -- presionar tecla abajo dos veces
        end tell
    end repeat

    tell application "System Events"
        key code 36 -- enter
    end tell

    set i to 0
    repeat while i < 16
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 125 -- presionar tab para llegar a "guardar"

    tell application "System Events"
        key code 36 -- enter para hacer clic en guardar

Problema

Ahora que he impreso la sección actual y estoy de vuelta en Safari, puedo hacer clic manualmente en la flecha derecha y pasar a la siguiente sección, pero no puedo lograr que el script lo haga.

He intentado agregar lo siguiente al script anterior:

tell application "System Events"
        key code 124 -- flecha derecha para ingresar a la siguiente página
    end tell

O incluso "reabrir" Safari, pero no sucede nada.

tell application "Safari"

    activate

    tell application "System Events"
        key code 124 -- flecha derecha para moverse a la siguiente sección
    end tell

¿Cómo puedo hacer que AppleScript "pase la página" y pase a la siguiente sección?

También agradezco sugerencias para mejorar el script. Me pregunto si sería fácil evitar repetir "tab" 15 veces. He mirado el Inspector de Accesibilidad y encontré que "PDF" en el menú de impresión corresponde a NSPopUpButtonCell. He intentado usar select NSPopUpButtonCell of its sheet pero no funcionó.

1voto

user3439894 Puntos 5883

Puedo hacer clic manualmente en la flecha derecha y moverme a la siguiente sección, pero no logro hacer que el script haga eso.

¿Cómo puedo hacer que AppleScript "pase la página" y se mueva a la siguiente sección?

Si estás intentando hacer clic programáticamente en la flecha derecha, como se muestra en la imagen a continuación, entonces el siguiente ejemplo de código de AppleScript puede hacer eso:

tell application "Safari" to ¬
    tell document 1 to ¬
        do JavaScript ¬
            "document.getElementsByClassName('fa fa-angle-right')[0].click();"

Notas:

Esto requiere que se marque Permitir JavaScript de Eventos Apple en el menú Desarrollar oculto.

Para mostrar el menú Desarrollar oculto:

  • Safari > Preferencias… > Avanzado > [√] Mostrar el menú Desarrollar en la barra de menú

enter image description here


Actualización para abordar:

También acepto sugerencias para mejorar el script! Me pregunto si sería fácil evitar repetir "tab" 15 veces.

Así es como usaría el JavaScript de arriba y codificado para evitar usar los comandos key code o keystroke de System Events, especialmente moviéndose por las pestañas alrededor de la UI.

Ejemplo de código AppleScript:

tell application "System Events"

    tell application process "Safari"

        set frontmost to true

        set i to 0
        repeat until (its frontmost = true)
            delay 0.1
            set i to i + 1
            if i ≥ 20 then return
        end repeat

        click menu item "Imprimir…" of ¬
            menú 1 de ¬
            menú barra ítem "Archivo" de ¬
            menú barra 1

        decir a su ventana principal

            set i to 0
            repeat until (existe botón menú "PDF" de hoja 1)
                delay 0.1
                set i to i + 1
                if i ≥ 20 then return
            end repeat

            hacer clic en el botón menú "PDF" de hoja 1

            set i to 0
            repeat until (existe botón menú "Guardar como PDF" de ¬
                menú 1 de menú botón "PDF" de hoja 1)
                delay 0.1
                set i to i + 1
                if i ≥ 20 then return
            end repeat

            hacer clic en el botón menú "Guardar como PDF" de ¬
                menú 1 de ¬
                menú botón "PDF" de ¬
                hoja 1

            set i to 0
            repeat until (existe botón "Guardar" de hoja 1 de hoja 1)
                delay 0.1
                set i to i + 1
                if i ≥ 20 then return
            end repeat

            hacer clic en el botón "Guardar" de hoja 1 de hoja 1

            set i to 0
            repeat mientras (existe hoja 1)
                delay 0.1
                set i to i + 1
                if i ≥ 100 then return
            end repeat

        terminar decir    
    terminar decir
decir aplicación "Safari" to ¬
    decir documento 1 to ¬
        hacer JavaScript ¬
            "document.getElementsByClassName('fa fa-angle-right')[0].click();"

Notas:

Dado que este tipo de script de AppleScript está utilizando Scripting de UI, he incluido un manejo de errores en forma de un repeat loop para esperar hasta dos segundos a que el elemento UI objetivo esté disponible para actuar para la mayoría de los objetivos, sin embargo, el último repeat loop espera más tiempo porque tiene que esperar a que el Guardar como PDF se complete. Se podría usar un simple delay con un valor apropiado en lugar de un repeat loop, pero con el delay incluido de una décima de segundo en los repeat loops no debería tener que esperar más tiempo del necesario. En otras palabras, solo usaría un simple delay si quiero ralentizar el script al pasar por los diferentes eventos de la UI. Es dudoso que sea necesario ajustarlo, pero obviamente hacerlo si es necesario.

Si se alcanza el tiempo de espera, el script se aborta en ese punto sin ningún mensaje de error. Las declaraciones de una sola línea if i ≥ 20 then return se pueden convertir en un bloque if completo e incluir un mensaje de error a través de display dialog, display alert o display notification como se desee.

0 votos

¡Funciona, muchas gracias! ¿Pero por qué no necesitas end tell al final?

1 votos

RE: "¿Pero por qué no necesitas el final tell al final?" - Porque no fue escrito en forma de una declaración de bloque tell pero como una declaración de una sola línea. tell declaración. Ten en cuenta que el caracter ¬ es un carácter de continuación de línea y se usa para mejorar la legibilidad (especialmente al publicar código aquí).

1 votos

@Emy, Por favor, revisa la actualización para la dirección: sección de mi respuesta actualizada, ya que aborda la primera oración del último párrafo de tu publicación original.

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