• Nenhum resultado encontrado

Sistema de Apoio à Geração e Automatização de Tarefas

N/A
N/A
Protected

Academic year: 2021

Share "Sistema de Apoio à Geração e Automatização de Tarefas"

Copied!
60
0
0

Texto

(1)

Sistema de Apoio à Geração e Automatização de Tarefas

Projeto para obtenção do grau de Mestre em Engenharia Informática e Sistemas Empresariais

Projeto realizado sob a orientação de Prof. Doutor Nuno Lopes EST/IPCA

Coorientador

Prof. Doutor João Carlos Silva EST/IPCA

Vítor Cristóvão Leal Machado - nº 2915

Escola Superior de Tecnologia Instituto Politécnico do Cávado e do Ave

21 Março 2016

(2)

Resumo

As tecnologias para automatização de tarefas são ferramentas valiosas para garantir a correta execução de processos bem como a obtenção dos resultados esperados.

Este projeto visa desenvolver uma solução para a automatização de tarefas recorrendo à captura de imagens do ecrã, à elaboração de uma sequência de ações/tarefas definidas pelo utilizador de modo a detetar falhas e garantir a obtenção dos resultados esperados no fim da execução da tarefa.

Este projeto pretende apoiar a realização de testes de software, servindo de apoio à

análise do nível de qualidade e fiabilidade de software, permitindo a redução do tempo

despendido por parte dos utilizadores/programadores na realização dos testes ou mesmo em

tarefas que se pretendam fazer.

(3)

Índice

1 Introdução ... 1

1.1 Objetivos ... 1

1.2 Perguntas de investigação ... 2

1.3 Estrutura do projeto ... 2

2 Estado da Arte ... 4

2.1 Tarefas na Interação Gráfica com o Utilizador (GUI) ... 4

2.2 Teste de Software ... 5

2.3 ConcurTaskTree (CTT) ... 7

2.4 SeleniumHQ ... 10

2.5 A Plataforma Sikuli ... 12

2.6 Automa ... 14

2.7 Cogitek RIATest 6 ... 15

2.8 Discussão ... 16

3 Sistema de apoio à criação do script ... 18

3.1 Gravação / Paragem... 19

3.2 Captura da Imagem ... 19

3.3 Execução da Script ... 20

3.4 Resultado Esperado ... 21

4 Implementação da Sistema de Apoio ... 22

4.1 Interface da Aplicação ... 22

4.2 Captura de ações de Utilizador ... 23

4.3 Funcionalidades "Espera" e "Pergunta" ... 29

4.4 Captura de Imagem e Criação do Ficheiro Computacional ... 29

(4)

4.5 Estrutura da Gravação da Imagem ... 37

4.6 Gravação do Ficheiro Computacional / Execução ... 38

4.7 Criação/Verificação das Pastas ... 39

5 Caso de Estudo ... 40

5.1 Introdução do “Post” ... 41

5.2 Inserir Informação ... 43

5.3 Verificação do "Post" ... 45

5.4 Eliminação do “Post” ... 47

5.5 Verificação da Eliminação do "Post" ... 48

6 Conclusões ... 50

6.1 Trabalho Futuro ... 51

Bibliografia ... 52

(5)

Figura 1 - Erro / Defeito / Falha (Salto na Computação, 2015) ... 6

Figura 2 - Exemplo de uma CTT (ConcurTaskTrees - Model-based User Interfaces Incubator, 2009)... 9

Figura 3 - Exemplo de uma script criada pelo SeleniumHQ ... 11

Figura 4 - Plataforma Sikuli ... 13

Figura 5 - Aplicação Automa ... 14

Figura 6 - Layout Aplicação RIATest 6 ... 15

Figura 7 - Arquitetura da Ferramenta de Apoio ... 18

Figura 8 - Layout da região de captura ... 19

Figura 9 - Janela para introdução de texto ... 20

Figura 10 - Interface gráfica da aplicação ... 22

Figura 11- Função de criação do evento para captura dos eventos Click e DoubleClick .... 24

Figura 12 - Função de criação do evento "escuta" para a capturar os eventos Click/DoubleClick ... 25

Figura 13 - Função de remover todos os eventos criados para a captura do Click/DoubleClick ... 26

Figura 14 - Função de criação dos eventos de captura do teclado ... 27

Figura 15 - Função de remover os eventos criados para a deteção dos eventos do teclado ... 28

Figura 16 - Função receção da captura dos eventos do rato ... 31

Figura 17 - Função de receção do evento Click/DoubleClick ... 32

Figura 18 - Função de tratamento do evento Click ... 33

Figura 19 - Função de abertura da região para captura da imagem ... 33

Figura 20 - Função de criação da Imagem recortada ... 35

Figura 21 - Função que simula o evento de rato invocado pelo utilizador e remove a região de captura ... 36

Figura 22 - Função de controlo do teclado aquando a captura da imagem ... 37

Figura 23 - Função responsável por efetuar o recorte da imagem ... 38

Figura 24 - Adiconar novo post no WordPress ... 40

(6)

Figura 25 - Script de introdução de novo "Post" ... 41

Figura 26 - Inserção do título do "Post" através da funcionalidade "Pergunta" ... 42

Figura 27 - Inserção do corpo do "Post" através da funcionalidade "Pergunta" ... 42

Figura 28 - Inserção do "Post", confirmação de tarefa terminada ... 43

Figura 30 - Inserção de um novo comentário ... 44

Figura 29 - Script para a criação de um novo comentário ... 44

Figura 31 - Tarefa de inserção de um comentário terminada ... 45

Figura 32 - Janela de escolha do tipo de verificação ... 45

Figura 34 - Verificação do texto do "Post" introduzido ... 46

Figura 33 - Script para validação do "Post" ... 46

Figura 35 - Tarefa de remover "Post" ... 47

Figura 36 - Script para remover o "Post"... 48

Figura 37 - Execução da verificação do "Post" ... 49

(7)

Tabela 1 - Operadores Temporais de um CTT ... 10

(8)

1

1 Introdução

A qualidade de software é uma área de conhecimento importante para o sucesso de um software, pois hoje em dia a qualificação de um produto de software significa muito para o consumidor final (Clovis, 2000).

As organizações têm alguma dificuldade em conseguir efetuar os testes necessários, pois a constante evolução tecnológica e o tempo existente para a construção de novos processos, muitas das vezes não permite empregar o tempo necessário para a execução dos devidos testes. Como os desenvolvimentos ocorrem em simultâneo com os testes, acontece que nem sempre é possível acompanhar a qualidade do software bem como os próprios desenvolvimentos efetuados.

Ferramentas para automatização de tarefas permitem às organizações executar os devidos testes para que seja detetado o maior número de defeitos possíveis de modo a que sejam corrigidos e aumentando assim a qualidade do mesmo. É muito importante que uma organização tenha um departamento de qualidade e testes de software para minimizar os impactos que possam existir quando existe uma falha de execução. Neste campo as ferramentas de automatização representam uma mais-valia (Jain, 2011).

1.1 Objetivos

Neste projeto pretende-se desenvolver um sistema que através da interpretação gráfica dos objetos escolhidos pelo utilizador criar um ficheiro computacional interpretável por uma ferramenta de reconhecimento de objetos, permitindo assim executar e validar tarefas.

