Dúvida para Implementar Ideia

Implementei a funcionalidade de “seguir um script”, que você poderá definir no arquivo sequencia_de_acoes.txt; nele você coloca instruções e quando clicar no botão da Janela do Clicador ele irá executar essas instruções.

Essas são instruções de teste para você ver o que ele já faz (veja se com essas ações já é suficiente):

//Clica nas coordenadas x=500 e y=200:
CLICAR: 500, 200

//Aguarda 1000 millisegundos, ou seja, 1 segundo:
AGUARDAR: 1000

//Detecta os pixels laranja e tenta clicar na Checkbox certa:
CLICAR_NA_CHECKBOX

//Abaixo faz-se Ctrl+C:
TECLAR: 17, PRESSIONAR //pressiona Ctrl
TECLAR: 67, PRESSIONAR_LIBERAR //pressiona e libera C
TECLAR: 17, LIBERAR //libera Ctrl

Essa instrução teclar recebe o keycode da Tecla desejada como número (17, 67, etc.), para descobrir o keycode de uma tecla, use essa tabela:

https://docs.oracle.com/javase/8/docs/api/constant-values.html#java.awt.event.KeyEvent.CHAR_UNDEFINED

A instrução CLICAR_NA_CHECKBOX não recebe valores, mas atua nas configurações definidas.

Eu esqueci de te falar, mas sempre que alterar as configurações você deve reiniciar o Clicador para que as alterações tenham efeito; o mesmo serve para esse novo arquivo de sequência de ações.

ClicadorDeCheckbox.zip (20,2 KB)

1 curtida

Se você está usando o Excel simplesmente para colocar uma pilha de valores, o clicador podia assumir essa tarefa, dispensando o Excel.

Ele poderia pegar a lista de valores de um arquivo txt no HD, ou, poderia ter campos onde você insere os valores.

O Java consegue colocar informações na Área de Transferência, não sendo necessário o Ctrl+C, só o Ctrl+V.

Da forma como a implementação está, acho que até que seria fácil adicionar a funcionalidade de uma instrução como:

AGUARDAR: <caminhoDeImagem>, posX, posY

Essa instrução faria o programa aguardar até a imagem especificada aparecer na Tela na posição especificada, o que seria útil para fazer o programa aguardar até algo acontecer na tela (como o Adobe Reader abrir e aparecer na Tela após o download :slight_smile: )

Atualmente a função Aguardar “trava” o programa, ele não vai responder até o delay terminar.

Teste ele aí, vou estar aguardando.

1 curtida

Isso seria ótimo, pelo menos não precisaria me preocupar tanto com o tempo de carregamento, porque internet oscila, então é algo bem mais certo.
Vou desenhar minhas ações, e testar,é realmente muito interessante dessa forma, eu vou fazer sim.

As configurações que você precisa editar são essas:

//Configurações para delimitar a Área onde o Número Selecionado pelo Ctrl+F será buscado:
AREA_DA_SELECAO_X: 674 //diminua esse valor, mas deve ser maior ou igual a zero
AREA_DA_SELECAO_Y: 318
AREA_DA_SELECAO_WIDTH: 103 //aumente esse valor
AREA_DA_SELECAO_HEIGHT: 492

AREA_DA_SELECAO_X + AREA_DA_SELECAO_WIDTH deve dar um resultado menor ou igual a 1600 que é a largura da resolução do seu monitor.

Para a captura cobrir toda a largura da Tela, você poderia configurar assim:

//Configurações para delimitar a Área onde o Número Selecionado pelo Ctrl+F será buscado:
AREA_DA_SELECAO_X: 0
AREA_DA_SELECAO_Y: 318
AREA_DA_SELECAO_WIDTH: 1600
AREA_DA_SELECAO_HEIGHT: 492

Mas o ideal é que você ajuste a área capturada para ser o menor possível que funcione em todos os casos, pois isso diminui a chance de erros e também diminui o processamento gasto pelo Clicador (ele sempre terá que percorrer pixel a pixel da área capturada).

