4 votos

Ayuda de AppleScript: Esperar a que se cargue la página de Safari

Estoy tratando de crear un script para abrir la URL csbsju.instructure.com en Safari, esperar a que la página se cargue por completo, hacer clic en el botón de inicio de sesión, y luego volver a comprobar si la URL es correcta (hay un error que añade dashboard-sidebar, por lo que sólo estoy comprobando la URL y si es incorrecta, redirigir la página. La escritura de las credenciales es manejada por la cosa de la contraseña de iCloud de Safari, así que no necesito preocuparme por eso. El gran problema que tengo es la parte de la espera hasta que se cargue la página. He estado buscando, y actualmente estoy tratando de usar este código, aunque no funciona:

tell application "Safari"
    activate
    delay 1
    repeat
        if (do JavaScript "document.readyState" in document 1) is "complete" then exit repeat
        delay 1
    end repeat
    delay 1
end tell

Actualmente estoy usando este script para pulsar el botón de inicio de sesión y comprobar si la URL es correcta:

tell application "Safari"
    set theURL to URL of front document

    tell front document
        do JavaScript "document.getElementById('btnLogin').click()"
    end tell

    set theURL to URL of front document
    if (theURL = "https://csbsju.instructure.com/dashboard-sidebar") then
        tell application "Safari" to set the URL of the front document to "https://csbsju.instructure.com"
    end if
end tell

¿Alguna sugerencia para que esto funcione mejor? ¿Específicamente la parte de comprobar si la página está cargada?

4voto

qarma Puntos 71

Hay algunos métodos que puede utilizar para comprobar si la página ha terminado de cargarse. Aquí hay una selección con la que he tenido buenos resultados durante las pruebas:

Nombre del documento

Vigilar la existencia de la Safari document que tiene el mismo nombre que el título de la página web, que (creo) sólo se asigna después de que la página haya terminado de cargarse, hasta ese momento conserva el nombre que tenía anteriormente, o "Sin título" si se trata de un documento recién creado:

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    repeat until the document named ("Central Authentication Service " & ¬
        "| College of Saint Benedict & Saint John's University") exists
    end repeat

    log "Finished loading"
end tell

El Inicio de sesión botón

Vigilar la existencia de la "Login" dado que no puede hacer lo que necesita hasta que se haya creado ese elemento HTML en particular:

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    tell front document to repeat until (do JavaScript ¬
        "document.getElementById('btnLogin').id") as text is not ""
    end repeat

    log "Finished loading"
end tell

Safari 's Recarga botón

Controlar las propiedades particulares de Safari 's Recarga que cambia en función de si una página es cargando o tiene cargado :

Nota: Esto fue escrito y probado bajo MacOS High Sierra; sin embargo, para MacOS Mojave se requiere una edición menor. Cambiar UI element 1 to ¬ a UI element 2 to ¬ en el código que aparece a continuación.

tell application "Safari" to ¬
    make new document with properties {URL:"https://csbsju.instructure.com"}

tell ¬
    application "System Events" to tell ¬
    process "Safari" to tell ¬
    window 1 to tell ¬
    toolbar 1 to tell ¬
    groups to tell ¬
    UI element 1 to ¬
    set reload_button to a reference to ¬
        (first button whose name is "Reload this page")

using terms from application "System Events"
    repeat until the accessibility description ¬
        of the reload_button ¬
        contains "Reload this page"
    end repeat
end using terms from

log "Finished loading"

Contenido de la página

Supervise la aparición de un texto específico dentro del contenido de la página. En este caso, he optado por monitorizarlo todo, pero puedes elegir elementos más pequeños en su lugar. Los elementos que aparecen hacia el final de la página son los más adecuados:

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    ignoring white space
        tell front document to repeat until its text contains ¬
            "Central Authentication Service Network Username: " & ¬
            "Password: Warn me before logging me into other sites. " & ¬
            "Copyright © 2017 - All Rights Reserved College of Saint " & ¬
            "Benedict and Saint John's University"
        end repeat
    end ignoring

    log "Finished loading"
end tell

Nombre de usuario & Contraseña campos

Dado que estos campos son rellenados automáticamente por Safari que sólo se produce cuando la página se ha cargado por completo, se puede controlar el contenido de texto del Nombre de usuario y Contraseña campos:

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    tell front document to repeat
        set a to (do JavaScript "document.getElementById('username').value") as text
        set b to (do JavaScript "document.getElementById('password').value") as text

        if length of (a & b) ≠ 0 then exit repeat
    end repeat

    log "Finished loading"
end tell

0 votos

Has cubierto las bases muy bien, he utilizado tanto el botón de inicio de sesión como el de recarga en algunos de mis scripts y encuentro esos métodos bastante sólidos para mi uso. Yo sugeriría añadir un delay comando dentro del repeat bucles . Sin esto, se pueden hacer cientos de llamadas innecesarias, desperdiciando ciclos de la CPU y haciendo que los ventiladores giren, mientras que el uso de un retardo puede reducirlo a unas pocas llamadas. El código del botón de recarga se repite 295 veces como está escrito, y 5 veces con un delay 1 añadido. Por supuesto, esto variará considerablemente en función de la carga global del sistema, de la velocidad del mismo y de la velocidad de la conexión.

0 votos

@user3439894 Sí, tienes razón y soy consciente de ello. Creo que aún no he encontrado mi punto de vista con respecto a expresar un descargo de responsabilidad de que se trata de scripts para demostrar un método. Me he dado cuenta de que siempre describes tus contribuciones como ejemplo scripts y tener una adición sólida que indique que gestión de errores y retrasos puede ser necesario a criterio del usuario, etc. Tengo que ser más coherente para hacer lo mismo.

1 votos

CJK, he editado tu respuesta, añadiendo una nota en la sección "Botón de recarga de Safari" para su uso en MacOS Mojave.

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