A abordagem proposta pretende ser simples, útil e acima de tudo pretende apoiar à

geração e execução de tarefas efetuadas pelos utilizadores. Será uma abordagem que poderá

ser utilizada por utilizadores/organizações que pretendam gerar e automatizar tarefas de um

determinado software.

(9)

2 Esta aplicação irá recorrer às tecnologias existentes de interação com a interface gráfica (GUI) que permite através de uma aplicação ou ferramenta de âmbito "keylogger" captar as ações efetuadas pelo utilizador através de imagens/recortes.

Pretende-se que o utilizador de forma fácil, interativa e natural execute a tarefa pretendida de modo a obter um resultado rápido da tarefa a desempenhar.

Esta aplicação tem também como objetivo reduzir o tempo despendido pelo utilizador na realização da tarefa, para o utilizador possa realizar outra tarefa em simultâneo, desde que, o local seja diferente do local onde se executa a anterior tarefa.

1.2 Perguntas de investigação

Como perguntas de investigação para este projeto, pretende-se responder às seguintes questões de investigação:

• Será possível gerar e automatizar a execução de tarefas através de uma técnica de visão por computador?

• Será possível através destas técnicas garantir que as funcionalidades previstas de uma aplicação têm um comportamento correto?

1.3 Estrutura do projeto

O projeto que se apresenta está dividido em cinco capítulos.

O capítulo 2 descreve o estado da arte. Neste capítulo pretende-se abordar os conceitos aplicados nesta dissertação de forma sucinta, por forma a que o leitor se enquadre. Aqui será abordado o conceito de modelação de tarefas, testes de software, que aplicações existem e por fim uma discussão sobre as aplicações existentes vs. Sikuli.

No capítulo 3 será apresentada a arquitetura da aplicação, quais as suas funcionalidades e

seu funcionamento. Inicialmente será apresentado um esquema da arquitetura implementada

e de seguida será descrito quais as funções de cada componente da arquitetura.

(10)

3 O capítulo 4 descreve a implementação da aplicação de forma detalhada. Aqui serão apresentados todos os passos efetuados para obter a aplicação bem como serão apresentados pequenos excertos de código de forma a explicar a metodologia adotada.

No capítulo 5 será apresentado um caso de estudo. Serão demonstradas as funcionalidades desenvolvidas num contexto real, ilustrando com figuras das tarefas executadas.

Para terminar, o capítulo 6 apresenta as conclusões retiradas deste projeto e propostas para trabalho futuro.

(11)

4

2 Estado da Arte

Neste capítulo será apresentado os conceitos abordados por este projeto, de modo a ajudar a compreender melhor o que será abordado e implementado.

Pretende-se também efetuar um levantamento de aplicações existentes relacionadas com a abordagem seguida.

2.1 Tarefas na Interação Gráfica com o Utilizador (GUI)

A interação gráfica com o utilizador (GUI) pode dizer-se que é uma comunicação realizada entre o utilizador e o computador. Esta comunicação é muito importante, porque é aqui onde são produzidas as tarefas enviadas e pedidas de parte a parte e onde se obtém o resultado esperado por parte do utilizador (Prates & Barbosa, Jan. 2007). Torna-se fundamental garantir que a sua qualidade esteja bem presente. Para tal uma abordagem seguida consiste em efetuar testes adequados, para minimizar a presença de defeitos.

Os testes são a principal abordagem aplicada para avaliar o comportamento de uma aplicação, a forma mais óbvia de conseguir testar o GUI é por testes "manuais", isto é, o engenheiro de software interage manualmente com o sistema criando as suas próprias tarefas/ações. No entanto este método é bastante dispendioso porque ocupa demasiado tempo. Pelo exposto existe a necessidade de criar ferramentas que repitam estas tarefas e num curto espaço de tempo consigam apresentar o resultado da respetiva tarefa realizada (Bae, Rothermel, & Bae, 2014).

Ao nível gráfico a interação entre as duas partes, utilizador/computador, é efetuada por

widgets, que são nada mais que aplicativos adicionados ao sistema/software, que podem ser

janelas (Windows), botões, menus, ícones, grelhas, etc. Todo o tipo de representação gráfica

pode ser criada através de aplicações para criação de objetos gráficos. A interação com estes

aplicativos geralmente é realizada com o rato ou teclado. Novas tecnologias como, por

(12)

5 exemplo, os dispositivos táteis permitem interagir com o sistema fazer uso da abordagem tradicional com rato e teclado (Tablet, Smartphones, etc.) (Rodrigues, 2012).

Alguns dos widgets existentes podem ser utilizados para receber dados de entrada (input) ou dados de saída (output). O aspeto gráfico depende muito do Sistema Operativo (SO) ou do software utilizado (I. Antcheva, 2006).

As tarefas de interação com interface gráfica na perspetiva de utilizador são consideradas como um conjunto de sequências de ações discretas que pretendem obter um resultado.

Existem vários tipos de ações que nos permitem interagir com a camada gráfica como por exemplo click/duplo click no rato, inserção de texto, arrastar um objeto (Banerjee, Nguyen, Garousi, & Memon, 2013).

O resultado esperado será obtido através da utilização de aplicações computacionais, esta operação tem implícita o conceito de interação gráfica computacional. Estas tarefas de interação com o utilizador são quase sempre controladas pelo computador (Rouse, 2005).

2.2 Teste de Software

Entende-se por teste de software o processo de execução de uma determinada tarefa ou conjunto de tarefas com o objetivo de determinar, por um lado, se executando determinadas operações o resultado final é aquele que antes da sua execução foi delineado e, por outro lado, se o mesmo executou sem qualquer problema (Ammann & Offutt, 2008).

O objetivo é validar se todas as operações que foram desenvolvidas no produto funcionam corretamente sem nenhuma falha, permitindo assim certificar a qualidade do produto.

Os testes de software são uma mais-valia para organizações que pretendam desenvolver

produtos de qualidade e fiabilidade, pois os testes procuram encontrar possíveis falhas de

funcionamento (Ammann & Offutt, 2008).

(13)

Antes de mais nos testes de (Volte & Zabeu, Fev. 2004):

• Erro - significa que existe um defeito entre o resultado esperado versus obtido resultado de uma falha humana

• Defeito - significa que foi utilizado um método errado para executar a tarefa pretendida, acont

ou adicionar uma nova funcionalidade

• Falha - significa que pode ter sido originada por um erro ou erros sucessivos antes de obter o resultado esperado

uma falha no software Computação, 2015)

Figura 1 - Erro / Defeito / Falha

Ao nível da metodologia utilizada nos testes de cinco tipos de testes:

• Teste unitário -

este tipo de teste tende a efetuar testes a pequenos pedaços de código, funções, métodos, etc.;

Antes de mais nos testes de software existem diferenças entre erro, defeito e falhas

significa que existe um defeito entre o resultado esperado versus obtido resultado de uma falha humana;

significa que foi utilizado um método errado para executar a tarefa , acontece quando existe uma necessidade de corrigir algum problema ou adicionar uma nova funcionalidade;

significa que pode ter sido originada por um erro ou erros sucessivos antes de obter o resultado esperado, ocorre quando o erro e o defeito ocorrem e

software, ilustrado na Figura 1 - Erro / Defeito / Falha Computação, 2015)