Além disso, um área capturada menor é bem mais fácil de ver na Janela do Clicador, o que facilita ver o que ele está capturando.

1 curtida

Vou tentar ajustar o minimo possível, estou achando que em alguns momentos os números saem da área capturada, esse caso que te mandei acima é um caso que falha. E quando mexo nessas configurações dai o Mouse Pro quem falha, ele encontra a Checkbox, mas não consegue selecionar. De qualquer forma acredito que é ir tentando ajustar, em um momento vai funcionar redondo.
Muito obrigada pelas informações.

Criei uma “versão 2”, que muda a GUI e adiciona a funcionalidade de aguardar por algo aparecer na tela para poder continuar.

O código virou uma bagunça rs, mas o Clicador ficou mais interessante.

ClicadorDeCheckbox2.zip (34,4 KB)

Estou usando o JavaFX para a GUI agora.

A nova instrução suportada está sobrecarregada com a outra AGUARDAR, é só mudar os argumentos:

//Aguarda até a imagem aparecer na Tela dentro da área especificada:
//AGUARDAR: "<caminhoDaImagem>", posX, posY, width, height
AGUARDAR: "src/images/white.png", 300, 500, 50, 20

Os valores posX, posY, width, height delimitam uma área retangular na Tela, o programa fica aguardando até que apareça dentro dessa área uma imagem igual a do caminho passado no primeiro argumento.

Essa área retangular pode ser maior que a imagem buscada.

Quando o Clicador estiver aguardando por algo aparecer na Tela, ele irá mostrar na lateral direita a imagem que está esperando que apareça (que é a imagem do caminhoDaImagem), e mostrará também um retângulo sobre a área da Tela onde ele está buscando essa imagem.

Se o Clicador não conseguir clicar na Checkbox, ele cancela a execução dos comandos após o CLICAR_NA_CHECKBOX, e abre uma janela que mostra as capturas que ele fez, essa janela possui barras de rolagem para dar suporte a capturas de imagens bem grandes, mas ela também é “pannable”, então você clicar no meio dela e arrastar para navegar por ela, o que é bem mais fácil que usar as barras de rolagem.

Ele também é capaz de mostrar as Configurações atuais para a busca pela Checkbox.

Agora as configurações da JANELA ficaram inúteis, mas ainda são lidas, então removê-las deve causar bug.

Ainda não adicionei funcionalidade para inserir nele os números que serão buscados, dispensando o Excel.

Outro ponto, é que o Clicador, em nenhuma versão anterior nem nesta, foi/está preparado para funcionar em um PC com 2 ou mais monitores.

Bem, experimente usá-lo, veja como funciona e o que você acha.

1 curtida

Bom, adicionei a funcionalidade que deve dispensar o Excel, veja esse teste pra você ter uma ideia:

Como você pode ver no Gif acima, a ideia é que você digite todos os números que serão buscados pelo Ctrl+F, no exemplo, ao invés de digitar números eu digitei as palavras do título desse artigo.

Aí é só clicar em “Processar Todas as Entradas” para ele começar a executar sequência de Ações em Loop, executando uma vez para cada “Entrada” (uma “Entrada” é uma Palavra, Frase ou Número [como xxxxxxx ou xxxxxx / xxxxxx] que será digitado pelo robô dentro do Campo aberto pelo Ctrl+F).

Cada uma das “Entradas” que você inserir deve estar em sua própria linha, é assim que você deve serpará-las.

Toda vez que uma Entrada é processada ela é apagada da TextArea onde você a digitou. Por isso, no final do gif você pode ver que a TextArea ficou vazia, porque todas as Entradas foram processadas e apagadas dessa TextArea.

O botão “Próxima Entrada” serve para o robô pegar apenas a próxima Entrada (apagando-a da TextArea) e processar a Sequência de Ações somente uma vez, usando essa Entrada no Ctrl+F.

