Automação de testes em aplicação Web utilizando Watir parte 1

imagem de Raphael Soares

Logo WatirObjetivos: Este artigo irá apresentar a ferramenta Watir como opção de uso para automação de testes web, falaremos dos conceitos básicos da linguagem e passaremos por demonstrações de uso. Minha idéia é de poder demonstrar desde o uso básico da ferramenta até alguns casos mais avançados e no final dar algumas dicas das principais dificuldades encontradas por quem está iniciando no uso e também algumas dicas que facilitam o uso e trazem uma maior produtividade.

Apresentação: Web Application Testing in Ruby ou simplesmente WATIR, é um framework criado com o objetivo de permitir a automação de testes em aplicações e páginas Web. Sua abordagem é feita diretamente com a manipulação do browser, simulando uma navegação do usuário pela página. Até pouco tempo, Watir trabalhava somente com Internet Explorer (IE) 5.5, 6 e 7 utilizado em Windows 2000, XP, 2003 Server e Vista, porém as últimas versões trazem suporte a Firefox para Windows, Linux e Mac, possibilitando a validação de uma aplicação em diversos ambientes.

Watir é implementada e mantida por Bret Pettichord, Paul Rogers, Jonathan Kohl, Angrez Singh, Charley Baker e Zeljko Filipin. Watir é opensource e com seus comandos e funções particulares permite então que possamos controlar os objetos HTML e JavaScript presentes na aplicação Web, simulando os cliques em links, botões e os demais campos. Watir tem sido usado para testes de sistemas, testes funcionais e teste de aceitação do usuário. Como seu próprio nome diz (Web Application Testing in Ruby), Watir é baseada na linguagem de programação Ruby, que tem se destacado como uma forte ferramenta para desenvolvimento Web apoiado por um framework chamado Rails. Framework este que vem ganhando adeptos principalmente em projetos que utilizam metodologias “ágeis” como o Xp e o Scrum, inclusive no mercado brasileiro. Em minhas referências estão alguns sites interessantes para quem queira conhecer mais sobre Rails. Apresentarei de forma resumida a linguagem Ruby, pois torna-se necessário o conhecimento básico da linguagem para se aproveitar melhor os recursos do Watir.

Ruby:A linguagem Ruby é definida como (Rangel, 2006):Ruby é uma linguagem de script interpretada para programação orientada a objetos de um modo fácil e rápido. Ela tem vários recursos para processar arquivos de texto e para fazer tarefas de gerenciamento de sistema (assim como o Perl). Ela é simples, direto ao ponto, extensível e portável. Oh, preciso mencionar, é totalmente livre, o que significa não só livre de precisar pagar para usá-la, mas também a liberdade de usar, copiar, modificar e distribuí-la. Ainda segundo Rangel (Rangel, 2006):

  • Ruby tem uma sintaxe simples, parcialmente inspirada por Eiffel e Ada.
  • Ruby tem recursos de tratamento de exceções, assim como Java e Python, para deixar mais fácil o tratamento de erros.
  • Os operadores do Ruby são redefinidos facilmente.
  • Ruby é uma linguagem completa e pura orientada a objetos. Isso significa que todo dado em Ruby é um objeto, não do jeito de Python e Perl, mas mais do jeito do SmallTalk: sem exceções. Por exemplo, em Ruby, o número 1 é uma instância da classe Fixnum.
  • Ruby não precisa de declaração de variáveis. Apenas usa a convenção de nomenclatura para delimitar o escopo das variáveis. Por exemplo: var = variável local, @var = variável de instância, $var= variável global. E não precisa do uso cansativo do self em cada membro da instância.
  • Ruby tem um sistema de threading independente do sistema operacional. Então, para cada plataforma é disponível o multithreading, até no MS-DOS.
  • Ruby é altamente portável: ela é desenvolvida em sua maioria no Linux, mas funciona em muitos tipos de UNIX, DOS, Windows 95/98/Me/NT/2000/XP, MacOS, BeOS, OS/2, etc.

A linguagem Ruby foi criada por Yukihiro Matsumoto (Ou simplesmente Matz) e foi liberada pela primeira vez em 1995 (Ruby, 2007). Para se utilizar o Watir é necessário antes se instalar o Ruby, maiores informações quanto à instalação e uso do Ruby pode ser obtida em http://rubyinstaller.rubyforge.org/wiki/wiki.pl ou em http://www.ruby-lang.org/.

