Hola comunidad, espero todos estén teniendo un excelente día
Para poner en contexto, me solicitaron que desarrollé un programa que guarde reportes de notas de estudiantes hechos en Excel en PDF y después estos sean enviados vía WhatsApp a los respectivos padres de los mismos. En teoría muy sencillo ya que todo estaba ordenado por códigos y números telefónicos en hojas de Excel. Guardar los reportes en PDF fue muy sencillo, una simple macro en VBA. El problema comenzó para enviar los PDF's por WhatsApp Web. Como debía enviar un mensaje a un número x desde el vamos usé el clic para chatear para el texto, pero tenía que ver la forma de enviar los archivos.
Opte por hacerlo apoyado por Selenium trabajando directamente en VBA desde Excel. En principio bien, me apoye del siguiente vídeo
Automate Image PDF Videos Upload Via WhatsApp - YOUTUBE
Pero después empezaron los problemas. De por sí no era eficiente con los tiempos de espera entre evento, es decir no se detectaba cuando ya había cargado la página o cuando ya el PDF se había terminado de subir para poder cambiar a otro número. También había problemas con la actualización de versiones de Chrome, Chromiun y Selenium. Por último lo más evidente cada vez que se quería trabajar en otra PC se debían instalar todos los componentes. La verdad un caos!
Así que me plantee hacer el mismo programa pero con Delphi, teniendo la ventaja del navegador incorporado. Bastaría con crear los PDF's desde Excel. Después seleccionar las carpetas donde están guardados e indicar la lista de códigos y números de WhatsApp.
Al menos eso pensé... Bueno de por sí el navegador de Delphi no soporta WhatsApp Web, así que procedí a instalar la versión más reciente que encontré del Componente Chromiun para Delphi. Aquí todo bien, después era solo cargarla la URL y ejecutar JS para que se dé Clic en los respectivos botones de envío. Tuve problemas para indicar el Path del archivo tal como se hacía en Selenium
Código:
driver.FindElementByXPath("//input[@accept='image/*,video/mp4,video/3gpp,video/quicktime']").SendKeys (filepath)
Así que opte por en vez de pasar las teclas directamente al elemento HTML, darle clic y enviar las pulsaciones con SendKeys hecho en Delphi.
Código Delphi
[-]
procedure SendKeys(const S: String);
var
InputEvents: PInput;
I, J: Integer;
begin
if S = '' then Exit;
GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
try
J := 0;
for I := 1 to Length(S) do
begin
InputEvents[J].Itype := INPUT_KEYBOARD;
InputEvents[J].ki.wVk := 0;
InputEvents[J].ki.wScan := Ord(S[i]);
InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
InputEvents[J].ki.time := 0;
InputEvents[J].ki.dwExtraInfo := 0;
Inc(J);
InputEvents[J].Itype := INPUT_KEYBOARD;
InputEvents[J].ki.wVk := 0;
InputEvents[J].ki.wScan := Ord(S[i]);
InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
InputEvents[J].ki.time := 0;
InputEvents[J].ki.dwExtraInfo := 0;
Inc(J);
end;
SendInput(J, InputEvents[0], SizeOf(TInput));
finally
FreeMem(InputEvents);
end;
end;
SendKeys('C:\Users\Administrador\Desktop\Reporte.pdf');
Delay(2500);
keybd_event(VK_RETURN, 0,0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
Delay(4000);
Y efectivamente ya enviaba el PDF, el problema es en las acciones anteriores. Ya que en WhatsApp Web para que cargue el cuadro de Dialogo para Insertar el Archivo primero se debe dar Clic en el Botón "Adjuntar" Y después Clic en "Documento"
Aquí como mencioné ejecuto JS para hacer el manejo de elementos. Claro, le paso el JS minificado.
Código Delphi
[-]Chromium1.Browser.MainFrame.ExecuteJavaScript(StringReplace('var eventFire=(b,c)=>{var...
Y bueno aquí es donde empieza el problema, ya que cuando empieza la secuencia en el primer recorrido ejecuta el primer botón "Adjuntar" pero no da clic al segundo botón de "Documento" y por ende no carga el cuadro de dialogo y no se envía el documento.
Cuando empieza el segundo recorrido, probablemente como ya quedó pulsado el primer botón ahora ya pulsa el segundo botón y se envía el PDF. Pero claro poniendo esto en bucle lo que ocasiona es que envía dejando un Reporte. Bueno esto probandolo sin cambiar de URL's porque si fuera el caso se reiniciaría el sitio y nunca enviaría ningún PDF.
En pocas palabras, no llega a enviar el PDF, por más que ya he probado los códigos JS desde la consola en Chrome y aquí sí ejecuta ambos botones correctamente.
El código JS que estoy usando para dar Clic en los botones es
Código:
var eventFire = (MyElement, ElementType) => {
var MyEvent = document.createEvent("MouseEvents");
MyEvent.initMouseEvent
(ElementType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
MyElement.dispatchEvent(MyEvent);
};
eventFire(document.querySelector('div[title="Adjuntar"]'), 'click');
Código:
var eventFire = (MyElement, ElementType) => {
var MyEvent = document.createEvent("MouseEvents");
MyEvent.initMouseEvent
(ElementType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
MyElement.dispatchEvent(MyEvent);
};
eventFire(document.querySelector('button[aria-label="Documento"]'), 'click');
Adjunto el archivo donde estuve haciendo las pruebas para que puedan hacer sus observaciones y gracias de antemano me puedan ayudar en lo que debo mejorar para que pueda funcionar correctamente.
Muchas Gracias