O botão “Processar Sequência” apenas irá processar a Sequência de Ações, uma vez, e ele não apaga nada da TextArea, ou seja, não apaga nenhuma entrada. Ele irá utilizar a “Entrada Atual”, que é a última que foi processada. Também pode ser usado sem nenhuma Entrada, mas não irá digitar nada.

A Nova instrução disponível é esta (sem argumentos):

DIGITAR_ENTRADA_ATUAL

Quando chegar o momento de execução dessa instrução o robô irá digitar (caracter por caracter) a “Entrada Atual” pêga da TextArea.

Nesse exemplo, eu usei essa sequência:

//Aguarda 3000 millisegundos, ou seja, 3 segundos:
AGUARDAR: 3000

//Clica nas coordenadas x=500 e y=200:
CLICAR: 500, 200

//Abaixo faz-se Ctrl+F:
TECLAR: 17, PRESSIONAR
TECLAR: 70, PRESSIONAR_LIBERAR
TECLAR: 17, LIBERAR

AGUARDAR: 500 //Aguarda o TextField do Chrome aparecer após o Ctrl+F

DIGITAR_ENTRADA_ATUAL //escreve dentro do TextField aberto pelo Ctrl+F

Exemplo da utilização do “Processar Próxima Entrada”:

Veja que no final eu usei “Processar Sequência” para repetir a sequência com a última entrada, só não selecionou o texto todo porque o programinha que estou usando para capturar a tela e gerar o Gif parece estar atrapalhando (ele é alwaysOnTop e acho que tira o foco do Navegador).

ClicadorDeCheckbox2.zip (40,1 KB)

1 curtida

Talvez não será necessário usar o JNativeHook para você ativar o Clicador por atalho de teclado, se tudo der certo, o botão que você ativou recebe o foco após a execução da sequência, aí, é só você teclar Enter que esse botão é acionado de novo.

1 curtida

Nossa já fiquei mega ansiosa e empolgada para testar, rss
Quando penso que não pode melhorar, você surpreende :scream:

Tenho uma duvida e dai não sei se o processo acima vai funcionar, como pensei tudo com a utilização do Mouse Pro, não sei como fica esse ponto.

Quando utilizo o Excel com as informações xxxxxx e xxxxx / xxxxxx, tenho também um código que utilizo pra busca do cliente, e esses números são diferentes para cada entrada xxxxxx ou xxxxxx / xxxxx, então toda vez que acesso o sistema incluo o código e aciono um botão BUSCAR, como essa tela é fixa o Mouse Pro fazia tranquilamente, a partir dai o sistema traz as informações do cliente correspondente ao código onde constam os números xxxxx ou xxxxxx / xxxxx, depois o procedimento é como falamos:

1 - Ctrl+F busca numero xxxxx ou xxxxxx / xxxxx

2 - Pixel detectado e Checkbox selecionada clicar “Imprimir Capa”

3 - Processo se repete

Consigo fazer o processo todo com o robô, ou é algo mais difícil?

Depende, o que exatamente o Mouse Pro faz nesse procedimento? Se ele simplesmente dá clicks em pontos específicos, aguarda certos milissegundos, faz atalhos de teclado, então o Clicador já é capaz de fazer isso.

O Clicador está muito flexível agora, ele executa a sequência de instruções que você definir, na ordem que definir. A instrução Aguardar por Imagem também dá muito mais segurança de que vai dar certo do que a Instrução Aguardar por Tempo.

Mas para mim ter uma ideia da sequencia que será necessário criar, e se realmente o Clicador já consegue fazer isso, vou precisar que você detalhe bem esse processo.

Por exemplo, para cada código-do-cliente (vou chamar de cod-cliente) você vai precisar fazer Ctrl+F apenas uma vez ou mais de uma?

Uma dúvida, usar o Mouse Pro com o Clicador ainda continua dando problema?

Eu acho que o Clicador deve conseguir substituir o Mouse Pro, mas se ainda não conseguir, ele já deve estar perto disso :slight_smile:

O código ficaria no Excel da seguinte forma:

