Página 1 de 1

pulsar un boton y abrir un archibo

Publicado: 21 Oct 2010, 14:51
por tomas33
hola a todos,tengo un problemilla sencillo creo de resolver soy nuevo en esto de la programacion,estoy intentando automatizar internet explorer hasta el momento todo bien pero el problema es cuando acedo a una web con un boton que abre una ventana de windows para selecionar un archivo y cargarlo a la web el problema es no se como aceder al boton y dar click al archivo creo que es sencillo pero con tanta documentacion me lio mucho ¿alguien puede arientarme? o decirme como puedo resolver eso nada mas u
un saludo y muchas gracias

Re: pulsar un boton y abrir un archibo

Publicado: 22 Oct 2010, 16:23
por Chefito
Pues para darle a un botón de una página web tienes varias posibilidades. Mírate la udf IE.au3. Son todas las funciones que empiezan por _IE...... en la ayuda. Buscalas.
Te pueden interesar por ejemplo _IEGetObjById, _IEGetObjByName para identificar el objeto (un botón en tu caso) por su ID o por su nombre y poder trabajar con ellos posteriormente. Para pulsarlo te puede interesar _IEAction ($objeto,"click").

Para poder pulsar por ejemplo un archivo, tendrás que utilizar el programa espia de objetos y ventanas llamado Autoit Window info (te dice la información de las ventanas y de los objetos para poder trabajar con ellos posteriormente).
Una vez que tienes la información de éstos, puedes trabajar con el control que contenga estos archivos. Para esto utiliza las funciones que empiezan por Control..... . Te puede interesar ControlClick para cliquear cualquier control, y si el control que contiene los archivos es un listview (ventanas de windows), mira ControlListView.
Si quieres ir más lejos y tener un control total del listview, mirate las funciones que empiezan por _GuiCtrlListView_..... . Para cliquear un elemento puedes utilizar GUICtrlListView_ClickItem.

Intenta hacer algo, y si te atascas en algo cuelga el código y dinos donde te da el error.
Reitero, es importante que nos des más información para poder ofrecer una mejor ayuda (decirnos la página web, el botón, etc que quieres automatizar), y es muy importante que nos cuelges el código que llevas hecho.....aunque no esté muy bien.

Saludos.

Re: pulsar un boton y abrir un archibo

Publicado: 23 Oct 2010, 16:55
por tomas33
hola de nuevo,gracias por la respuesta me ha servido de gran ayuda,pero no se por que motivo no se pulsa el boton.Tal y como me indicas aqui te pego el texo del codigo para que lo examines y puedas hacerte una idea mas clara por que no se que es lo que esta mal y por que falla.Otro fallo que tiene es que uso el mismo metodo para dar el link de la imagen pero a medida que abanza la web en el la segunda imagen que tengo que pulsar no funciona el metodo espero resolver las dudas muchas gracias por tu ayuda:

#include <ie.au3>
;Crear una instancia de Internet Explorer
$oIE = _IECreate ("http://www.milanuncios.com/lugar/?cat=245",1)
WinWaitActive ("MILANUNCIOS.com - Publicar anuncios (paso 2) - Windows Internet Explorer")
WinSetState ("MILANUNCIOS.com - Publicar anuncios (paso 2) - Windows Internet Explorer","",@SW_MAXIMIZE)
;Obtener el objeto "p"
$op= _IEGetObjByName ($oIE, "p")

;Poner texto en el objeto "p" obtenido anteriormente
_IEFormElementSetValue ($op, "la provincia que sea")
_IEFormImageClick ($oIE, "http://www.milanuncios.com/siguiente.gif")
;espera a que carge
_IELoadWait ($oIE)
;crea el objeto de los formularios
$otitulo=_IEGetObjByName ($oIE, "titulo")
$otexto=_IEGetObjByName ($oIE, "texto")
$onombre=_IEGetObjByName ($oIE, "nombre")
$oemial=_IEGetObjByName ($oIE, "email")
$orepemail=_IEGetObjByName ($oIE, "repemail")
$otelefono1=_IEGetObjByName ($oIE, "telefono1")
$otelefono2=_IEGetObjByName ($oIE, "telefono2")
;rellena los campos
_IEFormElementSetValue ($otitulo, "el titulo que sea")
_IEFormElementSetValue ($otexto, "aqui el texto que sea")
_IEFormElementSetValue ($onombre, "el nombre")
_IEFormElementSetValue ($oemial, "el mail")
_IEFormElementSetValue ($orepemail, "rep. mail")
_IEFormElementSetValue ($otelefono1, "tlf1")
_IEFormElementSetValue ($otelefono2, "tlf2")
_IEFormImageClick ($oIE, "http://www.milanuncios.com/publicar.gif")
;espera a que carge
_IELoadWait ($oIE)
;pulsa el boton
$oboton= _IEFormElementGetObjByName ($oIE, "uploadFile1")
_IEAction ($oboton, "click")
;espera a que carge
_IELoadWait ($oIE)
_IELinkClickByText($oIE, "[>] FINALIZAR PUBLICACIÓN")