Pré-requisitos e instalação:Para o uso do Watir torna-se necessário a instalação do interpretador Ruby e do pacote que contém o Watir. Faça o download e instale o Ruby neste link: http://rubyforge.org/frs/download.php/17647/ruby185-24.exe essa não é a ultima versão do Ruby, porém a ultima versão tem apresentado alguns problemas e recomendo a instalação da versão do endereço acima. A instalação do Ruby já inclui um editor de código chamado SciTE que utilizaremos no artigo. Recentemente o netbeans (http://www.netbeans.org/index_pt_BR.html) disponibilizou suporte ao Ruby, inclusive a sun já abriu a JVM (Java Virtual Machine) para rodar códigos em Ruby, quem preferir pode obter mais informações sobre a instalação no site: http://www.netbeans.org/kb/60/ruby/setting-up.html. Porém não é necessário para este artigo, visto que utilizaremos o SciTE.Após a instalação do Ruby, o watir pode ser instalado de diversas maneiras, porém recomendo a instalação manual para que você tenha sempre a versão mais atual do Watir. Sempre prefira utilizar a versão mais atual que pode ser visualizada no endereço: http://wiki.openqa.org/display/WTR/Development+Builds. Faça o download do GEM (pacote do watir para instalação) e do bônus zip da versão mais recente do watir que até a data deste artigo é a: 1.5.1.1230 (na página do watir está 1232, mas ao fazer o download e instalar percebe-se que é 1230). Salve o arquivo .gem no seu computador, abra o prompt de comandos do MS-DOS e acesse o diretório que está o arquivo .gem pelo prompt. Agora digite no prompt: gem install –local watir para que o instalador encontre e instale a versão que você fez o download. Aguarde enquanto é instalado o pacote, a documentação e alguns exemplos do Watir, ao final você terá uma tela parecida com a seguinte:

Instalação

watir Pronto, neste ponto já temos tudo que precisamos instalado no computador.

Watir não utiliza da técnica conhecida como Record/Playback, onde o arquiteto de testes grava o script através do movimento do mouse e teclado. Os scripts são escritos mesmo “na unha”, portanto o recomendado é que o responsável pelo uso do Watir tenha algum conhecimento de lógica de programação e dos atributos das tags HTML. Esse conhecimento em desenvolvimento se torna importante, visto que, estamos falando de programação de scripts e para que possamos ter um produto final de qualidade, podem ser aplicados todos os conceitos e boas práticas de programação. Desanimou?Calma, para facilitar faço duas recomendações: 1 - a instalação do aplicativo IE Developer Toolbar que pode ser obtido em http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4..., este aplicativo se integra na barra de ferramentas do Internet Explorer facilitando na identificação dos atributos utilizados na automação.2 - para quem não tem o conhecimento dos fundamentos do HTML, a leitura de um tutorial sobre HTML antes de utilizar Watir. Vários tutoriais podem ser obtidos na internet, basta usar seu mecanismo de busca favorito.

Fundamentos Básicos:Iniciarei então falando em um nível de termos técnicos supondo que todos leram o tutorial de HTML ou tenham um conhecimento equivalente. O Watir permite acessar tags HTML através dos seus diversos atributos como name, value, ID, Div, etc. Alguns comandos importantes do Watir estão listados nas tabelas abaixo:

Comandos de Iniciação

require 'watir' Carrega a biblioteca do Watir
ie = Watir::IE.start('http://localhost:8080') Inicia o Internet Explorer (IE) usando a URL desejada.
ie.close Fecha o IE.
ie = Watir::IE.attach(:title, 'title') Necessário para que o Waitr reconheça uma janela do IE que se abre a partir da janela principal e precisará ser manipulada, por exemplo.


Acessando campos

ie.text_field(:name, 'name').set('value') Permite se acessar um campo do tipo texto (text field) especificado pelo atributo “name” da tag e atribui a ele um valor (value)
ie.button(:value, 'value').click Clica em um botão especificado pela tag “value”
ie.button(:name, 'name').click Clica em um botão especificado pela tag “name”
ie.checkbox(:name, 'name').set Marca uma caixa de seleção (check box) especificada pela tag "name"
ie.object(:attribute, 'name').flash Pode ser usada com qualquer campo ou atributo. Este comando destaca o objeto pretendido na cor amarela. Utilizada geralmente para verificar se um determinado comando está encontrando o objeto na tela.


Verificando conteúdos na página