Erro / Defeito / Falha (Salto na Computação, 2015)

todologia utilizada nos testes de software normalmente é constituída por

tem como objetivo descobrir erros e falhas de modo

teste tende a efetuar testes a pequenos pedaços de código, funções,

6 s entre erro, defeito e falhas

significa que existe um defeito entre o resultado esperado versus obtido, é o

significa que foi utilizado um método errado para executar a tarefa ece quando existe uma necessidade de corrigir algum problema

significa que pode ter sido originada por um erro ou erros sucessivos antes , ocorre quando o erro e o defeito ocorrem e origina Erro / Defeito / Falha. (Salto na

normalmente é constituída por

erros e falhas de modo aleatório,

teste tende a efetuar testes a pequenos pedaços de código, funções,

(14)

7

• Teste de Integração - tem como objetivo encontrar erros entre processos interligados, ou seja, se uma aplicação necessita de comunicar com um servidor remoto para executar outra operação, não pode iniciar a nova operação antes de obter a resposta. Se o software permite iniciar essa operação é considerada uma falha pois segundo o requisito só poderia iniciar a tarefa após obter a resposta do servidor. Este teste visa identificar possíveis falhas entre processos interligados;

• Teste de Sistema - visa simular o funcionamento normal do software introduzindo dados parcialmente reais para tentar identificar falhas de execução/resultado esperado. Este teste tem o objetivo de simular todas as funcionalidades do software;

• Teste de Aceitação - Este teste é semelhante ao teste de sistema, mas com uma particularidade que é apenas realizado por um grupo restrito de pessoas que pretende verificar se o produto responde às necessidades definidas inicialmente no projeto;

• Teste de Operação – Este tipo de teste é realizado por utilizadores/

administradores da organização e visa simular todo o processo de inicialização de um novo cliente final. Aqui pretende-se recriar o ambiente de instalação do produto, parametrizações necessárias do software, com o objetivo de minimizar os danos colaterais que possam acontecer no arranque de um novo projeto de implementação. (Ammann & Offutt, 2008) (Volte & Zabeu, Fev. 2004)

Neste projeto a metodologia utilizada será "Teste de Sistema", pois visa a criação de uma aplicação elaborando um script de automatização que permitirá identificar possíveis falhas e verificar se o resultado final é obtido conforme a tarefa programada.

2.3 ConcurTaskTree (CTT)

A notação ConcurTaskTree (CTT) permite modelar tarefas representando-as através de

árvore de nodos, onde o objetivo da tarefa representa a “raiz” da árvore e as "folhas" são

(15)

8 tarefas a desempenhar. Estes modelos são muitas vezes utilizados em software interativo e concebidos por especialistas (ConcurTaskTrees - Model-based User Interfaces Incubator, 2009).

Estes também podem ser utilizados em orientação de testes de tarefas. São criados perfis de operacionais cujo objetivo é representar as interações entre os utilizadores e a aplicação.

Existem quatro tipos diferentes para a representação das tarefas:

• Tarefas de Utilizador: são tarefas cuja interação com o sistema é quase nula, apenas representam uma atividade cognitiva interna, na prática é criado um input por parte do utilizador e um output por parte da Aplicação;

• Tarefas da Aplicação: representam os outputs criados pelo sistema, por exemplo resultado de uma determinada pesquisa efetuada pelo utilizador, onde não existe interação humana computador (HCI

1

);

• Tarefas de Interação: estas tarefas são nodos/pontos de decisão por parte do utilizador. São tarefas que necessitam de ação do utilizador para com a tarefa, por exemplo, a elaboração de um documento de texto;

• Tarefas Abstratas: são tarefas que representam como nodo da árvore e nele contêm sub-tarefas.

1

Human Computer Interation

(16)

9

Figura 2 - Exemplo de uma CTT (ConcurTaskTrees - Model-based User Interfaces Incubator, 2009)

Um modelo CTT possui uma semântica espalhada pelos nós representativos da árvore. O seu percurso é efetuado da esquerda para a direita em forma de profundidade e é conduzido pelos seus operadores temporais.

A Figura 2 ilustra um exemplo de uma CTT, onde a tarefa é a edição de um determinado documento/registo. Existe três tarefas distintas, abertura, edição e fecho, a tarefa "Open Document" é executada com passagem de informação para a tarefa seguinte, "Edit Document"

que executa a desativação da tarefa "Close Document" até terminar a sua.

A tarefa "Enter Content" inicia e desativa a tarefa "Error Handling" até terminar a sua tarefa, depois é executada a tarefa "Perform Error" que passa informação para a tarefa seguinte que é "Close Document" (Barbosa, Paiva, & Campos, 2011) (Madani & Parissis, 2009).

A Tabela 1 representa os operadores temporais de um modelo CTT e contém onze

operadores possíveis para o modelo:

(17)

10

Nome Sigla Descrição

Escolha T1 [] T2 Significa que T1 ou T2 será executado.

Concorrente T1|||T2 Significa que as tarefas T1 e T2 são executadas em simultâneo sem obedecer a qualquer ordem de execução.

Simultaneidade T1|[]|T2 Significa que T1 e T2 trocam informação, desde que não sejam na sua execução simultânea.

Ordem de Execução T1|=|T2 Significa que quando inicia a tarefa T1, T2 terá de aguardar o seu término para poder ser executada.

Desativação T1[>T2 Significa que a Tarefa T1 bloqueia a execução da T2 e até ao fim nunca mais é reiniciada.

Ativação T1>>T2 Significa que quando a Tarefa T1 terminar a Tarefa T2 inicia trocando informação entre elas.

Ativação com Passagem

de Informação T1[]>>T2 Significa que sempre que ocorre a tarefa T1 a tarefa T2 pode trocar informações com T1 durante as suas execuções.

Suspender/Retomar T1|>T2 Significa que a tarefa T2 bloqueia a tarefa T1 até ao seu término, após o seu término T1 reinicia a sua execução.

Iteração T* Significa que a tarefa é executada sem término até outra tarefa despoletar o seu término.

Iteração Finita T1 (n) Significa que a tarefa T1 irá executar n vezes que o utilizador assim o pretender.

Tarefas Opcionais [T] Significa que a tarefa T1 poderá executar, ou não.

Tabela 1 - Operadores Temporais de um CTT

2.4 SeleniumHQ

SeleniumHQ é uma ferramenta Web, que interage apenas em web browsers. Esta

aplicação permite criar um script de automatização com as ações de um determinado software

web ou página web (Selenium - Web Browser Automation, 2015).

(18)

11 Este software tem algumas funcionalidades interessantes, nomeadamente a geração automática da sequência de ações que o utilizador executa no web browser. O ficheiro computacional criado pelo SeleniumHQ é baseado no código executado pelo browser quando algum evento é despoletado.

A Figura 3 ilustra um exemplo de uma gravação de uma determinada sequência de ações.

A tarefa ilustrada na Figura 3 consiste na pesquisa do nome "selenium" no Google. O SeleniumHQ deteta que foi escrito o texto “selenium” no "id=lst-ib" com a instrução "type", introdução de texto, depois o Google abre automaticamente uma caixa de diálogo com os resultados possíveis para o texto "selenium". O SeleniumHQ deteta que houve uma abertura de uma caixa de diálogo com nome "/webhp?hl=pt-PT" utilizando a instrução "Open" e adiciona ao script.

Figura 3 - Exemplo de uma script criada pelo SeleniumHQ

(19)

12 O software é bastante simples de utilizar, pois apenas é necessário iniciar a gravação e parar a gravação aquando o término da tarefa que o utilizador pretende executar à posteriori.

A principal desvantagem desta ferramenta deve-se ao facto de estar limitada ao âmbito de execução de browser e efetuar a captura dos eventos via interpretação do browser. Assim, se algum objeto for alterado no seu "id" (identificador), ou método de invocação da sua ação, isto é, por exemplo um botão tem um "id" chamado "botao_exemplo", e caso seja modificado para "btn_exemplo", o SeleniumHQ já não irá reconhecer o objeto e consequentemente originará um erro na execução (Bruns, Kornstadt, & Wichmann, 2009).

2.5 A Plataforma Sikuli

A plataforma Sikuli, ilustrada na Figura 4, foi criada no MIT UI Group Design e permite

criar automatizações com recurso a visão por computador. Esta tecnologia permite capturar

padrões de imagens recorrendo a screenshots do Interface Gráfico do Utilizador (GUI)

(Hardesty, 2010).

(20)

13

Figura 4 - Plataforma Sikuli

Esta ferramenta de automatização visual foi desenvolvida na linguagem de programação Jython que é uma linguagem que permite efetuar operações sobre interfaces gráficos. Para o efeito, a ferramenta utiliza algoritmos de visão computacional para analisar o ambiente de trabalho. Esta aplicação automatiza qualquer operação que esteja no ecrã sem o recurso a qualquer outro aplicativo (API). É uma aplicação compatível com os sistemas operativos Windows, MacOS X, Linux, etc. Permite o acesso direto ao ecrã sem ser necessário executar qualquer comando, o que torna o acesso fácil à captura de imagens. (Hardesty, 2010) (Instituto de Teste de Software , 2014).

Esta aplicação ao nível da interação gráfica permite aos utilizadores identificar bem os

comandos existentes, possibilitando assim a criação da tarefa com alguma facilidade.

(21)

14 No final de cada execução o Sikuli mostra ao utilizador se a tarefa foi bem-sucedida ou se ocorreram falhas. Nesta abordagem pretende-se utilizar o Sikuli para a deteção de eventuais falhas na execução de tarefas.

2.6 Automa

Esta aplicação, ilustrada na Figura 5, existe apenas para sistemas operativos Windows, permite a criação de processos autómatos através da gravação de ações ocorridas na camada gráfica (GUI).

Figura 5 - Aplicação Automa

Esta aplicação apenas captura ações do tipo “Iniciar”, clicar num determinado elemento ou escrevendo. Para a criação do script esta aplicação funciona como um keylogger que vai

"observando" as ações que o utilizador vai executando e vai registando através de código estas

ações. Este script, após terminada a gravação, pode ser executada para replicar as ações que o

utilizador executou.

(22)

15 O layout desta aplicação não é muito apelativo, porque funciona em ambiente da linha de comandos, o que torna a interação com o utilizador bastante complicada, pois só se utiliza o teclado para introduzir as opções que o utilizador pretenda executar (Automa, 2015).

2.7 Cogitek RIATest 6

Aplicação da Cogitek o RIATest 6, ilustrada na Figura 6, permite criar testes em aplicações criadas em linguagem Adobe Flex, HTML5 e Sencha ExtJS. Esta ferramenta de automatização de tarefas funciona recorrendo a tecnologias de interação gráfica com o utilizador (GUI) para identificar os objetos e aplica as interações sobre eles.

O ambiente gráfico desta aplicação é idêntico à plataforma de desenvolvimento Eclipse. A criação dos scripts das tarefas pode ser executada pelo utilizador introduzindo os comandos que pretende aplicar sobre os objetos, ou então criando de forma automática utilizando a ferramenta de gravação.

Esta ferramenta foi desenhada para aplicações desenvolvidas em ambiente web, por isso é uma desvantagem para aplicações desktop (Cogitek, 2015).

Figura 6 - Layout Aplicação RIATest 6

(23)

16 2.8 Discussão

Em termos de comparação a plataforma Sikuli é a mais versátil, por conseguir criar testes em qualquer software e sem restrição ao nível de ambiente onde o teste executa.

O SeleniumHQ é uma plataforma mais evoluída que o Sikuli ao nível da criação do teste, mas é mais restritiva ao nível do ambiente onde se pretende efetuar o teste, pois só funciona em aplicações que funcionem em ambiente web, mais concretamente em browser. Além disso, a forma de captura dos eventos/tipo de ação que o SeleniumHQ utiliza cria também uma barreira na mudança da tarefa, isto porque se algum objeto que esteja referenciado no script do teste seja alterado, por exemplo, o seu "id" o script deixará de funcionar, pois o objeto já não existirá. Esta desvantagem é partilhada também pelo Sikuli, pois se o objeto não se encontrar visível no ecrã também o script deixará de funcionar.

A ferramenta Automa, é uma ferramenta que também se encontra restrita a sistemas operativos Windows, mas consegue operar em vários tipos de aplicações, sejam web como executáveis. Esta aplicação permite criar uma tarefa gravando os passos que o utilizador vai executando, ou então escrevendo os comandos e introduzindo as imagens com os locais onde será aplicado o comando.

Em termos de comparação com o Sikuli o ambiente gráfico é muito fraco, porque opera em linha de comandos do sistema operativo Windows e a única vantagem é permitir efetuar uma gravação criando automaticamente o script programático.

A ferramenta RIATest 6 é mais complexa, isto porque o seu funcionamento é idêntico a

uma ferramenta de programação, o que por um lado é apelativo para utilizadores ambientados

a ferramentas de programação, por outro lado não é apelativo para utilizadores comuns. Esta

ferramenta também é restrita a ambientes web, mas apenas opera em aplicações

desenvolvidas em determinadas linguagens, caso contrário não consegue detetar as ações e

por sua vez não cria o script computacional.

(24)

17 Perante estes factos o Sikuli é uma ferramenta mais fiável pois funciona ao nível da camada gráfica, mais concretamente na interpretação gráfica dos objetos desenhados, tem um ambiente gráfico para criar o script mais apelativo e contém já alguns comandos mais utilizados para a criação de uma tarefa. A desvantagem é não ter a possibilidade da criação automática da tarefa identificando qual a ação a executar no determinado objeto.

O Sikuli foi a escolhida para este projeto por se mostrar intuitiva na criação de scripts para

a execução de uma automatização e por conseguir obter um resultado num curto espaço de

tempo.

(25)

18

3 Sistema de apoio à criação do script

Figura 7 - Arquitetura da Ferramenta de Apoio

Nesta secção pretende-se descrever cada componente da arquitetura da ferramenta de apoio à criação de scripts.

Na Figura 7, o leitor pode visualizar a arquitetura realizada para a elaboração da aplicação.

A componente GUI tem uma interação direta com aplicação, isto é, enquanto a GUI vai

executando as suas tarefas aplicação ao mesmo tempo vai interagindo com o utilizador para

efetuar os recortes e gravar quais os tipos de ações que se vão executando.

(26)

19 Depois a script será criada e enviada para a funcionalidade de execução na plataforma Sikuli. Esta plataforma também recorrerá à GUI para executar as ações criadas pelo utilizador e aplicando-as na GUI.

3.1 Gravação / Paragem

A geração do ficheiro é efetuada durante a gravação. Para iniciar a gravação é necessário clicar no botão de início da gravação, após clicar é despoletado uma janela para introdução do nome da script. Este nome do script será utilizado para a criação da pasta e ficheiro, pois têm de ser criados com o mesmo nome para depois poder ser executada via linha de comandos do Windows. Para dar como terminada a gravação da tarefa apenas é necessário clicar no botão de finalização da tarefa.

Após iniciar a gravação a janela da aplicação é minimizada para obter liberdade na execução da tarefa. Todas as ações efetuadas sobre as funcionalidades do sistema de apoio à geração de tarefas são ignoradas por parte da “escuta” dos eventos. Deste modo o utilizador poderá escolher com liberdade os passos que pretende realizar.

3.2 Captura da Imagem

Figura 8 - Layout da região de captura

(27)

20 A Figura 8 ilustra a região para o recorte da imagem a aplicar depois na ação capturada. A região de recorte tem uma tonalidade amarela que significa que a zona de captura foi ativada.

Para definir o recorte deverá utilizar o rato e definir o ponto de partida arrastando até ao ponto de chegada.

A zona do recorte ficará com contorno a vermelho que poderá ser redimensionado à posteriori caso o utilizador tenha a necessidade de aumentar ou diminuir a região.

Esta região de captura apenas é acionada quando ocorre um evento de click, duplo click, no click do botão de “Espera” ou no click do botão de “Pergunta”. O primeiro botão, "Espera", indica que aplicação fica "parada" enquanto um determinado elemento não surge no ecrã, este elemento será o recorte que o utilizador efetuar.

O segundo botão, "Pergunta", serve para introduzir um determinado texto num determinado elemento, elemento esse que será o recorte da imagem efetuada. Quando o click neste botão ocorre é despoletada uma janela, ilustrada na Figura 9, que permite ao utilizador definir um texto que será apresentado ao utilizador aquando da execução da tarefa.

Figura 9 - Janela para introdução de texto

3.3 Execução da Script

Para a execução da script apenas é necessário clicar no botão de execução de tarefas. Se clicar após uma gravação de tarefa será automaticamente executada.

Para executar uma tarefa já gravada, terá de clicar no botão de “Escolher Tarefa” e será

aberta uma janela de diálogo para escolher qual a pasta onde o script a executar se encontra.

(28)

21 Este funcionamento executa em modo oculto, isto porque o envio da script criada para o Sikuli é efetuado via linha de comandos e a linguagem c# permite efetuar esta operação com a janela da linha de comando minimizada, criando assim um “ambiente” mais agradável ao utilizador. Se a execução do script for executada com sucesso é emitida uma janela de aviso a informar o utilizar que a tarefa terminou com sucesso, caso contrário é emitida uma janela com o erro associado.

3.4 Resultado Esperado

Como resultado esperado, pretende-se com este projeto criar uma aplicação que permita ao utilizador criar e executar uma determinada tarefa com maior facilidade e sem conhecimento das funcionalidades da ferramenta Sikuli.

Com esta aplicação, as organizações ou utilizadores podem determinar se um determinado processo contém erros, isto é determinar se a execução da tarefa consegue terminar ou não, assim o utilizador conseguirá identificar onde o erro ocorreu, e possivelmente encontrar possíveis melhorias ao seu funcionamento.

Esta aplicação pretende ser uma versão melhorada, onde o utilizador não necessita de

conhecer quais, nem como, aplicar os comandos do Sikuli, garantindo algumas funcionalidades

existentes da Plataforma Sikuli e acima de tudo mais intuitiva ao utilizador.

(29)

22

4 Implementação da Sistema de Apoio

Neste capítulo será abordado a implementação da ferramenta com mais detalhe. Aqui será explicado como todas as ações foram implementadas e respetivo código para exemplificação.

Nas seções seguintes irá ser abordado como foi implementado a componente de

"keylogger", significa que existe uma aplicação "invisível" que captura as ações efetuadas pelo utilizador.

Será também explicado como foram implementadas as funcionalidades de "Espera" e

"Pergunta".

Para iniciar será apresentado o interface gráfico da aplicação com todos os locais onde os eventos irão ocorrer. Depois serão abordados a parte de como será efetuada a captura da imagem, sua gravação e respetiva criação do código interpretativo do Sikuli para a criação do ficheiro.

Para finalizar será abordado como será efetuada a gravação do script computacional e a parte da execução da mesma a partir desta aplicação.

4.1 Interface da Aplicação

Figura 10 - Interface gráfica da aplicação

(30)

23 A Figura 10 representa a interface gráfica da aplicação criada. No lado esquerdo da aplicação encontram-se o botão de gravação/paragem, de seguida os botões de "Espera",

"Verificação" e "Pergunta". O lado direito da aplicação contém o botão para execução da tarefa em curso, ou uma selecionada pelo utilizador, o botão para escolher uma tarefa já criada e por fim o botão para sair da aplicação.

De seguida, contém o botão para o utilizador indicar qual a pasta dos ficheiros do Sikuli e o outro botão serve para o utilizador indicar qual a pasta para guardar as gravações criadas.

Para validação das pastas foram criados os botões em frente a cada um dos locais para verificar a existência das mesmas.

4.2 Captura de ações de Utilizador

Consideram-se ações de Utilizador os eventos ocorridos no click/duplo click do rato e

teclas premidas. Para a captura das ações de utilizador, será utilizada uma biblioteca

denominada "HookManager". A biblioteca é open source e permite utilizar os recursos da

biblioteca user32.dll do Windows para "escutar" os eventos ocorridos com o rato e teclado

(Mamaladze, 2011).

(31)

24 Desta biblioteca iremos utilizar a função "MouseDoubleClick", como ilustra a Figura 11, para criar o evento de “escuta” para as ações de rato, click e duplo click. Esta função é responsável por criar também a função de controlo do evento click do duplo click, para isso é utilizado a função "GetDoubleClickTime" da biblioteca user32.dll para saber qual o tempo de duplo click que se encontra definido no computador, esta parte é adaptável a qualquer computador, para aplicar ao timer " s_ DoubleClickTimer " .

public static event MouseEventHandler MouseDoubleClick {

add {

EnsureSubscribedToGlobalMouseEvents();

if (s_MouseDoubleClick == null) {

//We create a timer to monitor interval between two clicks s_DoubleClickTimer = new Timer

{

//This interval will be set to the value we retrive from windows. This is a windows setting from contro planel.

Interval = GetDoubleClickTime(),

//We do not start timer yet. It will be start when the click occures.

Enabled = false };

//We define the callback function for the timer s_DoubleClickTimer.Tick += DoubleClickTimeElapsed;

//We start to monitor mouse up event.

s_MouseDown += OnMouseUp;

}

s_MouseDoubleClick += value;

} remove {

if (s_MouseDoubleClick != null) {

s_MouseDoubleClick -= value;

if (s_MouseDoubleClick == null) {

//Stop monitoring mouse up s_MouseDown -= OnMouseUp;

//Dispose the timer

s_DoubleClickTimer.Tick -= DoubleClickTimeElapsed;

s_DoubleClickTimer = null;

} }

TryUnsubscribeFromGlobalMouseEvents();

} }

Figura 11- Função de criação do evento para captura dos eventos Click e DoubleClick

(32)

25 A função "EnsureSubscribedToGlobalMouseEvents", como ilustra a Figura 12, é responsável por criar o evento de "escuta/espera do acontecimento" para a captura dos eventos do rato, a função "SetWindowsHookEx" é sempre executada sempre que existe um click do rato, e este evento é adicionado à aplicação criada. O parâmetro de entrada

"WH_MOUSE_LL" serve para indicar qual o tipo de "escuta" que se pretende observar. A variável "s_MouseDelegate" contém a informação da função de retorno, que é onde será tratado os eventos recebidos.

Para que a aplicação não detete os eventos executados na aplicação que vai ser criada, foi criada uma variável global que guarda o identificador do processo da aplicação, para que depois os eventos sejam descartados sempre que haja alguma interação por parte do utilizador na aplicação. Caso contrário iria abrir sempre a região para recorte da imagem.

private static void EnsureSubscribedToGlobalMouseEvents() {

// install Mouse hook only if it is not installed and must be installed if (s_MouseHookHandle == 0)

{

//See comment of this field. To avoid GC to clean it up.

s_MouseDelegate = MouseHookProc;

GlobalFunctions.idProgram = Process.GetCurrentProcess().Id;

//install hook

using (ProcessModule module = Process.GetCurrentProcess().MainModule) {

s_MouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL, s_MouseDelegate, GetModuleHandle(module.ModuleName), 0);

}

//If SetWindowsHookEx fails.

if (s_MouseHookHandle == 0) {

//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.

int errorCode = Marshal.GetLastWin32Error();

//do cleanup

//Initializes and throws a new instance of the Win32Exception class with the specified error.

throw new Win32Exception(errorCode);

} } }

Figura 12 - Função de criação do evento "escuta" para a capturar os eventos Click/DoubleClick

(33)

26 A função “TryUnsubscribeFromGlobalMouseEvents”, ilustrada na Figura 13, é responsável pela destruição das "escutas" criadas para a captura das ações de rato. Esta função só é invocada quando é desligada a gravação do teste.

private static void TryUnsubscribeFromGlobalMouseEvents() {

//if no subsribers are registered unsubsribe from hook if (s_MouseClick == null ||

s_MouseDown == null ||

s_MouseMove == null ||

s_MouseUp == null ||

s_MouseClickExt == null ||

s_MouseMoveExt == null ||

s_MouseWheel == null) {

ForceUnsunscribeFromGlobalMouseEvents();

} }

