Secuencias de comandos GUI para Linux

Efectivamente, estoy buscando un clon de AutoIt para Linux.

Conozco herramientas como Sikuli , Javaauto , etc., pero simplemente no funcionan, porque dependen de las coordenadas x, y y, por ejemplo, no pueden encontrar una ventana o elemento de menú según el texto del título.

Quiero algo que pueda encontrar en la ventana según su título, o que pueda hacer clic en el botón con la etiqueta 'Aceptar'.

Busqué en Google y revisé esta pregunta de SuperUser y esta pregunta So de cinco años , de la cual ahora procederé a copiar descaradamente partes grandes, ya que el OP @Xeddy hizo un buen trabajo al establecer los requisitos.

Aquí hay un script de muestra simple:

Run("notepad.exe")
WinWaitActive("Untitled - Notepad")
Send("This is some text.")
WinClose("Untitled - Notepad")
WinWaitActive("Notepad", "Save")
Send("!n") 

Ejecute el script y verá que se abre el Bloc de notas, aparece un texto y luego se cierra.

Ahora, el ejemplo anterior, aunque un poco inútil, es una demostración del tipo de funcionalidad y simplicidad que estoy buscando. Aquí hay una explicación para aquellos que no hablan AutoIt:

----Comienzo de la Explicación del Código ----

Asks user to input some text and stores it in varInput
Runs notepad.exe
Waits till window exists and is active
Sends the contents of varInput as a series of keystrokes
Sends keystrokes to go to File -> Exit
Waits till the "Save" window is active
Sends some more keystrokes

Shows a Message Box with some text and the contents of a variable

Registers a hotkey, Win+N, which when pressed executes notepad.exe

----Fin de la explicación----

Entonces, como puede comprender, las características son bastante obvias: la capacidad de simular fácilmente las funciones del teclado y el mouse, leer la entrada, procesar y mostrar la salida, ejecutar programas, manipular ventanas, registrar teclas de acceso rápido, etc. corchetes innecesarios, declaraciones de clase, etc. En resumen: simple.

Quizás lo mejor de AutoIt, de lo que parecen carecer todos los demás, es que no se basa en las coordenadas x, y: uno puede buscar una ventana por título (incluso esperar a que aparezca).

Plus AutoIt utiliza un lenguaje de secuencias de comandos básico, con conceptos de programación normales como declaraciones IF, bucles, etc.

¿Hay algo tan poderoso para Linux?

Amplíe un poco sobre por qué Sikuli y javaauto no son suficientes, para ayudar a las personas a comprender sus requisitos.
No puedo ver cómo reformularlo. Los inconvenientes de otros son 1) la dependencia de las coordenadas x, y y 2) la incapacidad de encontrar una ventana o elemento de menú en función de su texto de título
Por desgracia, eso también depende de las coordenadas X, Y. no puedo decírseloclick the button labelled OK
¿Te refieres a controlar X windows, aplicaciones de Wine (como el Bloc de notas en Linux) o en un administrador de ventanas específico (como KDE, GNOME)?

Respuestas (2)

En Linux, puede usar scripts de shell (como Bash ) junto con las herramientas de línea de comandos relevantes que se describen a continuación.

xdotool

Esta es una herramienta de línea de comandos para falsificar entradas desde el mouse y el teclado. También es compatible con las acciones del administrador de ventanas, como mover, activar y otras acciones en las ventanas.

Página de inicio: jordansissel/xdotool en GitHub

Instalar a través de:sudo apt-get install xdotool

Ejemplo de guión de muestra:

WID=$(xdotool search --name "Some Window Title")
xdotool key --window $WID --delay 500 space Tab Return Tab space Alt+n

Relacionado: ¿Cómo controlar programáticamente las aplicaciones reenviadas X11?


X útiles

Hay herramientas similares a comandos para administrar ventanas y mostrar aplicaciones X como xwininfo, xdpyinfoy xpropotras (consulte manpara obtener más detalles). Junto con los ya mencionados xdotool, se pueden usar como parte del script de shell para automatizar y controlar las ventanas X.


expect

Hay una expectlínea de comando y se usa para controlar procesos de terminal. Entonces, si su aplicación GUI puede ser controlada por la línea de comandos y devolver algún resultado, esta es la herramienta que puede usar.

Por ejemplo, puede usar mezclarlo con xdotool:

#!/usr/bin/expect
set timeout 360
spawn some_GUI_command & # Replace with your command.
WID=$(xdotool search --name "My GUI Title")
xdotool set_window --overrideredirect 1 $WID windowunmap $WID windowmap $WID
xdotool windowsize $WID 10 100%
xdotool behave $WID mouse-enter windowfocus windowsize --usehints 80 100% &
xdotool behave $WID mouse-leave windowsize 4 100% &
xwininfo -id $WID -tree
expect "Setup" { xdotool key --window $WID --delay 500 Tab Return }

Nota: Lo anterior es solo un ejemplo de pseudocódigo, no he probado el código anterior. Solo se usa como referencia.


AutoHotkey (AHK)

Para controlar aplicaciones de Windows en Linux, como notepad.exe, puede usar AutoHotkey (AHK) en Linux ejecutándolo en Wine. Así es como winetricksse usa en Linux (ver w_ahk_do()ensrc/winetricks ), por ej.

wine AutoHotkey.exe script.ahk

AutoHotkey es compatible con el lenguaje de secuencias de comandos y es una herramienta poderosa muy subestimada. Para ver algunos ejemplos de código, consulte Stack Overflow .


autoit

Al igual que arriba, puede ejecutar AutoIt en Wine .

El AutoIt Editor SciTE 3.3.0 funciona perfectamente. Es posible escribir programas, construirlos o compilarlos. No intenté pasarlos por el interior del vino, ya que parece una tontería. Au3Check.exe, Au3Info.exe, AutoIt3.exe se inician sin problemas.


Ver también: Comparación de herramientas de prueba de GUI en Wikipedia

Para algunas bibliotecas de automatización de Python, consulte:

Falta en la lista de herramientas la herramienta UI Vision.

Quizás lo mejor de AutoIt, de lo que parecen carecer todos los demás, es que no se basa en las coordenadas x, y: uno puede buscar una ventana por título (incluso esperar a que aparezca).

Sikuli y UI Vision pueden hacerlo con OCR incorporado

No es exactamente lo que esperaba, pero muy cerca. Excelentes recomendaciones, que ayudarán a otros. Bienvenido a bordo