{"id":162,"date":"2016-03-29T22:15:14","date_gmt":"2016-03-30T02:15:14","guid":{"rendered":"http:\/\/vanilton.net\/blog\/?p=162"},"modified":"2016-03-29T22:42:54","modified_gmt":"2016-03-30T02:42:54","slug":"automatizacao-de-game-mobile-utilizando-sikuli","status":"publish","type":"post","link":"https:\/\/www.vanilton.net\/blog\/automacao\/2016\/03\/29\/automatizacao-de-game-mobile-utilizando-sikuli\/","title":{"rendered":"Automatiza\u00e7\u00e3o de game mobile utilizando Sikuli"},"content":{"rendered":"<p style=\"text-align: justify;\">Como parte do desafio proposto pelo <a href=\"http:\/\/agiletesters.com.br\/user\/vanilton\" target=\"_blank\">Vanilton<\/a> l\u00e1 no <a href=\"http:\/\/agiletesters.com.br\/\" target=\"_blank\">Agile Testers<\/a>, resolvi escrever um pequeno post sobre a minha experi\u00eancia com o Sikuli em um aplicativo mobile. A ideia n\u00e3o \u00e9 ser um tutorial, mas tentarei passar alguns <em>insights<\/em> que tive ao me deparar com os desafios do projeto. Isso foi h\u00e1 quase 2 anos.<\/p>\n<h1>O Jogo<\/h1>\n<p style=\"text-align: justify;\">O aplicativo em quest\u00e3o era um jogo desenvolvido para a plataforma <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Tizen\" target=\"_blank\">Tizen<\/a>, o sistema operacional mobile da Samsung. Apesar de j\u00e1 ter <a href=\"http:\/\/www.theverge.com\/2015\/11\/5\/9673966\/samsung-tizen-blackberry-smartphone-market-share\" target=\"_blank\">superado o BlackBerry em market share no ano passado<\/a>, o Tizen ainda \u00e9 um ilustre desconhecido para a grande maioria de n\u00f3s.<\/p>\n<p style=\"text-align: justify;\">O jogo era uma vers\u00e3o para dispositivos m\u00f3veis do famoso brinquedo Simon, um jogo de mem\u00f3ria inventado em 1978 por Ralph H. Baer e Howard J. Morrison, com o desenvolvimento do software a cargo de Lenny Cope. Aqui no Brasil foi conhecido como Genius.<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a style=\"margin-left: 1em; margin-right: 1em;\" href=\"https:\/\/1.bp.blogspot.com\/-r23klUF9fiE\/Vu8sYC0O2vI\/AAAAAAAAAqs\/6Aq-dXZ0FekTQtWEH2RApLyE1CCn5buVA\/s1600\/simon.png\"><img src=\"https:\/\/1.bp.blogspot.com\/-r23klUF9fiE\/Vu8sYC0O2vI\/AAAAAAAAAqs\/6Aq-dXZ0FekTQtWEH2RApLyE1CCn5buVA\/s1600\/simon.png\" alt=\"\" border=\"0\" \/><\/a><\/div>\n<p>Para quem n\u00e3o viveu a \u00e9poca de ouro que foram os anos 80, o v\u00eddeo abaixo mostra um pouco do game play.<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><iframe loading=\"lazy\" class=\"YOUTUBE-iframe-video\" src=\"https:\/\/www.youtube.com\/embed\/4YhVyt4q5HI?feature=player_embedded\" width=\"320\" height=\"266\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\" data-thumbnail-src=\"https:\/\/i.ytimg.com\/vi\/4YhVyt4q5HI\/0.jpg\"><\/iframe><\/div>\n<h1>A\u00a0Miss\u00e3o<\/h1>\n<p style=\"text-align: justify;\">Voltando ao projeto, a miss\u00e3o\u00a0era simples: automatizar o jogo \ud83d\ude06 .<\/p>\n<p style=\"text-align: justify;\">Nesse ponto, alguns j\u00e1 poderiam come\u00e7ar a se questionar: automatizar um jogo? Qual o sentido disso?<\/p>\n<p style=\"text-align: justify;\">Sem querer entrar muito no m\u00e9rito da quest\u00e3o, a necessidade veio da pr\u00f3pria natureza do projeto: a n\u00e3o ser que voc\u00ea seja um prod\u00edgio da mem\u00f3ria, \u00e9 muito dif\u00edcil memorizar sequ\u00eancias longas. Al\u00e9m disso, repetir o teste in\u00fameras vezes seria cansativo e ma\u00e7ante.<\/p>\n<p style=\"text-align: justify;\">Sendo em Tizen, j\u00e1 era de se esperar a escassez de ferramentas de automa\u00e7\u00e3o. Na \u00e9poca, cheguei a usar o excelente\u00a0<a href=\"https:\/\/github.com\/01org\/fMBT\" target=\"_blank\">fmBT<\/a>\u00a0(<em>Free Model Based Tool<\/em>), mas esse n\u00e3o foi capaz de suprir todas as minhas necessidades. Ent\u00e3o entra em cena o Sikuli.<\/p>\n<p style=\"text-align: justify;\">Usando a ferramenta de captura do Windows foi poss\u00edvel recortar todos os \u00edcones, bot\u00f5es e demais elementos gr\u00e1ficos do aplicativo. Portanto, considerando a aplica\u00e7\u00e3o instalada no emulador do Tizen, foi poss\u00edvel inici\u00e1-la automaticamente por meio do Sikuli.<\/p>\n<p>Dentre os recortes, destaco os dos bot\u00f5es:<br \/>\n<a href=\"http:\/\/4.bp.blogspot.com\/-5JipAXC1FYg\/VvnjGmT2OhI\/AAAAAAAAAsY\/0HgSxhOQzFkz_7N8C7lWA81B09UyaqMNg\/s1600\/green_off.png\"><img src=\"https:\/\/4.bp.blogspot.com\/-5JipAXC1FYg\/VvnjGmT2OhI\/AAAAAAAAAsY\/0HgSxhOQzFkz_7N8C7lWA81B09UyaqMNg\/s400\/green_off.png\" alt=\"\" border=\"0\" \/><\/a><a href=\"http:\/\/1.bp.blogspot.com\/-hIsaUKHk_gQ\/VvnjGqHjZbI\/AAAAAAAAAsQ\/6wG9lS0FlkA3hGwUcNGB43Hz3vZzXVZNQ\/s1600\/green_on.png\"><img src=\"https:\/\/1.bp.blogspot.com\/-hIsaUKHk_gQ\/VvnjGqHjZbI\/AAAAAAAAAsQ\/6wG9lS0FlkA3hGwUcNGB43Hz3vZzXVZNQ\/s400\/green_on.png\" alt=\"\" border=\"0\" \/><\/a> <a href=\"http:\/\/4.bp.blogspot.com\/-JAblEQPrzKs\/VvnjNewPHaI\/AAAAAAAAAso\/R3eoVXM2R24hwnjUuBuZMyGt-vgoO9-Pw\/s1600\/blue_off.png\"><img src=\"https:\/\/4.bp.blogspot.com\/-JAblEQPrzKs\/VvnjNewPHaI\/AAAAAAAAAso\/R3eoVXM2R24hwnjUuBuZMyGt-vgoO9-Pw\/s400\/blue_off.png\" alt=\"\" border=\"0\" \/><\/a><a href=\"http:\/\/1.bp.blogspot.com\/-T0E7iNTeSX0\/VvnjNLLdtmI\/AAAAAAAAAsg\/4KRIp_ALgV0jQX9wghcECo1Hb7IBnfSow\/s1600\/blue_on.png\"><img src=\"https:\/\/1.bp.blogspot.com\/-T0E7iNTeSX0\/VvnjNLLdtmI\/AAAAAAAAAsg\/4KRIp_ALgV0jQX9wghcECo1Hb7IBnfSow\/s400\/blue_on.png\" alt=\"\" border=\"0\" \/><\/a> <a href=\"http:\/\/2.bp.blogspot.com\/-YoJq-1nY6lk\/Vvnj13PHITI\/AAAAAAAAAtQ\/shURqTXVcacBQRhY8hlKiFoRENuLwQLaA\/s1600\/red_off.png\"><img src=\"https:\/\/2.bp.blogspot.com\/-YoJq-1nY6lk\/Vvnj13PHITI\/AAAAAAAAAtQ\/shURqTXVcacBQRhY8hlKiFoRENuLwQLaA\/s400\/red_off.png\" alt=\"\" border=\"0\" \/><\/a><a href=\"http:\/\/2.bp.blogspot.com\/-WlsVfUveQLI\/Vvnj1_7746I\/AAAAAAAAAtM\/11wE-wMI2YUqYw8RcVYKZVlYZ51qPpM6g\/s1600\/red_on.png\"><img src=\"https:\/\/2.bp.blogspot.com\/-WlsVfUveQLI\/Vvnj1_7746I\/AAAAAAAAAtM\/11wE-wMI2YUqYw8RcVYKZVlYZ51qPpM6g\/s400\/red_on.png\" alt=\"\" border=\"0\" \/><\/a><img src=\"https:\/\/2.bp.blogspot.com\/-wLzkTT-OnkA\/VvnjzMX2wFI\/AAAAAAAAAs8\/X58dyu5SvbYu4VUh71topnqRvE0w7Go3A\/s400\/yellow_off.png\" alt=\"\" border=\"0\" \/><a href=\"http:\/\/2.bp.blogspot.com\/-imuaiNDLyFA\/Vvnjy38TN-I\/AAAAAAAAAs0\/zvnafr9biUw5HkH0K582iEcQm9IDuLuHw\/s1600\/yellow_on.png\"><img src=\"https:\/\/2.bp.blogspot.com\/-imuaiNDLyFA\/Vvnjy38TN-I\/AAAAAAAAAs0\/zvnafr9biUw5HkH0K582iEcQm9IDuLuHw\/s400\/yellow_on.png\" alt=\"\" border=\"0\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Na fase de captura da sequ\u00eancia, precisei me concentrar nos bot\u00f5es iluminados. Eles que indicam o pressionamento de uma cor. No momento em que a sequ\u00eancia for reproduzida, o foco \u00e9 nos bot\u00f5es n\u00e3o-iluminados. Para cada bot\u00e3o &#8220;<em>on<\/em>&#8220;, defini um padr\u00e3o de similaridade.<\/p>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/4786e4a1a6f3073b41c07c12a2a03839.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/4786e4a1a6f3073b41c07c12a2a03839\">Gist<\/a>.<\/noscript><\/div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><\/div>\n<p style=\"text-align: justify;\">Isso vai nos ajudar a verificar se esse recorte existe dentro uma imagem maior. Nesse caso, a imagem maior \u00e9 um <em>screenshot<\/em> no momento exato em que o aplicativo seleciona uma cor e a acende. O ajuste na similaridade previne equ\u00edvocos na hora do Sikuli encontrar uma determinada imagem. Para mais detalhes do Sikuli veja a s\u00e9rie de posts no <em><a href=\"http:\/\/vanilton.net\/blog\/category\/automacao\/sikuli\/\" target=\"_blank\">link<\/a><\/em>.<\/p>\n<p>A classe Robot do Java captura nosso screenshot.<\/p>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/23084df3512185b4f82dcb5876a9c626.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/23084df3512185b4f82dcb5876a9c626\">Gist<\/a>.<\/noscript><\/div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><\/div>\n<p>Usei um contador no nome do arquivo para ter controle sobre cada <em>screenshot<\/em>, mas acredito que o nome poderia ser \u00fanico.<\/p>\n<p>Para localizar\u00a0uma imagem contida em outra, \u00e9 utilizado a\u00a0classe <em>Finder<\/em> do Sikuli. Para procurar o recorte do bot\u00e3o vermelho dentro do <em>screenshot<\/em>, fiz uso do meu objeto definido l\u00e1 no come\u00e7o.<\/p>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/734d5dd0deb5990c6210933a33edd911.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/734d5dd0deb5990c6210933a33edd911\">Gist<\/a>.<\/noscript><\/div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><\/div>\n<p style=\"text-align: justify;\">Se a cor \u00e9 encontrada, j\u00e1 adiciono seu c\u00f3digo a um <em>ArrayList<\/em> (chamado aqui de &#8220;sequence&#8221;). Dessa forma, poderei repetir a sequ\u00eancia mais tarde.<\/p>\n<p style=\"text-align: justify;\">Como a sequ\u00eancia \u00e9 gradual, isto \u00e9, na primeira passagem o aplicativo me desafia com uma cor, a qual devo repeti-la; na segunda passagem, s\u00e3o duas cores e assim sucessivamente, \u00e9 s\u00f3 colocar tudo dentro de um <em>loop<\/em>.<\/p>\n<p style=\"text-align: justify;\">A repeti\u00e7\u00e3o da sequ\u00eancia \u00e9 igualmente simples. Nesse caso, baseado no <em>ArrayList<\/em>, o bot\u00e3o vermelho que est\u00e1 apagado \u00e9 clicado. O trecho de c\u00f3digo para as outras cores \u00e9 id\u00eantico.<\/p>\n<div class=\"oembed-gist\"><script src=\"https:\/\/gist.github.com\/Vanilton18\/a0b4a0e9d55b5e9faaf2fdfcb4571e42.js\"><\/script><noscript>View the code on <a href=\"https:\/\/gist.github.com\/Vanilton18\/a0b4a0e9d55b5e9faaf2fdfcb4571e42\">Gist<\/a>.<\/noscript><\/div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><\/div>\n<p>Dessa forma, mesmo nas sequ\u00eancias mais longas, o Sikuli foi capaz de reproduzi-las com maestria.<\/p>\n<figure id=\"attachment_171\" aria-describedby=\"caption-attachment-171\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-full wp-image-171\" src=\"http:\/\/vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/DesafioAgileTester.png\" alt=\"DesafioAgileTester\" width=\"600\" height=\"200\" srcset=\"https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/DesafioAgileTester.png 600w, https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/DesafioAgileTester-300x100.png 300w, https:\/\/www.vanilton.net\/blog\/wp-content\/uploads\/2016\/03\/DesafioAgileTester-520x173.png 520w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-171\" class=\"wp-caption-text\">DesafioAgileTester<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Como parte do desafio proposto pelo Vanilton l\u00e1 no Agile Testers, resolvi escrever um pequeno post sobre a minha experi\u00eancia com o Sikuli em um aplicativo mobile. A ideia n\u00e3o \u00e9 ser um tutorial, mas<a class=\"read-more\" href=\"https:\/\/www.vanilton.net\/blog\/automacao\/2016\/03\/29\/automatizacao-de-game-mobile-utilizando-sikuli\/\">Continue reading<\/a><\/p>\n","protected":false},"author":2,"featured_media":175,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,6,33,5,30],"tags":[35,36,34,18,21],"wppr_data":[],"_links":{"self":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/162"}],"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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/comments?post=162"}],"version-history":[{"count":12,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":180,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/posts\/162\/revisions\/180"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/media\/175"}],"wp:attachment":[{"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/media?parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/categories?post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vanilton.net\/blog\/wp-json\/wp\/v2\/tags?post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}