private static void ForceUnsunscribeFromGlobalMouseEvents() {

if (s_MouseHookHandle != 0) {

//uninstall hook

int result = UnhookWindowsHookEx(s_MouseHookHandle);

//reset invalid handle s_MouseHookHandle = 0;

//Free up for GC

s_MouseDelegate = null;

//if failed and exception must be thrown if (result == 0)

{

//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.

int errorCode = Marshal.GetLastWin32Error();

//Initializes and throws a new instance of the Win32Exception class with the specified error.

throw new Win32Exception(errorCode);

} } }

Figura 13 - Função de remover todos os eventos criados para a captura do Click/DoubleClick

(34)

27 Da mesma biblioteca irá utilizar-se a função "KeyDown", ilustrada na Figura 14, para criar o evento de "escuta" para as ações do teclado. Nesta função irá ser criado a "escuta"

responsável pela captura dos eventos das teclas. Para isso será utilizado a mesma função

"SetWindowsHookEx" para criar os eventos do teclado. Para este caso o parâmetro de entrada

"WH_KEYBOARD_LL" serve para indicar qual o tipo de "escuta" que tem de observar. A variável

public static event KeyEventHandler KeyDown {

add {

EnsureSubscribedToGlobalKeyboardEvents();

s_KeyDown += value;

} remove {

s_KeyDown -= value;

TryUnsubscribeFromGlobalKeyboardEvents();

} }