Re: pulsar un boton y abrir un archibo

Publicado: 28 Oct 2010, 17:53
por Chefito
Bueno bueno, analizando un poco tu código se ven varios fallos.
Por ejemplo, no te pasa del principio porque no rellenes uno de los campos obligatorios, el de "Provincia". No puedes darle el valor como lo haces tú ya que es un objeto select. Estos objetos no se tratan igual que por ejemplo los text. Tienes que ver sus propiedades, métodos y eventos que posee cada objeto para poder trabajar bien con él. Busca en google que seguro que te salen miles de páginas que te dicen todos estos datos.
Yo he seleccionado un objeto de la lista según si item (la posición del elemento). Esto se hace cogiendo la variable que contiene el objeto select y asignandole a la propiedad selectedindex el valor del item que quiero seleccionar.

Piensa que AutoIt tiene muchas funciones para trabajar con diversos objetos, pero otros muchos los tienes que tratar tú directamente.

Te he quitado algunos _ieloadwait ya que no hacían falta. Muchas de las funciones que cargan páginas y demás tienen la propiedad de no continuar con el script hasta que no se carge la página (wait). Y por defecto suele estar a 1 (que espera). Por eso no hace falta repetir cosas :smt001 .

He visto que te has liado un poco con las funciones que trabajan con los formularios. Esas funciones reciben como primer parámetro un objeto form, y no un objeto IE. Ten cuidado con esto.

Al final te he corregido otro fallo que seguro que te iba a costar mucho encontrar la solución :smt005 . Es en el paso 4º, en el tratamiento del objeto tipo file (Input type="file".....). Este objeto, llamado "uploadFile1", es un tanto especial. No puedes tratarlo directamente desde la página, ya que está ubicado en un frame (marco) diferente. Por desgracia, no se puede meter el texto del fichero directamente (una protección), con lo cual, lo que tenemos que hacer es cliquearlo para que nos aparezca la ventana de windows de cargar archivos.

A partir de aquí te lo dejo. Una forma muy facil de introducir el archivo es, si sabes exactamente donde está, mandar el texto al control Edit1 de esta ventana con la función controlsettext, para luego cliquear el boton "Abrir" que es el Button2. Esto se hace con la función controlclick. Por cierto, la clase de la ventana es #32770.

Si quieres seleccionar un archivo de la lista, tendrás que atacar el control listview (SysListView321). Para hacer esto hay muchas funciones en AutoIt. Tienes por ejemplo la función controllistview con muchas posibilidades. Para cosas más complicadas, tienes una udf. Mira en la ayuda las funciones que empiezan por _GuiCtrlListView_........ .

Si tienes que automatizar otros botones de esta ventana (como por ejemplo el de "Subir nivel"), mira su clase, nombre, etc y utiliza las funciones que empiezan por Control..... .

MUY IMPORTANTE: Para mirar todas las propiedades de una ventana y sus controles, utiliza el programa espia suplementario que trae AutoIt llamado "Autoit Window Info".

Por supuesto, todo este rollo te lo evitarías si no tuvieses que añadir ninguna imagen. Entonces solamente tendrías que pulsar la imagen que pone "Publicar sin foto". Esto ya he visto que sabes hacerlo :smt002 .

Y como no he pasado de ese paso no se lo que viene. Supongo que una página web que te dice si ha sido publicada o no por algún problema. Eso también se puede tratar facilmente viendo el texto, html, url, título, etc de la página. A elegir.

Mira en la ayuda todo lo que te comento.

Código: Seleccionar todo