Linha 1 - código cliente 1 - xxxxx
Linha 2 - código cliente 2 - xxxxx / xxxxx

Acesso ao sistema: A tela do sistema tem a carinha da imagem que tentei desenhar rss

1 - Ctrl+C no código cliente 1 / Ctrl+V no campo Inserir do sistema
2 - Click com o mouse no botão BUSCAR, alguns segundos para receber as informações
3 - Aciono o CTRL+F
4 - Encontra o pixel laranja
5 - Seleciona a Checkbox
4 - Aciona a extensão Imprimir Capa
5 - Click no botão LIMPAR do sistema e reinicia o processo para o código cliente 2

Deu para entender mais ou menos?

Eu ainda não consegui testar a versão 2 com o Mouse Pro, vou ver na segunda e te falo como esta.

image

O código cliente é apenas um Número? ou contém outros tipos de caracters como pontos, hífens ou barras?

Pelo que entendi, deve dar para montar uma sequência sim, só que você vai ter que inserir como Entradas o cod-cliente alternando com o numero-buscado pelo Ctrl+F, exemplo de Entradas:

<codigo do cliente 1>
<xxxxxxxx>
<codigo do cliente 2>
<xxxxxxxx / xxxxxxx>
<codigo do cliente 3>
<xxxxxxxx>

Aí a sequência faz (cada um desses passos pode precisar de mais de uma instrução):

  1. clica no Campo para inserir o Codigo do Cliente;
  2. escreve o cod-cliente no campo certo;
  3. clica no botão Buscar;
  4. faz o Ctrl+F;
  5. escreve o numero-buscado;
  6. busca o pixel laranja e clica na checkbox;
  7. clica na extensão “Imprimir Capa”;
  8. Aguarda o Adobe Reader aparecer;
  9. Faz Ctrl+P;
  10. clica no botão para Imprimir;
  11. Fecha o Adobe Reader;
  12. Clica em “Limpar”.

Está correta a sequência? Se for assim, o Clicador já deve conseguir fazer sim.

Se você usar o “Processar Todas as Entradas” ele vai ficar repetindo essa sequência para todos os cod-cliente + numero-buscado, deve dar certo. :smile:

1 curtida

Sim, os códigos sao só números, sem barras e sem caracteres.
A sequência é exatamente essa :clap::clap::grin:
Ta demais esse clicador, você é demais Douglas eu já to ansiosa pra testar !!! :scream::tada:

Se essa parte em que você insere o código do Cliente fica no Topo da página, então, ao reiniciar o processo pode ser necessário rolar a página para cima, até o topo.

Atualmente o Clicador não tem nenhuma instrução de Scroll, mas você pode usar uma extensão que ao ser clicada rola a página, que seria ativado pelo Clicador:

Eu perguntei se cod-cliente possuía caracters além de números porque o Robot do Java é ruim para escrever coisas, tem muitos caracters que ele não escreve.

No caso da “/” do xxxxx / xxxxx por exemplo, eu criei um tratamento especial no código (já aproveitei e fiz o mesmo para a barra invertida “\”), onde, ao invés dele tentar teclar a barra ele faz Alt+0047, que é uma especie de atalho para a Barra comum (se você fizer esse atalho usando as teclas do teclado numérico verá a barra ser inserida). Vi esta opção aqui:

Antes eu tentei inserir os valores na Área de Transferência diretamente, aí o robô apenas faria Ctrl+V, mas inserir os valores na Área de Transferência não funcionou bem.

Olha os tratamentos especiais:

    private Map<Character, Integer[]> caracteresEspeciais = new HashMap<>();
	
	public DigitarEntradaAtual() {
		caracteresEspeciais.put('\\', new Integer[]{KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD9, KeyEvent.VK_NUMPAD2});
		caracteresEspeciais.put('/', new Integer[]{KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD4, KeyEvent.VK_NUMPAD7});
	}

O Código da Classe:

package acoes;

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;

import main.MainFX;