private static void EnsureSubscribedToGlobalKeyboardEvents() {

// install Keyboard hook only if it is not installed and must be installed if (s_KeyboardHookHandle == 0)

{

//See comment of this field. To avoid GC to clean it up.

s_KeyboardDelegate = KeyboardHookProc;

//install hook

using (ProcessModule module = Process.GetCurrentProcess().MainModule) {

s_KeyboardHookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, s_KeyboardDelegate, GetModuleHandle(module.ModuleName), 0);

}

//If SetWindowsHookEx fails.

if (s_KeyboardHookHandle == 0) {

//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.

int errorCode = Marshal.GetLastWin32Error();

//do cleanup

//Initializes and throws a new instance of the Win32Exception class with the specified error.

throw new Win32Exception(errorCode);

} } }

Figura 14 - Função de criação dos eventos de captura do teclado

(35)

28

"s_KeyboardDelegate" contém a informação da função de retorno. Os eventos recebidos são

tratados nesta função.

A função "TryUnsubscribeFromGlobalKeyboardEvents", ilustrada na Figura 15, é responsável pela destruição dos eventos adicionados para a escuta dos eventos do teclado. A função “UnhookWindowsHookEx” recebe como argumento a função de "escuta" e remove a captura dos eventos do teclado.

private static void TryUnsubscribeFromGlobalKeyboardEvents() {

//if no subsribers are registered unsubsribe from hook

if (s_KeyDown == null && _KeyUp == null && s_KeyPress == null) {

ForceUnsunscribeFromGlobalKeyboardEvents();

} }