#include <ie.au3>
;Crear una instancia de Internet Explorer
$oIE = _IECreate ("http://www.milanuncios.com/lugar/?cat=245")
WinWaitActive ("MILANUNCIOS.com - Publicar anuncios (paso 2) - Windows Internet Explorer")
WinSetState ("MILANUNCIOS.com - Publicar anuncios (paso 2) - Windows Internet Explorer","",@SW_MAXIMIZE)
;Obtener el objeto "p"
$op= _IEGetObjByName ($oIE, "p")
;Poner texto en el objeto "p" obtenido anteriormente
$op.selectedindex=3		;es el item número 3 de la lista despegable (Alicante)

_IEFormImageClick ($oIE, "http://www.milanuncios.com/siguiente.gif")
;crea el objeto de los formularios
$otitulo=_IEGetObjByName ($oIE, "titulo")
$otexto=_IEGetObjByName ($oIE, "texto")
$onombre=_IEGetObjByName ($oIE, "nombre")
$oemial=_IEGetObjByName ($oIE, "email")
$orepemail=_IEGetObjByName ($oIE, "repemail")
$otelefono1=_IEGetObjByName ($oIE, "telefono1")
$otelefono2=_IEGetObjByName ($oIE, "telefono2")
;rellena los campos
_IEFormElementSetValue ($otitulo, "el titulo que sea")
_IEFormElementSetValue ($otexto, "aqui tiene que ir una descripción no demasiado corta, porque si no la página no acepta el texto y no puede continuar a la siguiente. Por esta causa estoy escribiendo todo esto")
_IEFormElementSetValue ($onombre, "el nombre")
_IEFormElementSetValue ($oemial, "[email protected]")
_IEFormElementSetValue ($orepemail, "[email protected]")
_IEFormElementSetValue ($otelefono1, "123456789")
_IEFormElementSetValue ($otelefono2, "234567890")
_IEFormImageClick ($oIE, "http://www.milanuncios.com/publicar.gif")
;pulsa el boton
$iFrame = _IEFrameGetCollection ($oIE,0)	;obtenemos el primer frame que es donde está el control file
$oboton=_IEGetObjByName($iFrame, "uploadFile1")
$oboton.click		;cliquea el botón "Examinar" del control file.

;~ _IELoadWait ($oIE)
;~ _IELinkClickByText($oIE, "[>] FINALIZAR PUBLICACIÓN")
Intenta hacer algo y si tienes algún problema postealo.

Saludos.

Re: pulsar un boton y abrir un archibo

Publicado: 30 Oct 2010, 13:17
por tomas33
impresionante la ayuda,lo que me comentas del form sospechava que era por esa razon,pero devido a mi desconocimiento no savia como aceder al boton tras leer la ayuda me puese en marcha,la forma que he decidido atacar es mandar al control edid la ruta del archivo creo que es la mas sencilla pero el problema es que aparentemente esta bien,pero cuando ejecuto pulsa efectibamente el boton pero se queda ahy no manda el texto a control edit,he observado que cuando pulso el boton se queda ahy y no sige lellendo instrucciones y si le doy a cancelar manualmete con el raton es cuado manda el texo y sige las instrucciones ¿esto por que ocurre? ¿que es lo que esta mal? aqui te dejo la instruccion:

Código: Seleccionar todo

;pulsa el boton
$iFrame = _IEFrameGetCollection ($oIE,0)   ;obtenemos el primer frame que es donde está el control file
$oboton=_IEGetObjByName($iFrame, "uploadFile1")
$oboton.click      ;cliquea el botón "Examinar" del control file.
sleep (5000)
;WinActivate ("Elegir archivos para cargar","")
ControlSetText ("Elegir archivos para cargar","" ,"[CLASS:Edit; INSTANCE:1]","c:\....\ archichivo que sea.jpg")

Re: pulsar un boton y abrir un archibo

Publicado: 03 Nov 2010, 02:38
por Chefito
Por desgracia al intentar atacar con propiedades y métodos dhtml este control y sacar la ventana para elegir un archivo se bloquea el script hasta que se cierre.
Por esta causa hay que hacerlo de otra forma. Lo podemos hacer dandole el foco al control y mandándole un espacio con la función controlsend. De esta forma se abrirá la ventana para elegir un archivo y no se parará el script.

Código: Seleccionar todo

;pulsa el boton
$iFrame = _IEFrameGetCollection ($oIE,0)   ;obtenemos el primer frame que es donde está el control file
$oboton=_IEGetObjByName($iFrame, "uploadFile1")
$oboton.focus
ControlSend(_IEPropertyGet($oIE, "hwnd"), "", "","{space}")
Saludos.