Página 1 de 1
Problemas con ControlClick
Publicado: 09 Mar 2012, 06:05
por avechuche
Bueno resulta que quiero hacer una instalación desatendida de VS2010.
En el momento que me aparece el cartelito con los botones "Reintentar" y "Cancelar" quiero que el scrip reemplaze el archivo "deffactory.dat" y haga clic en "Reintentar", probe de todo, pero nada que pueda hacer clic en "Reintentar".
Como pueden ver en la imágen, puedo tomar el texto que esta en "Static1", lo uso para saber el nombre de la carpeta temporal de la instalacion para asi reemplazar el archivo ".dat". hasta ahi perfecto, el problema es cuando quiero hacer clic en reintentar.
Probe con ControlClick, ControlSend, Send, nada
Tmb probe con mover el mouse hacia el boton, pero antes de eso tengo que usar "WinActivate" para activar la ventana y asi mover el mouse, que pasa? si uso WinActivate, no me mueve el mouse
.
Ninguno de los dos ControlClick q estan en el code funcionan.
Código: Seleccionar todo
If WinWait("Instalación de Microsoft Visual Studio 2010 Ultimate", "", 120) Then
$Var = ControlGetText("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Static1")
$Var = StringRegExp($Var, "Temp\\(.*.tmp)", 1)
FileCopy(@ScriptDir & "\deffactory.dat", @TempDir & "\" & $Var[0] & "\DefFactory.dat", 1)
ControlClick("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Button1")
EndIf
WinWait("Microsoft Visual Studio 2010 Ultimate", "Carga completada. Haga clic en Siguiente para continuar.")
ControlClick("Microsoft Visual Studio 2010 Ultimate", "Carga completada. Haga clic en Siguiente para continuar.", "Button2")
Alguno tiene otra forma de poder hacer clic?
Re: Problemas con ControlClick
Publicado: 09 Mar 2012, 09:43
por Ximorro
Pero es que en esa ventana donde quieres pulsar no pone lo de "Carga completada...", ahí pone "No se puede abrir el archivo de datos". ¿No deberías buscar eso?
A perdón ¿eso es lo que sale después, no?
¿Siendo que la ventana está activa? ¿qué Sends has intentado? ¿has probado a enviar un ENTER o un Alt+S?
Send("{ENTER}") o Send("!s")
O quizás con ControlSend...
Igual es porque la ventana es un poco especial, prueba a identificarla con la clase #32770 (y quizás el texto, para distinguirla de otros MsgBox que puedan salir).
Yo también creo que con el título debería ser suficiente, si no hay otra con ese titulo, pero en fin...
ControlClick("[CLASS:#32770]", ...)
O incluso con clase y título, para asegurarse:
ControlClick("[CLASS:#32770;TITLE:Instalación de]", ...)
Re: Problemas con ControlClick
Publicado: 09 Mar 2012, 09:54
por avechuche
Ximorro escribió:Pero es que en esa ventana donde quieres pulsar no pone lo de "Carga completada...", ahí pone "No se puede abrir el archivo de datos". ¿No deberías buscar eso?
A perdón ¿eso es lo que sale después, no?
¿Siendo que la ventana está activa? ¿qué Sends has intentado? ¿has probado a enviar un ENTER o un Alt+S?
Send("{ENTER}") o Send("!s")
O quizás con ControlSend...
Igual es porque la ventana es un poco especial, prueba a identificarla con la clase #32770 (y quizás el texto, para distinguirla de otros MsgBox que puedan salir).
Yo también creo que con el título debería ser suficiente, si no hay otra con ese titulo, pero en fin...
ControlClick("[CLASS:#32770]", ...)
O incluso con clase y título, para asegurarse:
ControlClick("[CLASS:#32770;TITLE:Instalación de]", ...)
Nada de nada. Ya probe con todo, no queda mas nada por hacer, pero que cosa más extraña ...
Re: Problemas con ControlClick
Publicado: 12 Mar 2012, 09:06
por Ximorro
¡Pero qué rarooooooooooo!
¿Y no será que sale dos veces? Igual sale y sí le da al botón, pero podría ser que es demasiado rápido y el archivo aún no ha sido copiado, entonces vuelve a sacar el mensaje de que no lo encuentra...
Pon un Sleep generoso después del FileCopy, otra cosa no se me ocurre yo creo que la ventana está bien identificada...
Re: Problemas con ControlClick
Publicado: 12 Mar 2012, 23:48
por avechuche
Re: Problemas con ControlClick
Publicado: 13 Mar 2012, 09:26
por Ximorro
¿Y poner un
WinActivate antes del clic? En la ayuda dice que algunos botones se resisten al clickeo si la ventana no está activa.
Justo antes del clic, no al principio, por si estaba activa pero a mitad de proceso algo la ha desactivado.
Otra que se me ocurre es tomar el handle de la ventana y usar siempre eso, en vez de buscarla cada vez.
Algo así:
(EDIT: por si has llegado a ver lo de antes, lo he cambiado: ahora WinWait devuelve el handle, así que no hay que tomarlo con WinGetHandle)
Código: Seleccionar todo
$wHnd = WinWait("Instalación de Microsoft Visual Studio 2010 Ultimate", "", 120)
If $wHnd Then
$Var = ControlGetText($wHnd, "", "Static1")
$Var = StringRegExp($Var, "Temp\\(.*\.tmp)", 1)
FileCopy(@ScriptDir & "\deffactory.dat", @TempDir & "\" & $Var[0] & "\DefFactory.dat", 1)
Sleep(500)
WinActivate($wHnd)
WinWaitActive($wHnd)
ControlClick($wHnd, "", "Button1")
Else
MsgBox(48, "TIME OUT", "¡Ventana no encontrada!")
EndIf
Le he añadido un ELSE por si salta el Timeout, cosa que no hace pero por si se está liando con varios formularios.
He cambiado la ER porque el punto de ".tmp" es literal, así que lo más correcto es usar el escape. Si no lo pones, algo como "Temp\hola\mitmp" también sería capturado como correcto, aunque no tiene extensión.
Si te aseguras de que está activa no entiendo por qué no funciona un Send("!s") o con controlsend.
Si todo eso no funciona lo único que se me ocurre es que no está en esa ventana, por mucho que lo parezca, igual hay una similar oculta o algo así, porque si no no se entiende.
Seguro que el archivo se está copiando bien ¿no? A ver si es que le das a siguiente pero la ventana vuelve a salir porque no encuentra el archivo...
Re: Problemas con ControlClick
Publicado: 13 Mar 2012, 18:41
por avechuche
Nada, ya probe y nada. El archivo se copia bien porque si yo hago clic en "reintentar" o "cancelar" (cosa rara) sigue la instalación ...
Re: Problemas con ControlClick
Publicado: 13 Mar 2012, 21:08
por Chefito
Alguna vez me ha dado problemas estas cosas en win7. Mira a ver si te funciona esto:
Código: Seleccionar todo
ControlSend("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Button1","{enter}")
Si no prueba a darle un par de clicks seguidos que suele funcionar:
Código: Seleccionar todo
ControlClick("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Button1","left",2)
Saludos.
Re: Problemas con ControlClick
Publicado: 14 Mar 2012, 16:48
por avechuche
Nada :(, asi que si algun dia quieren hacer el Visual Studio desatendido, ya tienen el primer conflicto :)
Re: Problemas con ControlClick
Publicado: 14 Mar 2012, 22:08
por Chefito
Como dice Ximorro, que raaaaarooooo
.
Seguro que capturas bien el handle del botón??. Compruebalo.
Aunque es lo mismo que has probado pero de distinta forma, mira a ver esto:
Código: Seleccionar todo
#include <GuiButton.au3>
$html=ControlGetHandle("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Button1")
_GUICtrlButton_Click($html)
_GUICtrlButton_Click($html)
Como ya te dije a veces hay que mandarle varios clicks para que cliquee el botón. Puedes hacer un pequeño bucle para que lo haga varias veces hasta que lo pulse. Ejemplo:
Código: Seleccionar todo
While WinExists("Instalación de Microsoft Visual Studio 2010 Ultimate")
Sleep(50)
ControlClick("Instalación de Microsoft Visual Studio 2010 Ultimate", "", "Button1")
WEnd
Si no te funciona (nunca sale del bucle), prueba a meter ControlSend o _guictrlbutton_click en vez de controlclick a ver si te funciona alguno.
Y mira bien lo que te he dicho antes. Comprueba que todos los handles (botón y ventana) existen y los capturar bien. Si por casualidad no es correcto algún valor de estos, no te va a dar error el programa y no te va a hacer nada, volviendote loco
.
Saludos.
Re: Problemas con ControlClick
Publicado: 16 Mar 2012, 10:24
por avechuche
Re: Problemas con ControlClick
Publicado: 16 Mar 2012, 10:51
por Chefito
Sabía yo que tenía que ser algo así
. Me alegro de que se te haya solucionado el problema.
He estado pensando y puede que el problema también esté en la configuración de los parámetros de tiempos de cliqueos que tiene el AutoIt. Puede que poniendolos algo más lentos funcione mejor.
Mira la función opt en la ayuda y los valores MouseClickDelay y MouseClickDownDelay (esta última es la que retrasaría a ver si va mejor).
Saludos.