ie.text.include?('text') Retorna verdadeiro o falso se a página corrente contém o texto especificado ou falso caso não encontre o texto. Pode ser usada expressão regular.
ie.title Retorna o título da página corrente
ie.html Retorna todo o HTML do corpo da página.
ie.table(:id, 'recent_records).to_a Retorna um array contendo todo o texto que está em uma tabela.
ie.table(:id, 'recent_records')[2][1].text Retorna o texto da primeira coluna da segunda linha de uma tabela.


Assertions

assert_equal(expected, test_method) Compara o valor retornado com um valor esperado.
assert_match(regexp, test_method) Compara o valor retornado com uma expressão regular.
assert(expression) Verifica se uma expressão é verdadeira.


Mão na massa:
Chega de tanto bla blá blá e vamos ao que interessa para maioria dos leitores deste artigo: criar um script. Começaremos é claro com scripts básicos e utilizando alguns comandos apresentados acima. É importante dizer neste momento que a linguagem Ruby utiliza o caractere # (sharp) para separar código de comentário, como Watir é derivado de Ruby, seguiremos a mesma regra.Todo arquivo de script deve ser salvo com a extensão .rb para que possa ser interpretado pelo Ruby. Para criar o script pode ser usado o bloco de notas do Windows ou um editor compatível, em nosso artigo utilizei o editor SciTE que é instalado juntamente com o Ruby. Usaremos o navegador Internet Explorer (IE) visto que ainda é o mais popular. Caso queira utilizar outro navegador, atente-se aos comandos de manipulação do navegador, pois usarei no artigo comandos exclusivos do IE. Detalhes antes de começar, você vai perceber que precisaremos acessar o código para verificar as tags do HTML, ou usar a Development Toolbar para fazer o acesso. Uma coisa importante de se perceber é que o Watir nos permite concatenar muitos comandos, isso indica para ele o que queremos fazer, por exemplo, em linguagem “humana” eu diria: Eu quero clicar no botão de nome btnG localizado no Internet Explorer, no watir vai ser concatenado: ie.button(:name”btnG”).click. Normalmente então temos: browser.componente(identificação_do_componente).ação.Vamos a um exemplo e logo a seguir detalharei um pouco mais sobre cada parte do comando acima.Para iniciar vamos criar um script básico de manipulação do browser. Existe um exemplo muito usado por todos quando está se iniciando com o watir, se trata de uma busca simples no Google e a verificação do resultado. Abra o SciTE ou o editor de sua preferência e digite o seguinte código:Obs. O que está em verde são comentários e não precisam ser digitados, ou se preferir escreva os seus próprios comentários.

Watir Script


Bom, vamos falar sobre as linhas digitadas, repare que nosso código se inicia na linha 9, nesta linha temos um comando que deve ser inserido em TODOS, atenção TODOS, os scripts pois caso contrário não irão funcionar.Para quem está acostumado a programar em alguma linguagem que seja, esqueça todos aqueles “detalhes” que fazem com que o programador se enrole, como por exemplo: esquecer de colocar um ; (ponto e virgula) no final da linha ou ainda esquecer de declarar e inicializar uma variável, o ruby foi desenvolvido para evitar esses erros, portanto ele não necessita desses detalhes e o watir acompanha a mesma idéia. Então ao olhar para o código acima não pense que e esqueci de algo, é exatamente assim que é para ser digitado.

Voltando a nossa explicação, na linha 10 nós criamos uma variável chamada “test_site” e atribuímos a ela o endereço do site que queremos testar, isso poderia ter sido feito diretamente na linha 12, substituindo a variável pelo nome do site, vamos fazer dessa forma apenas por questão de boas práticas e facilitar a manutenção do código.

Na linha 11, temo uma outra variável “ie” e foi atribuído a ela uma instancia do browser Internet Explorer (IE), a partir desse momento, sempre que quisermos enviar um comando para o IE deveremos enviar através desta variável. Note que até aqui o browser apenas abre em uma página em branco.

Na linha 12 nós passamos para o browser o comando “goto” avisando através da variável test_site o endereço que queremos que ele abra.

Na linha 14 é inserido os conceitos de HTML, note que o que estamos fazendo é digitando uma palavra no campo de pesquisa do Google para saber o que digitar nesta linha vamos usar o IE development Toolbar, ou pode ser visualizado também no código fonte da página. Procure o que o programador do Google coloco na tag “name” do campo em que digitamos a pesquisa, na data em que escrevi o artigo era: “q”, isso pode ter sido alterado no momento do seu teste, portanto verifique e caso seja diferente substitua no código. Abaixo o trecho do HTML aonde encontrei o nome do componente:
<input maxLength=256 size=55 name=q value="">
Ainda na linha 14, temos o comando “text_field” que indica para o IE que eu quero acessar um campo de texto e entre parênteses eu informei que quero acessar o campo texto que tenha o nome (name) igual a “q” (ou o que você tenha colocado no lugar), após informar que quero acessar este campo, usamos o comando “set” para indicar que quero inserir nesse campo a palavra “pickaxe”. Esta palavra é apenas a minha busca no exemplo, note que esses atributos podem ser alterados para que você perceba o uso em outros testes.

Na linha 15, Eu informo ao IE que quero acessar um Botão (Button) e eu quero o botão que tem em sua tag name o texto “btnG” e o comando (ação) que darei nesse botão é um clique (click). Código HTML:
<input type=submit value="Google Search" name=btnG>

Na linha 17, fazemos uma verificação do resultado retornado com o nosso resultado esperado com o famoso IF, presente em quase todas as linguagens de programação. Usamos para verificação no browser o comando “text.include?”, note que os comandos do watir são bem sugestivos e de fácil compreensão. Nesse comando, passamos entre aspas o texto que queremos verificar se está presente na tela. Atenção, pois a verificação é case sensitive (diferencia maiúsculas de minúsculas).

Na linha 18, usaremos o comando “puts” que serve para se escrever na tela, não no browser, na tela que estamos rodando a aplicação, pode ser na janela do MS-DOS ou no editor SciTe. Essa linha será executada se a verificação feita pela linha 17 tiver sucesso.

Caso a verificação da linha 17 não obtenha o resultado esperado, então entramos no ELSE e é executada a linha número 20. Note que caso a linha 18 seja executada, a linha 20 não será, e vice versa.

Na linha 21 temos um END que se refere ao IF e não ao nosso script, caso não tivéssemos o IF não precisaríamos do END, ou seja, no final de um script não é necessário um comando END.

Se você digitou seu código no bloco de notas ou outro editor, salve o arquivo com o nome googleSerach.rb no seu computador, abra o MS-DOS, vá até o diretório que salvou o arquivo e digite simplesmente: googleSerch.rb aperte ENTER, aguarde e não se assuste, seu computador não ficou louco, é apenas o Watir trabalhando. J Se você usou o SciTe para digitar seu código, aperte F5 para roda-lo.No MS-DOS você terá a mensagem escrita na tela, se tudo correu bem será: “Passou. String encontrada.” E no SciTe teremos uma tela parecida com essa:

Google Search - Saída

Nesse momento espero que você tenha com este pequeno exemplo percebido as várias possibilidade de uso do watir. Quando rodei pela primeira vez meu script fiquei impressionado com a velocidade e facilidade devido aos comandos sugestivos e facilidade de programação. O Watir é capaz de manipular praticamente todos os componentes de uma página, seja ela um botão, link, campo de texto, lista de seleção, radio, checkbox, etc. Vamos apresentar alguns comandos para os componentes mais comuns para que você possa “brincar” um pouco com o Watir antes de darmos continuidade ao nosso artigo. Somente relenbrando que na linha 9 do exemplo (Figura 1), carregamos a biblioteca do Watir, isso é necessário para todos os scripts. Caso se queira fazer uma automação dirigida a dados (Data-driver), por exemplo, é necessário se utilizar o comando require para carregar também os arquivos necessários para que o script funcione, mas isso é assunto para outra hora. Dica: Para facilitar as chamadas de objetos da biblioteca Watir, nos próximos scripts adicionaremos a linha “include Watir” logo abaixo da linha 9, com isso a chamada da linha 11 ficaria somente: ie = IE.new.

Principais componentes, seus atributos e suas ações.

Para te ajudar com suas experiências iniciais vou te passar alguns componentes e como acessá-lo/manipulá-lo. O Watir possui uma referência, ainda incompleta, de todos os seus comandos e quais ações e atributos cada componente permite manipular, essa lista completa foi instalada juntamente com a documentação do watir e pode ser acessada em: ruby\lib\ruby\gems\1.8\doc\watir-1.5.1.1230\rdoc\index.html ou acessado online no endereço: http://wtr.rubyforge.org/rdoc/index.html .

As informações apresentadas abaixo devem ser usadas seguindo uma estrutura de concatenação (unindo as partes separando cada um por . “ponto”), lembrando que SEMPRE que se for acessar algum componente no IE, é necessário começar o comando com o manipulador criado, em nosso exemplo foi a variável ie, que é a variável que recebe a nova instancia do browser. Exemplo de como deve ser usada a estrutura: Browser.componente.ação, exemplo (estrutura) ie.text_field(:name, "txtlogin").set("admweb") (exemplo)

1) Componente: text_field Campo de texto:

   
Formas de localização do componente na tela: text_field(como, conteudo) 
ie.text_field(:id,'user_name') # localiza o campo pelo ID
ie.text_field(:name,'address') # localiza o campo pelo NAME
ie.text_field(:index,2) # localiza o segundo campo na tela