private static void ForceUnsunscribeFromGlobalKeyboardEvents() {

if (s_KeyboardHookHandle != 0) {

//uninstall hook

int result = UnhookWindowsHookEx(s_KeyboardHookHandle);

//reset invalid handle s_KeyboardHookHandle = 0;

//Free up for GC

s_KeyboardDelegate = null;

//if failed and exception must be thrown if (result == 0)

{

//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.

int errorCode = Marshal.GetLastWin32Error();

//Initializes and throws a new instance of the Win32Exception class with the specified error.

throw new Win32Exception(errorCode);

} } }

Figura 15 - Função de remover os eventos criados para a deteção dos eventos do teclado

(36)

4.3 Funcionalidades "Espera" e "Pergunta"

A "Espera" e "Pergunta" são funcionalidades que podem ser úteis numa determinada tarefa. Estas são semelhantes,

determinado elemento existe no e

de procurar um determinado elemento no

A funcionalidade "Espera" é representada pelo região de captura para definir a região.

elemento surgir no ecrã é-lhe atribuído um determinado duração é de 5 minutos.

A funcionalidade "Pergunta" é representada pelo ícone

automaticamente a região de captura para definir a região onde

definido pelo utilizador. Após escolher a região será apresentado uma caixa de diálogo para introdução do texto à pergunta que o utilizador pretende efetuar.

Esta funcionalidade é útil para casos onde exista um objeto para aleatórios.

4.4 Captura de Imagem e Criação do A captura de imagem é

com estas imagens que o Sikuli consegue identificar os objetos no ecrã e executar ações sobre eles.

A captura é efetuada na função definida na variável "

"MouseHookProc", ilustrado na

