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: 8
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: 8
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...
A_AhkUser
Posts: 1147
Joined: 06 Mar 2017, 16:18
GitHub: AAhkUser
Location: France

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

16 Aug 2020, 13:07

SirZoX wrote:
06 Aug 2020, 16:06
Hola SirZoX,

Algunas sugerencias además de algunos vínculos para que pueda aprovechar de la mejor manera posible el Internet Explorer objeto y javascript:

Code: Select all

#NoEnv
#Warn
SendMode Input
*SetWorkingDir %A_ScriptDir%
#SingleInstance force


; DEFINIR VARIABLES
;------------------------------------------------------------------------
usuario := 	{1:"usuario1",2:"psswrd1"}
password := 	{1:"usuario2",2:"psswrd2"}
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
ie.Navigate("https://n1k10.csb.app/") ; let's navigate to a simple CodeSandbox for testing purpose (https://codesandbox.io/s/festive-dew-n1k10?file=/index.html)
WinWaitActive % "ahk_id " . ie.HWND ; each InternetExplorer object has a unique ID, also known as a HWND (short for handle to window)

;ESPERA A QUE LA WEB TERMINE DE CARGAR
;------------------------------------------------------------------------
While (ie.readyState != 4 || ie.document.readyState != "complete" || ie.busy)
	sleep, 100

LOOP % numUsuarios {
	if WinExist("ahk_id " . ie.HWND) {
		WinActivate
		WinMaximize
		if (ie.document.getElementById("test")) {
			; ie.document.getElementById("test").focus() ; https://www.w3schools.com/jsref/met_html_focus.asp
			sleep, 1000
			ie.document.getElementById("test").value := usuario[A_Index]
			sleep, 1000
			ie.document.getElementById("test2").value := password[A_Index]
			sleep, 1000
			ie.document.getElementById("button1").click() ;https://www.w3schools.com/jsref/met_html_click.asp
			sleep, 1000
			ie.document.getElementById("button2").click()
			sleep, 1000
			; ! value is not a method nor a property: don't suffix it with parentheses
			MsgBox % "test2 = " ie.document.getElementById("test2").value
			; REFRESCA LA PAGINA
			ie.Refresh() ; https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752084(v=vs.85)
			;ESPERAR PARA CARGA DE LA NUEVA WEB
			While (ie.document.readyState != "complete")
				sleep, 100
			sleep, 1000
			elements := ie.document.getElementsByClassName("userInput")
			Loop % elements.length {
				element := elements[ a_index-1 ] ; javascript indexes start with 0
				element.style.backgroundColor := "Red" ; https://www.w3schools.com/jsref/dom_obj_style.asp
			}

		}
	}
}
sleep, 5000
ie.quit() ; https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752084(v=vs.85)
MsgBox, Se ha completado el proceso
ExitApp
Saludos!


A_AhkUser
my scripts

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 4 guests