Ações:

set(“texto”) – Escreve texto no campo

clear – Limpa o conteúdo do campo

verify_contains(“texto”) – verifica se texto está digitado no campo e retorna verdadeiro ou falso

to_s – Retorna na tela os atributos do componente, nome, ID, maxlength, tipo, etc.

dragContentsTo(como, conteúdo) – move o conteúdo do campo para outro campo

append(“texto”) – Adiciona texto no final do texto que já está escrito no campo

 

2) Componente: button Botão:

 

Formas de localização do componente na tela: button(como, conteudo) 
ie.button(:id,'user_name') # localiza o botão pelo ID
ie. button(:name,'address') # localiza o botão pelo NAME
ie. button(:index,2) # localiza o segundo botão na tela
ie.button(:caption, 'Login')  # localiza o botão pelo que está escrito no mesmo
 

Ações:
click – clica no botão indicado

3) Componente: checkbox Caixa de seleção:

 

Formas de localização do componente na tela: checkbox(como, conteudo, [value=nil]) 
ie.checkbox(:id,'user_name') # localiza o checkbox pelo ID
ie.checkbox(:name,'address') # localiza o checkbox pelo NAME
ie.checkbox(:index,2) # localiza o segundo checkbox na tela
ie.checkbox(:name,”dia”, “sabado”) # localiza o checkbox que tem o nome: dia
e o valor: sabado, muito usado pois alguns checkbox tem o mesmo nome, porem valores diferentes