public class DigitarEntradaAtual extends Acao {

	private Map<Character, Integer[]> caracteresEspeciais = new HashMap<>();
	
	public DigitarEntradaAtual() {
		caracteresEspeciais.put('\\', new Integer[]{KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD9, KeyEvent.VK_NUMPAD2});
		caracteresEspeciais.put('/', new Integer[]{KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD0, KeyEvent.VK_NUMPAD4, KeyEvent.VK_NUMPAD7});
	}
	
	@Override
	public boolean executar(Robot robo) {
		for(char character : MainFX.entradaAtual.toCharArray()){
			
			Integer[] codigo = caracteresEspeciais.get(character);
			
			if (codigo != null)
				processarCaracterEspecial(robo, codigo);
			else
				processarCaracterComum(robo, character);
			
		}
		return true;
	}

	private void processarCaracterEspecial(Robot robo, Integer... codigo) {
		robo.keyPress(KeyEvent.VK_ALT);
		robo.waitForIdle();
		
		for (Integer cod : codigo) {
			robo.keyPress(cod);
			robo.waitForIdle();
			robo.keyRelease(cod);
			robo.waitForIdle();
		}
		
		robo.keyRelease(KeyEvent.VK_ALT);
		robo.waitForIdle();
	}

	private void processarCaracterComum(Robot robo, char character) {
		robo.keyPress(KeyEvent.getExtendedKeyCodeForChar(character));
		robo.waitForIdle();
		robo.keyRelease(KeyEvent.getExtendedKeyCodeForChar(character));
		robo.waitForIdle();
	}

}

Se esse robô fizer coisa errada, pode ser problema dele não estar aguardando fazer uma ação para fazer a próxima, acho que seria uma boa ideia programá-lo com robo.setAutoWaitForIdle(true); e com um pequeno delay entre cada ação, uns 200ms como na última resposta do link do StackOverflow, robo.setAutoDelay(200);. Acabei de adicionar isso aqui no código no projeto, deve evitar problemas:

private static void iniciarConfiguracoes() throws Exception {
	robo = new Robot();
	robo.setAutoWaitForIdle(true);
	robo.setAutoDelay(200);
	carregarConfiguracoesDoArquivo();
}
1 curtida

O chrome tem muita extensão que da para aproveitar, eu até desconhecia essas funcionalidades, muito legal.
Obrigada Douglas por essa dedicação no programa, são demais suas ideias e o desenvolvimento de tudo, amanha eu vou testar a versão 2 que me mandou, e se todo esse processo de realizar as ações no clicador for dar muito trabalho não se preocupe viu, já tem me ajudado muito, toda vez que entro aqui é uma surpresa boa, e as ideias ainda mais otimizadas, te agradeço muito mesmo.

Lembrei agora de um problema na implementação, eu acho que ele não vai funcionar desse jeito para a sequência, nem precisa testar aí.

O que eu acho que ele vai fazer é pegar uma Entrada, e digitá-la todas as vezes enquanto estiver rodando a mesma sequência, então, ele vai digitar o cod-cliente e depois, na hora de digitar o numero-buscado, ele vai digitar o cod-cliente de novo.

Ele só iria digitar o numero-buscado na próxima execução da sequência, digitando-o no campo do Código do Cliente.

Vou arrumar assim que tiver um tempinho.

1 curtida

Tudo bem, obrigada Douglas.
Eu vou fuçando aqui tbm pra ver se tenho alguma idéia. O último arquivo que me enviou funciona mas ele ta errando o pixel laranja as vezes, vou ajustando pra ver se consigo usar com o Mouse Pro, mas a ideia ficou muito bacana.

Agora ele é capaz de escrever várias coisas diferentes numa mesma execução da sequência, com isso já é possível criar uma sequência de instruções onde ele irá escrever primeiro o cod-cleinte e mais para frente - ainda na mesma execução da sequência - irá escrever o numero-buscado no campo aberto pelo Ctrl+F.

