Selenium

Fórum sobre ferramentas de apoio à programação (Clipper/[x]Harbour)

Moderador: Moderadores

maxtai
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 04 Out 2014 16:31
Localização: Criciúma/SC
Contato:

Selenium

Mensagem por maxtai »

Alguém aqui já fez integração com o Selenium?

Pelo que estou vendo podemos comanda um navegador de forma automatizada. Podemos realizar inúmeras tarefas de forma automática.

o site do projeto é:
https://www.selenium.dev

Se alguém puder passar alguma dica para usar no Harbour agradeço muito.

Um forte abraço a todos,
MaxTai
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Selenium

Mensagem por Itamar M. Lins Jr. »

Olá!
podemos comanda um navegador de forma automatizada.
Tem vídeo ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Selenium

Mensagem por carlaoonline »

Bom dia!
maxtai escreveu:passar alguma dica para usar no Harbour
Tchê, acho que para Harbour puro é chance zero, porém para C++ ou até C, talvez possa integrar, acho que esse seria o caminho a procurar, ou então criar um script em Python que seja chamado pelo executável criado em Harbour.

No link abaixo tem um projeto em C++ meio parado, talvez procurando encontre algum em C que seja possível compilar junto com o Harbour.
https://github.com/durdyev/webdriverxx

Código: Selecionar todos

#include <webdriverxx/webdriverxx.h>
using namespace webdriverxx;

int main() {
    WebDriver firefox = Start(Firefox());
    firefox
        .Navigate("http://google.com")
        .FindElement(ByCss("input[name=q]"))
        .SendKeys("Hello, world!")
        .Submit();
    return 0;    
}
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Selenium

Mensagem por JoséQuintas »

Tinha isso com o internet explorer, mas ele foi desativado.
Tem até exemplo na GTWVG.
Talvez o webview.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Selenium

Mensagem por JoséQuintas »

José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Selenium

Mensagem por rochinha »

Amiguinhos,

Deixando um pequeno trecho para adaptação e testes para quem passar procurando alguma dica ou solução.

Código: Selecionar todos

...
   quem := "Rochinha"
   cPara := "14998776655"
   cCumprimento := "OLa" + iif(!empty(quem),", "+alltrim(quem), "" )
   cmsg  := "Um Teste de Envio de Mensagem de Texto pelo whatsapp. "+chr13+chr(10)+"Neste caso é necessário abrir o browser, "+chr13+chr(10)+"entrar no site web.whatsapp.com, "+chr13+chr(10)+"ler o QR-Code com celular de envio e acionar a rotina pelo sistema."+chr13+chr(10)+chr13+chr(10)+"Ignore momentaneamente estas mensagem pois estou testando o procedimento."

   cMsg  := strTran( cMsg, chr13+chr(10), "+{ENTER}" )
   cPara := CharRem( "*()/-.#[]:, ", cPara )
   oShell:= TOleAuto():New( "WScript.Shell" )
   oShell:run( "https://api.whatsapp.com/send?phone=" + cPara )
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep); oShell:SendKeys(cCumprimento)
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep); oShell:SendKeys(cMsg)
   if !empty(cBmp); syswait(2); oShell:sendkeys("^(v)"); endif
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep)
   oShell:SendKeys("%{F4}")
Use no lugar de TOleAuto():New a automação winole de sua preferencia.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
maxtai
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 04 Out 2014 16:31
Localização: Criciúma/SC
Contato:

Selenium

Mensagem por maxtai »

Caro amigo rochinha,

Da forma que o amigo passou acima, funciona com a janela em segundo plano? Eu só consegui fazer funcionar, com ela em primeiro plano, se minimizar ela, a janela que estiver aberta é que recebeu os comandos.

Um grande abraço,
Max Thai
www.maxxsoftware.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Selenium

Mensagem por rochinha »

Amiguinhos,

maxtai
Tente:

Código: Selecionar todos