Ações:

set – seleciona o checkbox indicado
clear – remove a seleção do checkbox indicado
 

4) Componente: image Imagens:

 

Formas de localização do componente na tela: image(como, conteudo) 
ie.image(:src, “images/myPic.jpg”) # acessa pelo SRC
ie.image(:index,2) # acessa a segunda imagem da tela 
ie.image(:alt, "Clique aqui") # acessa pelo alt da imagem

Ações:

fileCreatedDate – retorna a data de criação da imagem

fileSize – retorna o tamanho da imagem

height – retorna a altura da imagem

width – retorna a largura da imagem

save – Salva a imagem no seu computador, usar: save(c:\dirnome\somename.gif), se existir uma imagem com mesmo nome no diretório ele sobrescreve.

 

5) Componente: link :

 

Formas de localização do componente na tela: checkbox(como, conteudo) 

ie.link(:url, “login.asp”) #acessa pela url

ie.link(:index,2) #acessa o segundo link da tela

ie.link(:title, "Picture") #acessa pelo título

ie.link(:text, 'Click Me') #acessa pelo texto do link

 

Ações:

click – clica no link

link_string_creator – retorna em uma string os valores do link, pode ser acessado separadamente na variável através de índices, isto é: variável[0], variável[1], etc

link_has_image – verifica se uma imagem é usada como parte do linkl, útil pois para clicar em imagem como link é um comando diferente

 

6) Componente: SelectList Lista de seleção, dropdownlist, listbox:

 

Formas de localização do componente na tela: select_list(como, conteudo) 
ie.select_list(:id, 'currency') # acessa pelo ID
ie.select_list(:name, 'country') # acessa pelo nome
ie.select_list(:index, 2) #acessa o segundo select da tela    

Ações:

clearSelection – Limpa a seleção

getAllContents – retorna o conteúdo do select em um array, retorna um array vazio caso não contenha dados no select, muito útil para verificar se foi carregado algum dado no select

getSelectedItems – Retorna o(s) itens selecionados em um array.

includes?(texto) – verifica se texto está na lista e retorna verdadeiro ou falso

select(item) – Seleciona item

selected?(item) – Verifica se item está selecionado e retorna verdadeiro ou falso

