2010-12-14 16 views
6

Es un juego de niños hacer esto en Safari, que tiene una buena compatibilidad con Applescript. El soporte AS de Google Chrome acaba de llegar, así que les doy el beneficio de la duda. Básicamente estoy tratando de tomar el HTML actual a través del portapapeles para poder obtener información. Tenemos algunos comandos útiles de esta manera:Obtenga la pestaña Fuente de la corriente en Google Chrome a través de Applescript

tell application "Google Chrome" 
view source of active tab of window 1 
save active tab of window 1 
print active tab of window 1 
reload active tab of window 1 
go back active tab of window 1 
go forward active tab of window 1 
copy selection of active tab of window 1 
paste selection active tab of window 1 
end tell 

pero por desgracia no se puede decir "set X to source of active tab of window 1". Alguien tiene alguna sugerencia para mi? Mis ideas actuales son cargar el código que necesito en segundo plano en Safari (bastante feo) o intentar mostrar el código fuente y tomarlo con el script UI, pero eso también es feo. También sigo encontrándome con errores de scripting que evitan que funcione.

Cualquier ayuda sería apreciada.

+0

Espere, Chrome tiene soporte AppleScript ahora? ¿Cuando pasó eso? ¡Increíble! –

Respuesta

-1

Al ver que el soporte AS de Chrome acaba de llegar, seguramente será "emocionante" de usar. Al probar algunos de los comandos que tienen disponibles en su diccionario, parece que todavía tienen algunos problemas para resolver. Hasta que Google exponga una forma en la API para obtener el código fuente más fácilmente (y/o solucione las fallas relacionadas), tendrá que usar una de las alternativas que menciona en su publicación.

+0

(Tengo un script que acciona el comando 'una y otra vez hasta que la pestaña en cuestión gira pero es lenta y muy poco elegante.) –

2

Estoy muy emocionado de saber que Chrome tiene soporte para AppleScript ahora. Es desafortunado que todavía sea mínimo, pero estoy seguro (¡espero!) Mejorará. Como no hay manera de conseguir la fuente directamente, me quedaría con la siguiente ruta hacker:

tell application "Google Chrome" 
    view source of active tab of window 1 -- Or whichever tab you want 
    delay 3 
    repeat while loading of active tab of window 1 
     delay 3 
    end repeat 
    select all of active tab of window 1 -- Must *always* be the active tab 
    copy selection of active tab of window 1 
    delete tab (active tab index of window 1) of window 1 
end tell 
delay 1 
return the clipboard 

Sí, es hacker, pero eso es inevitable, dado el estado actual del diccionario de scripting. El script debe ser sencillo: abra una pestaña de fuente, espere a que se cargue, seleccione el contenido, cópielo y cierre la pestaña. Puede jugar con delay 3 s para ver qué funciona mejor. Tenga en cuenta que el primeractive tab of window 1 es arbitrario, el resto se refiere explícitamente a la pestaña fuente. Además, aparentemente no hay forma de cerrar una pestaña desde el diccionario de scripting de Chrome (oy vey), así que tuve que usar JavaScript en su lugar. Además, el último delay 1no debería ser necesario, pero si no estuviera allí, mis pruebas a veces devolverían algo incorrecto, aunque el contenido del portapapeles fuera correcto cuando los pegué. Creo que es porque no había suficiente texto que tardó una cantidad notable de tiempo para actualizar el portapapeles.

Edición 1: que sustituyó execute the active tab of window 1 javascript "window.close()" con la línea delete tab, como se sugirió a mí. Desafortunadamente, delete tab active tab of window 1 no funciona, por lo que necesita esta construcción un poco más complicada.

+2

puede usar' eliminar pestaña 3'. El problema es la arquitectura multiproceso, el HTML está en el renderizador cuando el código AppleScript se ejecuta en el proceso del navegador. – shreyasva

+0

@ user265260: Ooh, lindo. ¡Gracias! Voy a editar eso en mi respuesta. Además, solo por curiosidad, ¿por qué esa característica de Chrome es la que causa problemas? (Si conoce la respuesta.) –

+1

'tell tab (índice de pestañas activas de la ventana 1) de la ventana 1 para eliminar' debería hacerlo. La cosa que está activa la pestaña devuelve un objeto de tipo pestaña, cerrar no es compatible con la pestaña ya que no tiene forma de saber a qué ventana pertenece (esta es la forma correcta ya que las pestañas pueden cambiar sus ventanas). – shreyasva

2
-- This script copies the HTML of a tab to a TextEdit document. 
tell application "Chromium" 
tell tab 1 of window 1 to view source 
repeat while (loading of tab 2 of window 1) 
end repeat 
tell tab 2 of window 1 to select all 
tell tab 2 of window 1 to copy selection 
end tell 

tell application "TextEdit" 
set text of document 1 to the clipboard 
end tell 

Explicación: La secuencia de comandos se coloca en un circuito cerrado esperando a que se cargue la pestaña, Luego solo copia el HTML en el portapapeles.

tell application "Google Chrome" 
    set t to active tab index of window 1 
    tell active tab of window 1 to view source 
    set t to t + 1 
    repeat while (loading of tab t of window 1) 
    end repeat 
    tell tab t of window 1 to select all 
    tell tab t of window 1 to copy selection 
    delete tab t of window 1 
end tell 

EDIT1: la secuencia de comandos debe hacer exaclt lo que quiere

+0

Gracias, eso es útil. Sigue haciendo algunas secuencias de comandos de IU pesadas, pero debido a que hay pequeños errores (cosas que aún no funcionan en Google Chrome) es difícil. Un problema que tengo es que necesito abrir una pestaña, obtener algunos datos de la página principal (es una URL bit.ly), luego cierre la pestaña que muestra la pestaña original. Por alguna razón con las secuencias de comandos UI, quiere volver a un lugar extraño, al final de las pestañas, creo. ¿Cómo puedo decir que la pestaña 154 de la ventana 1 se active? –

+0

'decir la aplicación" Google Chrome " \t establecer el índice de la pestaña activa de la ventana 1 a/* lo que quiera */ finalizar tell' – shreyasva

5

Desde Google Chrome soporta Javascript

--Applescript code 
tell active tab of window 1 
    set sourcehtml to execute javascript 
    document.getElementsByTagName('html')[0].innerHTML 
end tell 
+0

Esto me da ** Error de sintaxis ** * Se esperaba final de línea pero se encontró la propiedad. * –

+0

[Esta respuesta] (http://stackoverflow.com/a/32239972/130427) funciona. –

2

biblioteca de AppleScript de Chrome puede execute JavaScript.

Esto asignará el código fuente completo de la página para source y devolverlo

tell application "Google Chrome" 
    set source to execute front window's active tab javascript "document.documentElement.outerHTML" 
end tell 
Cuestiones relacionadas