...
   quem := "Rochinha"
   cPara := "14998776655"
   cCumprimento := "OLa" + iif(!empty(quem),", "+alltrim(quem), "" )
   cmsg  := "Um Teste de Envio de Mensagem de Texto pelo whatsapp. "+chr13+chr(10)+"Neste caso é necessário abrir o browser, "+chr13+chr(10)+"entrar no site web.whatsapp.com "
   cmsg  :=  cmsg  + chr13+chr(10)+"ler o QR-Code com celular de envio e acionar a rotina pelo sistema."+chr13+chr(10)+chr13+chr(10)+"Ignore momentaneamente estas mensagem pois estou testando o procedimento."

   // Verifica se Whatsapp esta ativo
   lWhatsPresent := .F.
   hWndWhats := FindWindow(,"WhatsApp")
   if IsNil( hWndWhats )
      lWhatsPresent := .F.
   else
      if hWndWhats == 0
         lWhatsPresent := .F.
      else
         lWhatsPresent := .T.
         BringWindowToTop( hWndWhats )
         SysWait(nWhatSleep)
         SendMessage( hWndWhats, WM_SETFOCUS, 0, 0 )
         SysWait(nWhatSleep)
      endif
   endif
   if !lWhatsPresent
      WinExec( "chrome.exe https://web.whatsapp.com/" )
      SysWait(5)
   endif
   // Prepara envio da mensagem
	 
   cMsg  := strTran( cMsg, chr13+chr(10), "+{ENTER}" )
   cPara := CharRem( "*()/-.#[]:, ", cPara )
   oShell:= TOleAuto():New( "WScript.Shell" )
   oShell:run( "https://api.whatsapp.com/send?phone=" + cPara )
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep); oShell:SendKeys(cCumprimento)
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep); oShell:SendKeys(cMsg)
   if !empty(cBmp); syswait(2); oShell:sendkeys("^(v)"); endif
   syswait(nWhatSleep); oShell:SendKeys("~")
   syswait(nWhatSleep)
   oShell:SendKeys("%{F4}")

OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
maxtai
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 04 Out 2014 16:31
Localização: Criciúma/SC
Contato:

Selenium

Mensagem por maxtai »

Prezado amigo Rochinha,

Até funciona, mas ai sistema que vai ficar em primeiro plano não pode ter o foco. A ideia era deixar em segundo plano enviando, desta forma ao clicar no ERP para operar, os comando vão para a janela com o foco ao invés de irem para o whats web.

Abraço e gratidão pela resposta,
Um grande abraço a todos,
Max Thai
www.maxxsoftware.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Selenium

Mensagem por rochinha »

Amiguinhos,

Veja estes trechos e monte um teste.

Fiz o teste com este conjunto com Windows 10 e WhatsApp desktop instalado. A instalação do WhatsApp Desktop é feita diretamente da loja de aplicativos do Windows.

O curso do código irá capturar o handle do aplicativo WhatsApp, minimizá-lo, maximizálo, dar comandos sendkeys simulando ações do usuário, capturar uma imagem e colada numa mensagem para um de seus contatos.

Modifique as informações de destino no arquivo mensagem.whats.

Arquivo messagem.whats

Código: Selecionar todos

DEQUEM;PARAQUEM;NOME;IMAGEM;MENSAGEM
+5514997797477;+55 14 99779-7477;Rochinha;C:\TEMP\GFDG.BMP;ESTA E UMA MENSAGEM DE TESTE ENTRE EU E EU MESMO
+5514997797477;10Comtracao;Ze das Couves;C:\TEMP\HDS.BMP;ESTA E UMA MENSAGEM DE TESTE ENTRE EU E EU MESMO
Função exemplo de chamada:

Código: Selecionar todos

          // Captura lista whatsapp basica
          IF file( "mensagem.whats" )
             cWHATSTeste := MemoRead( "mensagem.whats" )
             nLines := MlCount(cWHATSTeste,250)
             detnItem := 1
             vMPTotal := 0
             FOR nFor := 2 TO nLines // Linha 1 tem o cabecalho  
                 blinha := MemoLine(cWHATSTeste, 250, nFor)
                 ablinha := StringToArray( blinha, ";" )
                 if !empty( blinha ) .and. len( ablinha )=5
                    if !type( blinha )=="U"
                       Whatsapp( ablinha[1], ablinha[2], ablinha[3], ablinha[4], ablinha[5] )
                    endif
                 endif
                 detnItem := detnItem + 1                   
             NEXT // enddo
             fErase( cWHATSTeste )
          ENDIF