set(item) – Faz o mesmo que o select(item)

 

7) Componente: Table Tabela:

 

Formas de localização do componente na tela: table(como, conteudo) 
ie.table(:id, 'currency') # acessa pelo ID
ie.table(:index, 2) #acessa a segunda tabela da tela    

Ações:

[x] – Retorna/acessa a linha x da tabela

column_count – retorna o número de colunas de uma tabela ou de uma linha da tabela, concatenanto com o comando [x]

column_values(X) – retorna um arranjo com todos os valores da coluna X

highlight(:set) – esse comando colore o fundo da tabela de amarelo e fica em destaque na tela

row_count – Retorna o número de linhas de uma tabela

row_values(X) – Retorna em um array os valores de uma linha X

to_a – retorna o conteúdo da tabela em um arranjo de 2 dimensões

to_s – retorna todos os atributos do componente, name, id, value, date, src, width, etc.

 

8) Ações gerais: todos Algumas ações utilizadas em quase todos os componentes:

exist? – verifica se o componente existe e retorna verdadeiro ou falso

flash – faz o componente piscar na tela, útil para verificar se o componente está sendo encontrado

to_s – retorna todos os atributos do componente, name, id, value, date, src, width, etc.

focus – coloca o foco no elemento

after_text – retorna o texto que existe antes do componente, útil para verificar o nome do campo em formulários por exemplo

before_text – retorna o texto que está após um determinado componente

methods – retorna todos os métodos (ações) disponíveis para um determinado componente

parent – retorna/acessa o componente pai

 

9) Ações: Browser (Internet Explorer) – usado: ie.açao

IE.new – abre uma nova janela do Internet Explorer

goto(“endereço”) – direciona o Internet Explorer para um dado endereço

attach(como, “conteudo”) – Retorna o endereço de uma nova janela que se abriu para uma variável, para que se possa manipula-la, o como pode ser, :url ou :title.

close – fecha uma janela específica do internet explorer

close_all – fecha todas as janelas abertas do Internet Explorer

close_other – fecha uma janela que não seja a específicada

bring_to_front – coloca a janela do Internet Explorer em primeiro plano

focus – coloca o foco em uma janela especificada do Internet Explorer

front? – verifica se o Internet Explorer é a janela que esta na frente da tela

maximize – Maximiza a janela

minimize – Minimiza a janela

restore – aciona para restaurar a janela

send_keys – envia comandos (CTRL + A, DEL, etc) para a janela, a documentação completa do comando pode ser vista aqui: http://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm

forward – aciona para avançar no Internet Explorer

back – aciona para voltar no Internet Explorer

text.include? “texto” – procura por texto na tela e retorna verdadeiro ou falso

refresh – atualiza a pagina

speed – Aumenta ou diminui a velocidade com que os objetos são acessados, inclusive a velocidade com que o texto é escrito na tela o uso é: ie.speed = :fast ou :slow

show_active – exibe o to_s do objeto que está com o foco

show_divs – exibe os divs da tela

show_forms – exibe informações sobre todos os formulários da tela

show_images – exibe informações sobre todas as imagens da tela

show_links – exibe todos os links presentes na página

show_spans – exibe os spans da tela

show_tables – exibe as tabelas da tela

status – retorna o texto que está na barra de status

title – retorna o título da janela

url – retorna a URL que a página está

visible= - esconde a janela do internet Explorer ou faz a mesma aparecer após ser escondida, uso: ie.visible = true, ou false.

Visible – retorna a visibilidade atual da janela

 

Bem pessoal, desculpe pelo texto ter ficado grande, mas tentei ser o mais explicativo possível e espero que a grande maioria tenha compreendido o uso da ferramenta e possa já ir efetuando vários testes e conhecendo melhor a ferramenta.

Estou trabalhando já na continuidade do artigo e espero poder abordar alguns temas mais avançados, para isso quem tem interesse em dar continuidade no aprendizado, precisa praticar um pouco do que foi passado neste artigo.

Estou a disposição (na medida do possível) para tirar algumas dúvidas e receber críticas, elogios e sugestões.

 

 

Abraço a todos e até a próxima.

Raphael Soares. (rafsopd@gmail.com)

 

 

 

Referências:

- Rangel, Eustáquio. Ruby: conhecendo a linguagem. São Paulo: Brasport, 2006. 207 p.

- http://wtr.rubyforge.org/

AnexoTamanho
google_search.rb806 bytes