Encontrar un texto en una página web y hacer click sobre el

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

SirZoX
Posts: 2
Joined: 29 Jul 2020, 16:24

Encontrar un texto en una página web y hacer click sobre el

29 Jul 2020, 16:35

Buenas a todos, después de leer muchos topics y probar algunos códigos que me han servido para ir adelantando un poco mi trabajo, me encuentro ante una necesidad que no he sido capaz de resolver todavía.

El punto en el que me encuentro es que tengo una página web abierta, con una serie de "bloques" y unos botones al pie que realizan distintas acciones. Los bloques no tienen porqué medir lo mismo en altura en píxeles, por lo que desplazar cursor X píxeles y hacerle un loop queda descartado.

Es entonces cuando creo que la mejor opción es poder bajar el cursor lentamente, cada X pixeles (por ejemplo 10) y tratar de leer lo que hay debajo. En el caso de llegar a un texto concreto, por ejemplo "saludar", que se haga un click en esas coordenadas. La segunda parte de la fiesta que sería enviar una serie de teclas ya la tengo resuelta, pero no consigo encontrar el cómo "buscar" todas las apariciones del texto en cuestión y que se pudiera hacer un click sobre cada una de ellas cuando las encuentre.

Luego cuando esto esté resuelto, aparecerá un segundo problema, y es que si se llega a un máximo de X bloques, se crea paginación al pie de la web, por lo que tendré que inventar otro método para saber cuántas páginas hay en la paginación y pulsar el botón > las veces necesarias para llegar a la última página y que por el camino los loops hayan hecho su trabajo. Pero esto ya será otro tema que veré de solucionar luego y si no, ya os pediré ayuda.
SirZoX
Posts: 2
Joined: 29 Jul 2020, 16:24

Re: Encontrar un texto en una página web y hacer click sobre el

06 Aug 2020, 16:06

Vaaaale, no os puse código... os pego lo tengo hasta ahora

Code: Select all

; DEFINIR VARIABLES 
;------------------------------------------------------------------------

usuario := 	{1:"xxxx",2:"yyyyy"}
password := 	{1:"xxxx",2:"yyyy"}


numUsuarios := usuario.Length()
numPasswords := password.Length()




;COMPROBACIONES INICIALES
;------------------------------------------------------------------------

if (numUsuarios != numPasswords) {
	MsgBox, La cantidad de usuarios(%numUsuarios%) y passwords(%numPasswords%) es distinta
	ExitApp
}



;CREAR INSTANCIA OBJETO IEXPLORER
;------------------------------------------------------------------------

ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := true  ; This is known to work incorrectly on IE7.
ie.Navigate("https xxxxxxxxxxxxxxx.com ")  Broken Link for safety





;ESPERA A QUE LA WEB TERMINE DE CARGAR
;------------------------------------------------------------------------
sleep, 2000





;------------------------------------------------------------------------
;FOCALIZAR EN LA VENTANA E INICIO DE LOS LOOPS

LOOP , %numUsuarios% {

	if WinExist("TITULO DE LA VENTANA") {
		
		WinActivate
		WinMaximize
		
		contenido:= WBGet()

		if contenido.document.getElementById("email") {
			

			;RELLENAMOS DATOS DEL FORMULARIO DE LOGIN
			MouseMove, 620, 420
			MouseClick Left
			contenido.document.getElementById("email").value:= usuario[A_Index]
			contenido.document.getElementById("password").value:= password[A_Index]


			;ESPERAMOS 1 SEGUNDO, MOVEMOS CURSOR AL BOTÓN Y LO PULSAMOS
			sleep, 1000
			MouseMove, 800, 650
			MouseClick Left


			;ESPERAR PARA CARGA DE LA NUEVA WEB
			Sleep, 4000


			;VOLVEMOS A LEER EL CONTENIDO DE LA WEB RECIÉN CARGADA
			nuevoContenido:= WBGet()
			bloques := nuevoContenido.document

			XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
			
			MsgBox, elementos %bloques%

			XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
			
			;CERRAR SESION
			MouseMove, 1500, 165
			MouseClick Left
			sleep, 3000

			;DESPUÉS DE CERRAR SESIÓN, HACEMOS CRL F5 PARA REFRESCAR TODO
			Send, ^{f5}
			sleep, 3000
		}
		
	}

}

MsgBox, Se ha completado el proceso

Return














WBGet(WinTitle="ahk_class IEFrame", Svr#=1) 
{ ; based on ComObjQuery docs
   static   msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
   ,   IID := "{0002DF05-0000-0000-C000-000000000046}" ; IID_IWebBrowserApp
;   ,   IID := "{332C4427-26CB-11D0-B483-00C04FD90119}" ; IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}
La función WBGet la copié de alguna parte y no entiendo un carajo lo que hace, pero sé que de un modo u otro me permite leer código html de una página abierta y activa, y aquí es donde entra lo que quiero hacer, que es lo que se encuentra entre las dos líneas XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

Necesito que en ese paso pueda conseguir todos los elementos DOM que coinciden con una clase concreta para posteriormente aplicarles una modificación, por ejemplo ponerle un css propio para marcar el texto.

A ver si algún alma me echa una mano...

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 5 guests