{"id":132,"date":"2016-03-14T09:32:01","date_gmt":"2016-03-14T13:32:01","guid":{"rendered":"http:\/\/vanilton.net\/blog\/?p=132"},"modified":"2016-03-14T09:32:01","modified_gmt":"2016-03-14T13:32:01","slug":"sikulix-parte-3-scripts-api-java-utilizando-o-padrao-pageobjects","status":"publish","type":"post","link":"https:\/\/www.vanilton.net\/blog\/automacao\/2016\/03\/14\/sikulix-parte-3-scripts-api-java-utilizando-o-padrao-pageobjects\/","title":{"rendered":"SikuliX Parte 3 &#8211; Scripts (API Java) utilizando o padr\u00e3o PageObjects"},"content":{"rendered":"<p>Ol\u00e1 galera!<\/p>\n<p>Come\u00e7o aqui o \u00faltimo post da s\u00e9rie sobre SikuliX, irei abordar como no anterior o uso da API Java, entretanto, o\u00a0foco ser\u00e1 no padr\u00e3o <em>PageObjects<\/em> e aplica\u00e7\u00e3o de outros m\u00e9todos da API, utilizando como suporte para os testes o framework de teste <em>JUnit<\/em>.<\/p>\n<p>Os\u00a0exemplos de testes como no <a href=\"http:\/\/vanilton.net\/blog\/2016\/02\/24\/sikulix-parte-2-scripts-api-java\/\" target=\"_blank\">post anterior<\/a>, ser\u00e1 utilizado o <a href=\"https:\/\/github.com\/Vanilton18\/examples-sikuli\/releases\/download\/v1.0\/examples-sikuli.jar\" target=\"_blank\">app exemplo<\/a>\u00a0e continuarei os c\u00f3digos no projeto em <a href=\"https:\/\/github.com\/Vanilton18\/examples-sikuli-scriptapi\" target=\"_blank\">https:\/\/github.com\/Vanilton18\/examples-sikuli-scriptapi<\/a>.<\/p>\n<p><span style=\"line-height: 1.5;\">Quem j\u00e1 conhece o padr\u00e3o <em>PageObjects<\/em> para desenvolvimento de testes, sabe que entre muitos ganhos podemos destacar:<\/span><\/p>\n<ul>\n<li>Organiza\u00e7\u00e3o<\/li>\n<li>Padroniza\u00e7\u00e3o<\/li>\n<li>Reaproveitamento<\/li>\n<li>Aumento da produtividade<\/li>\n<li>Facilidade de manuten\u00e7\u00e3o<\/li>\n<\/ul>\n<p>E com este\u00a0padr\u00e3o em conjunto com\u00a0a API SikuliX, conseguimos vislumbrar uma grande facilidade na\u00a0estrutura\u00e7\u00e3o do projeto e no uso das imagens, caso organizemos\u00a0elas seguindo um padr\u00e3o bem definido.<\/p>\n<h1>Criando nossa PageObject com SikuliX<\/h1>\n<p>A figura abaixo mostra a\u00a0estrutura de pastas para as imagens em conjunto com uma classe de <em>PageObject <\/em>chamada PaginaPrincipal.<\/p>\n<figure id=\"attachment_150\" aria-describedby=\"caption-attachment-150\" style=\"width: 941px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-150 size-full\" src=\"http:\/\/vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/PageObjectsSikuliXImagens-e1457912988299.png\" alt=\"PageObjectsSikuliXImagens\" width=\"941\" height=\"418\" srcset=\"https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/PageObjectsSikuliXImagens-e1457912988299.png 941w, https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/PageObjectsSikuliXImagens-e1457912988299-300x133.png 300w, https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/PageObjectsSikuliXImagens-e1457912988299-520x231.png 520w, https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/PageObjectsSikuliXImagens-e1457912988299-740x329.png 740w\" sizes=\"(max-width: 941px) 100vw, 941px\" \/><figcaption id=\"caption-attachment-150\" class=\"wp-caption-text\">Estrutura de Pasta Imagens e PageObjects Pagina Principal<\/figcaption><\/figure>\n<p>Observando a figura acima, nota-se que as imagens est\u00e3o organizadas em pastas, no caso dos bot\u00f5es, existe uma\u00a0pasta &#8220;botao&#8221;, no caso de menu, existe uma pasta menu e assim para submenus entre outras partes do software que podemos organizar. Isto ir\u00e1\u00a0ajudar na localiza\u00e7\u00e3o das imagens quando forem utilizadas no c\u00f3digo das <em>PageObjects<\/em>. Outra importante observa\u00e7\u00e3o \u00e9 denominar nomes para imagens que fa\u00e7am refer\u00eancia ao que iram interagir, como no caso do menu &#8220;Fun\u00e7\u00f5es&#8221;, pois quando necessitarmos interagir com est\u00e1 imagem no m\u00e9todo implementado no <em>PageObjects,<\/em> utilizaremos o mesmo nome da imagem. \ud83d\ude42<\/p>\n<p>Continuando a observa\u00e7\u00e3o da imagem, no canto direito, temos a implementa\u00e7\u00e3o de uma <em>PageObject<\/em> chamada PaginaPrincipal,\u00a0\u00a0inicialmente definimos o tipo de atributo da classe chamado <strong>screen<\/strong> com refer\u00eancia a classe\u00a0<strong>Screen<\/strong> da\u00a0API SikuliX. Em seguida criamos uma vari\u00e1vel com o caminho para o path das imagens chamada &#8220;pathPictures&#8221;.<\/p>\n<p>O pr\u00f3ximo passo para cria\u00e7\u00e3o da <em>PageObject<\/em>\u00a0PaginaPrincipal \u00e9 a cria\u00e7\u00e3o de um construtor que receber\u00e1 sempre uma inst\u00e2ncia da Classe Screen da API SikuliX, ent\u00e3o, para utilizar os m\u00e9todos desta p\u00e1gina sempre deveremos criar uma nova inst\u00e2ncia dela passando o objeto Screen atualmente em uso.<\/p>\n<p>Por \u00faltimo, devemos criar os m\u00e9todos que realizaram as intera\u00e7\u00f5es ou comportamentos apenas nesta p\u00e1gina,\u00a0isto \u00e9, caso aja necessidade de interagir com elementos de outra p\u00e1gina, devemos criar uma nova\u00a0classe que ter\u00e1 tais responsabilidades, retornando todo o ciclo de cria\u00e7\u00e3o da <em>PageObject<\/em> citado at\u00e9 aqui.<\/p>\n<h1>Generalizando\u00a0m\u00e9todos com uso do nome dos arquivos de imagens<\/h1>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/88eb01be5c6c9fcc7fc9.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/88eb01be5c6c9fcc7fc9\">Gist<\/a>.<\/noscript><\/div>\n<p>Como j\u00e1 havia mencionado antes, \u00a0devemos utilizar nomes para imagens que fa\u00e7am refer\u00eancia a sua a\u00e7\u00e3o, por exemplo no m\u00e9todo &#8220;clicarNoMenu&#8221; receber\u00e1 uma <em>string\u00a0<\/em>por par\u00e2metro, e seguir\u00e1 para execu\u00e7\u00e3o no m\u00e9todo screen.wait | screen.click com par\u00e2metro do path onde localiza-se a imagem, logo pode-se observar que a s<em>tring <\/em>passada no m\u00e9todo &#8220;clicarNoMenu&#8221; dever\u00e1 ser o mesmo nome do arquivo de imagem armazenado na pasta menu. Em mi\u00fados, caso houvesse a necessidade de interagir com outro menu, bastaria criar um novo recorte e salvar a imagem com o nome do menu na pasta de menus, e em seguida utilizar o m\u00e9todo passando o nome da imagem.<\/p>\n<p>O que ganhamos com estes m\u00e9todos gen\u00e9ricos? Com o uso de SikuliX este padr\u00e3o nos proporcionar\u00e1 escrever muito menos c\u00f3digo, e nos preocupar mais em realizar os recortes das imagens. Acredite, sem isto voc\u00ea provavelmente perder\u00e1 muuuuuiito tempo abrindo imagens e checando se est\u00e3o corretas. \ud83d\ude00<\/p>\n<h1>Criando nossa Classe de Teste com PageObject SikuliX<\/h1>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/7b0c497deb3bb5097b52.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/7b0c497deb3bb5097b52\">Gist<\/a>.<\/noscript><\/div>\n<p>A Classe de Teste acima utilizar\u00e1 as <em>PageObjects<\/em> PaginaPrincipal e PaginaInputPaste, como podemos observar estas classes s\u00e3o atributos da Classe de Teste, juntamente com a Screen da API SikuliX.<\/p>\n<p>No m\u00e9todo com a anota\u00e7\u00e3o <em>BeforeClass,\u00a0<\/em>instanciamos o objecto Screen e abrimos o app exemplo. Em seguida iniciaremos o m\u00e9todo de teste e o primeiro passo para utilizarmos a PageObjects, como j\u00e1 citado, \u00e9 instanci\u00e1-la passando o objeto screen em uso:<\/p>\n<pre> paginaPrincipal = new PaginaPrincipal(screen);<\/pre>\n<p>Ap\u00f3s isto, podemos utilizar todos os m\u00e9todo implementados nesta p\u00e1gina como:<\/p>\n<pre>paginaPrincipal<span class=\"pl-k\">.<\/span>clicarNoMenu(<span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>Fun\u00e7\u00f5es<span class=\"pl-pds\">\"<\/span><\/span>);<\/pre>\n<p>Veja que agora na classe de teste, a leitura do m\u00e9todo fica\u00a0clara at\u00e9 mesmo para uma pessoa menos t\u00e9cnica, e\u00a0o uso da imagem com o nome &#8220;Fun\u00e7\u00f5es&#8221; \u00e9 impercept\u00edvel.<\/p>\n<p>Por fim, tamb\u00e9m podemos observar que para interagir com elementos da PageObject\u00a0PaginaInputPaste, devemos realizar a instancia\u00e7\u00e3o e em seguida utilizar os seus m\u00e9todos.<\/p>\n<p>Ent\u00e3o \u00e9 isso pessoal, espero ter ajudado com esta s\u00e9rie de posts a dar uma ideia de como organizar, aplicar e utilizar em um projeto real essa ferramenta que tem\u00a0um potencial enorme para automatiza\u00e7\u00e3o de testes. Qualquer d\u00favida e sugest\u00e3o podem deixar nos coment\u00e1rios que ficarei contente em ajudar.<\/p>\n<p>At\u00e9 mais!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 galera! Come\u00e7o aqui o \u00faltimo post da s\u00e9rie sobre SikuliX, irei abordar como no anterior o uso da API Java, entretanto, o\u00a0foco ser\u00e1 no padr\u00e3o PageObjects e aplica\u00e7\u00e3o de outros m\u00e9todos da API, utilizando<a class=\"read-more\" href=\"https:\/\/www.vanilton.net\/blog\/automacao\/2016\/03\/14\/sikulix-parte-3-scripts-api-java-utilizando-o-padrao-pageobjects\/\">Continue reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":156,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,24,8,9,5,15,10],"tags":[18,21],"wppr_data":[],"_links":{"self":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/132"}],"collection":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/comments?post=132"}],"version-history":[{"count":13,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/132\/revisions"}],"predecessor-version":[{"id":157,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/132\/revisions\/157"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/media\/156"}],"wp:attachment":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/media?parent=132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/categories?post=132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/tags?post=132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}