"SetWindowsHookEx".

Esta função recebe três parâmetros

superior ou igual a 0 significa que pertence a um evento de rato.

variável de controlo para saber se a aplicação se encontra em modo de captura de imagem, deste modo ignorar as ações do

Funcionalidades "Espera" e "Pergunta"

e "Pergunta" são funcionalidades que podem ser úteis numa determinada semelhantes, visto que têm o mesmo conceito, ou seja,

minado elemento existe no ecrã. A funcionalidade "Espera" e a "Pergunta"

um determinado elemento no ecrã.

A funcionalidade "Espera" é representada pelo ícone que abre

região de captura para definir a região. Como o objetivo é "parar" a tarefa até um determinado lhe atribuído um determinado tempo. O t

A funcionalidade "Pergunta" é representada pelo ícone e permite abrir automaticamente a região de captura para definir a região onde será

definido pelo utilizador. Após escolher a região será apresentado uma caixa de diálogo para introdução do texto à pergunta que o utilizador pretende efetuar.

Esta funcionalidade é útil para casos onde exista um objeto para a

Captura de Imagem e Criação do Ficheiro Computacional

A captura de imagem é uma componente importante para o funcionamento do Sikuli, é ue o Sikuli consegue identificar os objetos no ecrã e executar ações sobre

é efetuada na função definida na variável "s_MouseDelegate

"MouseHookProc", ilustrado na Figura 16, aquando a criação da "escuta" na função

três parâmetros. O parâmetro "nCode" valida o tipo de código.

superior ou igual a 0 significa que pertence a um evento de rato. Foi necessário criar uma variável de controlo para saber se a aplicação se encontra em modo de captura de imagem,

as ações do rato que possam ocorrer enquanto a captura não é finalizada.

29 e "Pergunta" são funcionalidades que podem ser úteis numa determinada ou seja, validar se um a "Pergunta" têm o objetivo

que abre automaticamente a tarefa até um determinado O tempo por defeito da

e permite abrir

será introduzido o texto definido pelo utilizador. Após escolher a região será apresentado uma caixa de diálogo para

a introdução de valores

Ficheiro Computacional

importante para o funcionamento do Sikuli, é ue o Sikuli consegue identificar os objetos no ecrã e executar ações sobre

s_MouseDelegate", que se chama , aquando a criação da "escuta" na função

"nCode" valida o tipo de código. Se for

oi necessário criar uma

variável de controlo para saber se a aplicação se encontra em modo de captura de imagem, e

rato que possam ocorrer enquanto a captura não é finalizada.

(37)

30 A variável "mouseHookStruct" contém a informação do tipo de evento que ocorreu. Esta sua estrutura encontra-se na biblioteca "HookManager.Structures". Se o evento for do tipo

"click" ou "doubleClick" é invocada a função atribuída à variável “s_MouseDown”. Se ocorrer o

evento de "WM_MOUSEWHEEL", roda do rato, é adicionado no momento o código

interpretável pelo Sikuli ao ficheiro. O código irá incidir sobre a última captura

(38)

31 ocorrida.

private static int MouseHookProc(int nCode, int wParam, IntPtr lParam) {

if (nCode >= 0) {

if (GlobalFunctions.screenShotActive == false) {

ouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));

MouseButtons button = MouseButtons.None;

short mouseDelta = 0;

int clickCount = 0;

bool mouseDown = false;

switch (wParam) {

case WM_LBUTTONDOWN:

mouseDown = true;

button = MouseButtons.Left;

clickCount = 1;

break;

case WM_RBUTTONDOWN:

mouseDown = true;

button = MouseButtons.Right;

clickCount = 1;

break;

case WM_MOUSEWHEEL:

mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff);

String nameImgScreen = "screenSikuli_seq_" +

GlobalFunctions.sequenceFileName.ToString() + ".png";

if (mouseDelta > 0)

{ GlobalFunctions.txtfileSikuli += "wheel(\"" + nameImgScreen + "\", WHEEL_UP, 1);\n"; }

else

{ GlobalFunctions.txtfileSikuli += "wheel(\"" + nameImgScreen + "\", WHEEL_DOWN, 1);\n"; }

break;

}

MouseEventExtArgs e = new

MouseEventExtArgs(button,clickCount,mouseHookStruct.Point.x,mouseHookStruct.Point.y,mo useDelta);

//Mouse down

if (s_MouseDown != null && mouseDown) { s_MouseDown.Invoke(null, e); }

if (e.Handled) { return -1; } } }

return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam);

}

Figura 16 - Função receção da captura dos eventos do rato

(39)

32 A função "OnMouseUp", ilustrada na Figura 17. É a função que efetua o processamento do Click ou DoubleClick. Se o evento for de Click o seu tratamento é efetuado na função do timer, ilustrada na Figura 18, que pretende controlar se passado o tempo definido na função

"GetDoubleClickTime" ocorreu ou não o evento DoubleClick.

private static void OnMouseUp(object sender, MouseEventArgs e) {

//This should not heppen if (e.Clicks < 1) {

return;

}

//If the secon click heppened on the same button if (e.Button.Equals(s_PrevClickedButton))

{

if (s_MouseDoubleClick!=null) {

if (GlobalFunctions.screenShotActive == false) {

GlobalFunctions.controlButton = "DoubleClick";

}

showCanvasScreenShot();

//Fire double click

s_MouseDoubleClick.Invoke(null, e);

}

//Stop timer

s_DoubleClickTimer.Enabled = false;

s_PrevClickedButton = MouseButtons.None;

} else {

//If it was the firts click start the timer s_DoubleClickTimer.Enabled = true;

s_PrevClickedButton = e.Button;

} }

Figura 17 - Função de receção do evento Click/DoubleClick

(40)

33 A função "showCanvasScreenShot", ilustrada na Figura 19, contém o código para abrir a região de captura. Para efetuar a captura foi utilizado uma parte de uma ferramenta Open Source (GuyThiebaut, 2012) que cria um formulário com transparência e através do rato cria-se a região onde depois o evento irá ocorrer. Para gravar a imagem e criar o código Sikuli correspondente é necessário efetuar duplo click em cima da região ou premir a tecla S. Para cancelar a captura basta premir a tecla “ESC” e a captura é descartada.

public static void showCanvasScreenShot() {

if (GlobalFunctions.screenShotActive == false) {

//# Get Process Active

IntPtr foregroundWindowsHandle = GetForegroundWindow();

int idp = 0;

GetWindowThreadProcessId(foregroundWindowsHandle, out idp);

if (GlobalFunctions.idProgram != idp || GlobalFunctions.controlButton == "Wait"

|| GlobalFunctions.controlButton == "exclamation" || GlobalFunctions.controlButton ==

"question") {

//# Hide Window

Program.controlPanel.Hide();

//# Show Region from Capture

CanvasRegionCapture form1 = new CanvasRegionCapture();

form1.InstanceRef = Program.controlPanel;

form1.Show();

GlobalFunctions.screenShotActive = true;

GlobalFunctions.mousePoint = Cursor.Position;

} } }

private static void DoubleClickTimeElapsed(object sender, EventArgs e) {

//Timer is alapsed and no second click ocuured s_DoubleClickTimer.Enabled = false;

s_PrevClickedButton = MouseButtons.None;

if (GlobalFunctions.screenShotActive == false) {

GlobalFunctions.controlButton = "Click";

}

showCanvasScreenShot();

}