Função principal:

Código: Selecionar todos

Function Whatsapp( cDe, cPara, cQuem, cBmp, cMsg )
   Local clink
   Local oClp
   Local cBmpFile := "WHATSAPP"
   Local cRetVal  := "C:\TEMP\" + cBmpFile + ".BMP"
   // ?procline(),, cDe, cPara, cQuem, cBmp, cMsg 
   OPENCLIPBOARD  := .t.
   EMPTYCLIPBOARD := .t.
   CLOSECLIPBOARD := .t.
   //	DEFINE CLIPBOARD oClip OF oApp // 
   oClip  := TClipBoard():New( 2, oApp )
   oShell := TOleAuto():New( "WScript.Shell" )
   nWhatSleep   := 2
   cDe          := CharRem( "*()/-.%#+[]:, ", cDe )
   cPara        := CharRem( "*()/-.%#[]:, ", cPara )
   cCumprimento := " "+Greetings() + iif(!empty(cQuem),", "+alltrim(cQuem), "" )
   // Captura a tela e salva em arquivo
   if !empty(cBmp)
      // Captura a tela e salva no clipboard
      oClip:Clear()
	  oClip:Open()
      oClip:Empty()
      oClip:SetData( FILoadImg( cBmp ) )
      oClip:End()
   endif
   // Verifica se Whatsapp esta ativo
   lWhatsPresent := .F.
   hWndWhats := FindWindow(0,"WhatsApp") // FindWindow(,"WhatsChrome" ) // WhatsApp - Google Chrome")
   if IsNil( hWndWhats )
      lWhatsPresent := .F.
   else
      if hWndWhats == 0
         lWhatsPresent := .F.
      else
         lWhatsPresent := .T.
         BringWindowToTop( hWndWhats )
         SysWait(2)
         SendMessage( hWndWhats, WM_SETFOCUS, 0, 0 )
         SysWait(2)
      endif
   endif
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MINIMIZE, 0 )

   // Prepara envio da mensagem
   if empty( cMsg )
      cMsg  := "Um Teste de Envio de Mensagem de Texto pelo whatsapp. "+CRLF+"Neste caso é necessário abrir o browser, "+CRLF+"entrar no site web.whatsapp.com, "+CRLF+"ler o QR-Code com celular de envio e acionar a rotina pelo sistema."+CRLF+CRLF+"Ignore momentaneamente estas mensagem pois estou testando o procedimento."
   endif
   cMsg  := strTran( cMsg, CRLF, "+{ENTER}" )
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MAXIMIZE, 0 )
   if !lWhatsPresent; syswait(2); oShell:run( "https://api.whatsapp.com/send?phone=" + cPara ); endif
   //
   nWhatSleep   := 0.5
   //
   syswait(nWhatSleep); oShell:sendkeys("^(f)")
   syswait(nWhatSleep); oShell:sendkeys( cPara )
   syswait(nWhatSleep); oShell:sendkeys("{DOWN}")
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   syswait(nWhatSleep); oShell:sendkeys( cCumprimento )
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   //
   syswait(nWhatSleep); oShell:sendkeys("^(v)")
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   //
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MINIMIZE, 0 )
   Return nil

Function StringToArray( cString, cSeparator ) 
   LOCAL nPos 
   LOCAL aString := {} 
   DEFAULT cSeparator := ";" 
   cString := ALLTRIM( cString ) + cSeparator 
   DO WHILE .T. 
      nPos := AT( cSeparator, cString ) 
      IF nPos = 0 
         EXIT 
      ENDIF 
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
      cString := SUBSTR( cString, nPos+1 ) 
   ENDDO 
   return ( aString ) 

Function Greetings()
   Local cString := "", nHour, cOldTime 
   nHour := Val( Left( Time(), 2 ) )
   Do Case
      Case nHour < 12
           cString := "Bom dia"
      Case nHour < 18
           cString := "Boa tarde"
      OtherWise
           cString := "Boa noite"
   End Case
   Return cString
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Selenium