No gif acima, estou usando ele para executar uma busca no google, usar Ctrl+F para buscar uma palavra na página, e então voltar a página para ficar pronto para a próxima busca.

As linhas vazias são ignoradas, mas você pode usá-las para organizar as Entradas.

A sequência é essa:

//Aguarda 1000 millisegundos, ou seja, 1 segundo:
AGUARDAR: 1000

//Clica no campo de busca do google
CLICAR: 645, 408

AGUARDAR: 500

//A instrução abaixo Avança uma Entrada:
//Na Primeira Execução Avança para a Primeira Entrada; depois para as próximas
PROXIMA_ENTRADA

//Escreve a Entrada no Campo de busca do google
DIGITAR_ENTRADA_ATUAL

//Clica no fundo branco da página do google
CLICAR: 441, 318

//Clica no botão "Pesquisa Google"
CLICAR: 725, 480

AGUARDAR: 3000

//Abaixo faz-se Ctrl+F:
TECLAR: 17, PRESSIONAR
TECLAR: 70, PRESSIONAR_LIBERAR
TECLAR: 17, LIBERAR

//Aguarda o Campo Ctrl+F aparecer
AGUARDAR: 500

//Avança para a Entrada que será escrita no Campo aberto pelo Ctrl+F
PROXIMA_ENTRADA

//Escreve a Entrada no Campo aberto pelo Ctrl+F
DIGITAR_ENTRADA_ATUAL

AGUARDAR: 2000

//Clica em Voltar
CLICAR: 12, 45

Você pode usar o Paint para pegar a posição x e y na tela das coisas que serão clicadas, e também é útil para saber a posição e tamanho que áreas retangulares precisaram ter.

Agora ao clicar nos Botões da GUI do Clicador ele não irá avançar as Entradas automaticamente, ele só avança uma Entrada quando a instrução “PROXIMA_ENTRADA” é executada.

Se a instrução “DIGITAR_ENTRADA_ATUAL” for executada sem que haja uma Entrada para executar, a execução da sequência será interrompida imediatamente, e aparecerá essa mensagem:

image

ClicadorDeCheckbox2.zip (41,0 KB)

Quando ele tenta executar a instrução de detectar o pixel laranja e clicar na checkbox, e falha, ele deve fazer aparecer a Janela que mostra as Capturas feitas. Essa Janela apareceu? Como estão as Capturas dentro dela? Ele capturou o número selecionado com pixels laranja?

Infelizmente não testei muito, e quase não há testes automatizados no código, mas espero que funcione.

Deus te abençoe.

1 curtida

Esta demais Douglas, vou testar amanhã, muito mas muito obrigada viu!!! :kissing_heart::pray:
O erro do pixel que comentei foi que ele capturou o pixel no primeiro número somente, como se não tivesse os demais, exemplo :
Entrada: xxxxx / xxxxx
Capturou : x
Dai selecionou dois Checkbox, é como se ele reconhecesse somente o primeiro número, não o conjunto. Não sei se pode ser algo na configuracao, mas isso vou ajustando caso ocorra, mas ja to na fé que não vai ocontecer, rss …você me ajudou demais, e clareou as possibilidades, vou me dedicando para conseguir usar e te perturbo aqui se precisar tbm. Rss
Amém, que Deus te abençoe tbm.

A imagem capturada ficou cortada? ou foi o número xxxxx / xxxxx que não ficou completamente selecionado de laranja?

Apareceram dois checkbox na captura? Ou ele realmente chegou a clicar em duas checkbox diferentes marcando-as?

Na Captura, há mais de um numero-buscado selecionado de laranja (como por exemplo um numa linha e outro noutra linha)?

Bem, veja se você consegue reproduzir esse caso de falha, e me envia um recorte de tela das Capturas que ele fez. Acho que isso já seria o suficiente para mim entender o que ocorreu.

Se um caso de falha for reprodutível, então ele precisa ser consertado, porque significa que o Clicador irá falhar quando surgir esse caso ou um caso semelhante.