Figura 18 - Função de tratamento do evento Click

Figura 19 - Função de abertura da região para captura da imagem

(41)

34 Para efetuar a gravação da captura foi utilizada a função "SaveSelection", ilustrada na Figura 20. Mediante o valor enviado para a variável de controlo dos eventos ocorridos

"GlobalFunctions.controlButton" é adicionado ao script o tipo de ação correspondente à ação

capturada. Depois na função "CaptureImage", da Class "ScreenShot", é onde se realiza a

captura da região. Nesta função são enviadas as coordenadas da região e através da

funcionalidade Bitmap é criado a imagem png.

(42)

35

public void SaveSelection(bool showCursor) {

Point curPos = new Point(Cursor.Position.X - CurrentTopLeft.X, Cursor.Position.Y - CurrentTopLeft.Y);

Size curSize = new Size();

curSize.Height = Cursor.Current.Size.Height;

curSize.Width = Cursor.Current.Size.Width;

ScreenPath = "";

//Next file

GlobalFunctions.sequenceFileName++;

String nameImgScreen = "screenSikuli_seq_" + GlobalFunctions.sequenceFileName.ToString() + ".png";

ScreenPath = GlobalFunctions.pathFolder + "\\" + GlobalFunctions.pathProfile +

"\\" + nameImgScreen;

switch (GlobalFunctions.controlButton) {

case "Click":

capture = true;

GlobalFunctions.txtfileSikuli += "click(\"" + nameImgScreen + "\");\n";

break;

case "DoubleClick":

capture = true;

GlobalFunctions.txtfileSikuli += "doubleClick(\"" + nameImgScreen + "\");\n";

break;

case "Wait":

GlobalFunctions.txtfileSikuli += "wait(\"" + nameImgScreen + "\", 300000);\n";

break;

case "exclamation":

GlobalFunctions.txtfileSikuli += "try:\n\tif(find(\"" + nameImgScreen +

"\")):\n\t\tpopup(\"Objeto existe\")\n\telse:\n\t\tpopup(\"Objeto

inexistente\")\nexcept FindFailed:\n\tpopup(\"Objeto inexistente\");\n";

break;

default:

break;

}

this.Opacity = 0;

if (ScreenPath != "") {

//Allow 250 milliseconds for the screen to repaint itself (we don't want to include this form in the capture)

System.Threading.Thread.Sleep(250);

Point StartPoint = new Point(CurrentTopLeft.X, CurrentTopLeft.Y);

Rectangle bounds = new Rectangle(CurrentTopLeft.X, CurrentTopLeft.Y, CurrentBottomRight.X - CurrentTopLeft.X, CurrentBottomRight.Y - CurrentTopLeft.Y);

ScreenShot.CaptureImage(showCursor, curSize, curPos, StartPoint, Point.Empty, bounds, ScreenPath);

closeWindow();

} else {

MessageBox.Show("A região selecionada foi ignorada.", "", MessageBoxButtons.OK);

closeWindow();

} }

Figura 20 - Função de criação da Imagem recortada

(43)

36 Por fim, na função "closeWindow", ilustrada na Figura 21, é a responsável por retirar a região de captura. Caso a ação seja click/duplo click esta será repetida, através da função

"mouse_event" da Class user32.dll, no local onde ocorreu, isto para que o utilizador prossiga na sua tarefa sem ter a necessidade de voltar a efetuar o mesmo procedimento.

private void closeWindow() {

this.Close();

if (capture == true) {

Thread.Sleep(300);

SetCursorPos(GlobalFunctions.mousePoint.X, GlobalFunctions.mousePoint.Y);

Thread.Sleep(100);

switch (GlobalFunctions.controlButton) {

case "Click":

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

break;

case "DoubleClick":

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

Thread.Sleep(50);

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

break;

} }

if (GlobalFunctions.controlButton == "question") {

//# Show Region from Capture Question form1 = new Question();

form1.InstanceRef = m_InstanceRef;

form1.Show();

} else {

GlobalFunctions.controlButton = "";

GlobalFunctions.screenShotActive = false;

m_InstanceRef.Show();

}

capture = false;

}

Figura 21 - Função que simula o evento de rato invocado pelo utilizador e remove a região de captura

(44)

37 De modo a facilitar o funcionamento da captura o Utilizador pode utilizar as teclas "S", para gravar ou a tecla "ESC" para cancelar a captura. Estas opções são controladas na função

"key_press", ilustrada na Figura 22.

4.5 Estrutura da Gravação da Imagem

A "CaptureImage", ilustrada na Figura 23, tem como função efetuar a captura da região efetuada pelo utilizador e gravar diretamente no disco mediante caminho enviado na variável

"FilePath". Para retirar a imagem recorreu-se à biblioteca gráfica "Graphics" presente na linguagem c# que nos permite enviando a localização inicial e final e sua dimensão efetuar o recorte dessa região. Para guardar a respetiva região recorreu-se à biblioteca "Bitmap" que converte o resultado do “Graphics” e grava no local enviado com o formato pretendido, neste projeto o formato escolhido foi o png, razão pela qual o tamanho gerado, a qualidade e pelos testes efetuados na interpretação da imagem por parte do Sikuli é suficiente para encontrar a

public void key_press(object sender, KeyEventArgs e) {

if (e.KeyCode.ToString() == "S" && (RectangleDrawn && (CursorPosition() ==

CursPos.WithinSelectionArea || CursorPosition() == CursPos.OutsideSelectionArea))) {

SaveSelection(true);

}

else if (e.KeyValue == 27) //# ESC {

MessageBox.Show("Captura Cancelada.", "", MessageBoxButtons.OK);

closeWindow();

} }

Figura 22 - Função de controlo do teclado aquando a captura da imagem

Referências

Documentos relacionados

Soneto Dormindo vi a cândida Poesia Testemunhos impressos – Obras de Domingos dos Reis Quita, chamado entre os da Arcadia Lusitana Alcino Micenio, segunda edição correcta, e

Distribuições das deformações ao longo da sobreposição de uma junta com t = 5 mm e L = 12.5 mm, obtidas por modelos de EF com análises elasto-plásticas para a carga de

Esta acção era de extrema necessidade uma vez que se os stocks no BaaN estivessem errados, todos os procedimentos que tem como base esse stock seriam executadas de

6 Num regime monárquico e de desigualdade social, sem partidos políticos, uma carta outor- gada pelo rei nada tinha realmente com o povo, considerado como o conjunto de

O segundo Beneficiário será designado pelo Segurado na Proposta de Adesão, podendo ser substituído a qualquer tempo, mediante solicitação formal assinada pelo próprio Segurado, para

¾ Segundo nível • Terceiro nível – Quarto nível A FAMÍLIA PROFIBUS A FAMÍLIA PROFIBUS PROFIBUS-FMS PROFIBUS-FMS é a solução de propósito geral para comunicação de

O objetivo do curso foi oportunizar aos participantes, um contato direto com as plantas nativas do Cerrado para identificação de espécies com potencial

Portanto, mesmo percebendo a presença da música em diferentes situações no ambiente de educação infantil, percebe-se que as atividades relacionadas ao fazer musical ainda são