Mensagem por rochinha »

Amiguinhos,

Eu havia enxugado a função whatsapp() e o foco da mesma se perdeu. Refiz abaixo:

Código: Selecionar todos

/////////////////////////////////////////////////////////////////////////////
// 
// * Programador: Jose Carlos da Rocha - 01-2021 - Revisao em 01-2024
// * Descricao..: Funcoes de chamadas a WhatsApp
//
/////////////////////////////////////////////////////////////////////////////
Function Whatsapp( cDe, cPara, cQuem, cBmp, cMsg )
   Local clink
   Local oClp
   Local cBmpFile := "WHATSAPP"
   Local cRetVal  := "C:\TEMP\" + cBmpFile + ".BMP"
   // OK ?procline(),, cDe, cPara, cQuem, cBmp, cMsg 
   OPENCLIPBOARD := .t.
   EMPTYCLIPBOARD := .t.
   CLOSECLIPBOARD := .t.
   //	DEFINE CLIPBOARD oClip OF oApp // 
   oClip  := TClipBoard():New( 2, oApp )
   oShell := TOleAuto():New( "WScript.Shell" )
   nWhatSleep   := VerifyINI( "WHATSAPP", "Esperar", 2, cPathDados+"\nfw.ini" )
   cDe          := CharRem( "*()/-.%#+[]:, ", cDe )
   cPara        := CharRem( "*()/-.%#[]:, ", cPara )
   cCumprimento := " "+Greetings() + iif(!empty(cQuem),", "+alltrim(cQuem), "" )
   // Captura a tela e salva em arquivo
   if !empty(cBmp)
      // Captura a tela e salva no clipboard
      oClip:Clear()
	  oClip:Open()
      oClip:Empty()
      oClip:SetData( FILoadImg( cBmp ) )
      oClip:End()
   endif
   // Verifica se Whatsapp esta ativo
   lWhatsPresent := .F.
   hWndWhats := FindWindow(0,"WhatsApp") // FindWindow(,"WhatsChrome" ) // WhatsApp - Google Chrome")
   if IsNil( hWndWhats )
      lWhatsPresent := .F.
   else
      if hWndWhats == 0
         lWhatsPresent := .F.
      else
         lWhatsPresent := .T.
         BringWindowToTop( hWndWhats )
         SysWait(2)
         SendMessage( hWndWhats, WM_SETFOCUS, 0, 0 )
         SysWait(2)
      endif
   endif
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MINIMIZE, 0 )
   BringWindowToTop( hWndWhats )

   ShowWindow( FindWindow( 0,cBmpFile ), 9 ) // Forcar o foco
   SetForegroundWindow( FindWindow( 0,cBmpFile ) )

   // Prepara envio da mensagem
   //cmsg  := "Um Teste de Envio de Mensagem de Texto pelo whatsapp. "+CRLF+"Neste caso é necessário abrir o browser, "+CRLF+"entrar no site web.whatsapp.com, "+CRLF+"ler o QR-Code com celular de envio e acionar a rotina pelo sistema."+CRLF+CRLF+"Ignore momentaneamente estas mensagem pois estou testando o procedimento."
   cMsg  := strTran( cMsg, CRLF, "+{ENTER}" )
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MAXIMIZE, 0 )
   if !lWhatsPresent; syswait(2); oShell:run( "https://api.whatsapp.com/send?phone=" + cPara ); endif
   //
   syswait(nWhatSleep); oShell:sendkeys("^(f)")
   syswait(nWhatSleep); oShell:sendkeys( cPara )
   syswait(nWhatSleep); oShell:sendkeys("{DOWN}")
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   syswait(nWhatSleep); oShell:sendkeys( cCumprimento )
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   //
   syswait(nWhatSleep); oShell:sendkeys("^(v)")
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}")
   syswait(nWhatSleep); oShell:sendkeys("{ENTER}") // Reforço
   //
   SendMessage( hWndWhats, WM_SYSCOMMAND, SC_MINIMIZE, 0 )
   Return nil
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder