{"id":2666,"date":"2018-09-15T14:04:00","date_gmt":"2018-09-15T17:04:00","guid":{"rendered":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/?p=2666"},"modified":"2025-09-02T15:09:55","modified_gmt":"2025-09-02T18:09:55","slug":"automatizacao-e-testes-com-selenium","status":"publish","type":"post","link":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/2018\/09\/15\/automatizacao-e-testes-com-selenium","title":{"rendered":"Automatiza\u00e7\u00e3o e testes com Selenium"},"content":{"rendered":"\n<p class=\"c22 c59\"><span class=\"c4\">O desenvolvimento de aplica\u00e7\u00f5es\u00a0<\/span><span class=\"c4 c7\">web<\/span><span class=\"c4\">\u00a0tornou-se extremamente popular nos \u00faltimos anos. Garantir o bom funcionamento desses sistemas considerando a grande variedade de\u00a0<\/span><span class=\"c4 c7\">browsers\u00a0<\/span><span class=\"c4\">existentes<\/span><span class=\"c4\">, entretanto, pode causar uma grande dor de cabe\u00e7a\u00a0<\/span><span class=\"c4 c7\">\u00a0<\/span><span class=\"c4\">(ol\u00e1, Internet Explorer!). Diversas ferramentas foram criadas para auxiliar nessa tortuosa fun\u00e7\u00e3o e, entre elas, est\u00e1 o\u00a0<\/span><span class=\"c4 c15\">Selenium<\/span><span class=\"c4\">.<\/span><\/p>\n<p class=\"c22\"><span class=\"c4\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Com o Selenium \u00e9 poss\u00edvel automatizar diferentes tipos de testes necess\u00e1rios para a manuten\u00e7\u00e3o do ciclo de vida de um\u00a0<\/span><span class=\"c4 c7\">software<\/span><span class=\"c4\">, tais como\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/softwaretestingfundamentals.com\/acceptance-testing\/&amp;sa=D&amp;ust=1588915410941000\">testes de aceita\u00e7\u00e3o<\/a><\/span><span class=\"c4\">\u00a0e\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/softwaretestingfundamentals.com\/functional-testing\/&amp;sa=D&amp;ust=1588915410941000\">testes funcionais<\/a><\/span><span class=\"c4\">\u00a0(ainda nesta reda\u00e7\u00e3o, veremos como utiliz\u00e1-lo em conjunto com\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/softwaretestingfundamentals.com\/unit-testing\/&amp;sa=D&amp;ust=1588915410942000\">testes unit\u00e1rios<\/a><\/span><span class=\"c4\">). Al\u00e9m disso, a ferramenta permite a automatiza\u00e7\u00e3o de praticamente qualquer tarefas repetitiva que precisamos realizar na\u00a0<\/span><span class=\"c4 c7\">web\u00a0<\/span><span class=\"c4\">(exemplos por conta de sua imagina\u00e7\u00e3o)<\/span><span class=\"c4 c7\">.<\/span><\/p>\n<p class=\"c45\"><img decoding=\"async\" class=\"aligncenter\" title=\"\" src=\"https:\/\/lh4.googleusercontent.com\/0WmYAlm4ivOw8Ogw2NN0J-a8wPu-HrQd-J--nNhXTs4_OC2e5WRP4x-CVWZ1Hw_ZZCzUB3iCnOIUN1I8pO0uZzty4ebmL5LIhQsGFjtBPGYMA9DbYG2rc2v3OWuXtOfpZy5HKQ6W\" alt=\"\" \/><\/p>\n<p class=\"c45\"><span class=\"c60 c4 c34 c7\">Selenium automates browsers. That&#8217;s it!\u00a0<\/span><span class=\"c0 c7 c57\">\u2014<\/span><span class=\"c4 c34 c7 c60\">\u00a0<\/span><span class=\"c33 c60 c4 c34 c73\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/www.seleniumhq.org\/&amp;sa=D&amp;ust=1588915410943000\">SeleniumHQ<\/a><\/span><\/p>\n<p class=\"c22\"><span class=\"c4\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Podemos utilizar o Selenium atrav\u00e9s de sua\u00a0<\/span><span class=\"c4 c9\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.seleniumhq.org\/selenium-ide\/&amp;sa=D&amp;ust=1588915410943000\">IDE<\/a><\/span><span class=\"c4\">\u00a0ou por uma\u00a0<\/span><span class=\"c4 c7\">client<\/span><span class=\"c4\">\u00a0API. De forma geral, os comandos definidos s\u00e3o enviados para o Selenium\u00a0<\/span><span class=\"c4 c7\">WebDriver<\/span><span class=\"c4\">\u00a0que, os repassa para o\u00a0<\/span><span class=\"c4 c7\">browser<\/span><span class=\"c4\">\u00a0desejado e, se necess\u00e1rio,\u00a0<\/span><span class=\"c4\">retorna<\/span><span class=\"c18 c4\">\u00a0os resultados. Aqui, iremos utiliz\u00e1-lo atrav\u00e9s da API em Python. Vamos l\u00e1!<\/span><\/p>\n<p class=\"c27 c23\">\u00a0<\/p>\n<p class=\"c27\"><strong><span class=\"c4 c15\">Preparando o ambiente &#8212;\u00a0<\/span><span class=\"c51 c31 c4 c7 c15\">setup:<\/span><\/strong><\/p>\n<ul class=\"c42 lst-kix_zigpc7m641wn-0 start\">\n<li class=\"c22 c29\"><span class=\"c4\">Antes de continuar certifique-se de ter instalado em seu computador o Python 3,\u00a0<\/span><span class=\"c4 c7\">pip\u00a0<\/span><span class=\"c4\">e o\u00a0<\/span><span class=\"c4 c7\">virtualenv<\/span><span class=\"c4\">\u00a0<\/span><span class=\"c47 c34\">(<\/span><span class=\"c4 c47 c34\">$\u00a0<\/span><span class=\"c4 c34 c30\">pip install virtualenv<\/span><span class=\"c34 c30 c69\">)<\/span><span class=\"c47 c34\">.\u00a0<\/span><span class=\"c4\">Os passos abaixos s\u00e3o espec\u00edficos para Linux (usu\u00e1rios Windows podem consultar a documenta\u00e7\u00e3o\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/selenium-python.readthedocs.io\/installation.html&amp;sa=D&amp;ust=1588915410946000\">aqui<\/a><\/span><span class=\"c4\">).<\/span><\/li>\n<\/ul>\n<p class=\"c27\"><strong><span class=\"c18 c4\">1. Inicialmente, crie e ative um ambiente virtual:<\/span><\/strong><\/p>\n<p class=\"c61 c62\"><code><span class=\"c17 c4 c55\">$ virtualenv -p python3 myenv<\/span><\/code><\/p>\n<p class=\"c61\"><code><span class=\"c17 c4 c55\">$ cd myenv<\/span><\/code><\/p>\n<p class=\"c61\"><code><span class=\"c17 c4 c55\">$ source bin\/activate<\/span><\/code><\/p>\n<p class=\"c61\"><strong><span class=\"c4\">2. Instale o Selenium com o\u00a0<\/span><span class=\"c4 c7\">pip<\/span><span class=\"c18 c4\">:<\/span><\/strong><\/p>\n<p class=\"c27\"><code><span class=\"c4 c34 c30\">$ <\/span><span class=\"c17 c4 c55\">pip install selenium<\/span><\/code><\/p>\n<p class=\"c27\"><strong><span class=\"c4\">3. Baixe o<\/span><span class=\"c4 c7\">\u00a0driver<\/span><span class=\"c4\">\u00a0do<\/span><span class=\"c4 c7\">\u00a0browser\u00a0<\/span><span class=\"c4\">em que voc\u00ea deseja executar os testes. Nesse exemplo iremos utilizar o Firefox, outros<\/span><span class=\"c4 c7\">\u00a0drivers<\/span><span class=\"c4\">\u00a0s\u00e3o listados na tabela abaixo.<\/span><\/strong><\/p>\n\n<table class=\"c19\">\n<tbody>\n<tr class=\"c63\">\n<td class=\"c65\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c4 c43 c15\">Chrome<\/span><\/p>\n<\/td>\n<td class=\"c66\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c24 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/sites.google.com\/a\/chromium.org\/chromedriver\/downloads&amp;sa=D&amp;ust=1588915410950000\">https:\/\/sites.google.com\/a\/chromium.org\/chromedriver\/downloads<\/a><\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c64\">\n<td class=\"c65\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c4 c43 c15\">Edge<\/span><\/p>\n<\/td>\n<td class=\"c66\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c24 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/developer.microsoft.com\/en-us\/microsoft-edge\/tools\/webdriver\/&amp;sa=D&amp;ust=1588915410951000\">https:\/\/developer.microsoft.com\/en-us\/microsoft-edge\/tools\/webdriver\/<\/a><\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c63\">\n<td class=\"c65\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c4 c43 c15\">Firefox<\/span><\/p>\n<\/td>\n<td class=\"c66\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c24 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/github.com\/mozilla\/geckodriver\/releases&amp;sa=D&amp;ust=1588915410953000\">https:\/\/github.com\/mozilla\/geckodriver\/releases<\/a><\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c63\">\n<td class=\"c65\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c4 c43 c15\">Safari<\/span><\/p>\n<\/td>\n<td class=\"c66\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c27\"><span class=\"c4 c24\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/webkit.org\/blog\/6900\/webdriver-support-in-safari-10\/&amp;sa=D&amp;ust=1588915410955000\">https:\/\/webkit.org\/blog\/6900\/webdriver-support-in-safari-10\/<\/a><\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<p class=\"c27\"><code><span class=\"c20\">$ wget <\/span><span class=\"c9 c34 c30 c55\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/github.com\/mozilla\/geckodriver\/releases\/download\/v0.24.0\/geckodriver-v0.24.0-linux64.tar.gz&amp;sa=D&amp;ust=1588915410957000\">https:\/\/github.com\/mozilla\/geckodriver\/releases\/download\/v0.24.0\/geckodriver-v0.24.0-linux64.tar.gz<\/a><\/span><span class=\"c20 c25 c54\">\u00a0&amp;&amp; tar -xvzf geckodriver-v0.24.0-linux64.tar.gz &amp;&amp; rm geckodriver-v0.24.0-linux64.tar.gz<\/span><\/code><\/p>\n<p class=\"c22\"><strong><span class=\"c4\">4. Adicione o\u00a0<\/span><span class=\"c4 c7\">driver\u00a0<\/span><span class=\"c4\">a var\u00edavel do sistema\u00a0<\/span><span class=\"c4 c7\">PATH<\/span><span class=\"c4\">\u00a0ou mova-o para a pasta\u00a0<\/span><span class=\"c4 c7\">bin<\/span><span class=\"c4\">\u00a0do\u00a0<\/span><span class=\"c4 c7\">virtualenv<\/span><span class=\"c18 c4\">:<\/span><\/strong><\/p>\n<p class=\"c27 c59 c71\"><code><span class=\"c20 c4\">$ mv geckodriver bin\/<\/span><\/code><\/p>\n<p class=\"c27\"><span class=\"c4 c15\">Partiu automatizar!<\/span><\/p>\n<p class=\"c22\"><span class=\"c48 c43 c34\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Vamos fazer um programa bem simples que ir\u00e1 realizar uma busca no Google,\u00a0<\/span><span class=\"c48 c43 c34 c7\">printar\u00a0<\/span><span class=\"c48 c43 c34\">o\u00a0<\/span><span class=\"c48 c43 c34 c7\">link<\/span><span class=\"c48 c43 c34\">\u00a0dos primeiros resultados e tirar um<\/span><span class=\"c48 c43 c34 c7\">\u00a0screenshot<\/span><span class=\"c25 c43 c34 c48\">\u00a0da p\u00e1gina. Para tal, crie um arquivo Python qualquer (e.g. gsearch.py) e cole o seguinte trecho de c\u00f3digo:<\/span><\/p>\n<table class=\"c19\">\n<tbody>\n<tr class=\"c37\">\n<td class=\"c13\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\">#!\/usr\/bin\/env python<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c26 c30 c15\">from<\/span><span class=\"c3 c34 c30\">\u00a0selenium\u00a0<\/span><span class=\"c3 c26 c30 c15\">import<\/span><span class=\"c17 c3\">\u00a0webdriver<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c26 c30 c15\">from<\/span><span class=\"c3 c34 c30\">\u00a0datetime\u00a0<\/span><span class=\"c3 c26 c15 c30\">import<\/span><span class=\"c17 c3\">\u00a0datetime<\/span><\/p>\n<p class=\"c16\"><span class=\"c25 c3 c34 c44 c30\"># cria uma nova sessao no browser<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0webdriver<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">Firefox<\/span><span class=\"c5 c3\">()<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">maximize_window<\/span><span class=\"c5 c3\">()<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># navega para a home page do Google<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">get<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;http:\/\/www.google.com\/&#8221;<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># procura pelo elemento referente a searchbox<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">search_field\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">find_element_by_name<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;q&#8221;<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># envia a string @query para o element e realiza a busca<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">query\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0<\/span><span class=\"c1 c34 c30\">&#8220;Test Driven Development&#8221;<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">search_field<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">send_keys<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c34 c30\">query<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">search_field<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">submit<\/span><span class=\"c5 c25 c3\">()<\/span><\/p>\n<p class=\"c16\"><span class=\"c5 c3 c25\"># espera at\u00e9 3 segundos at\u00e9 o resultado ficar pronto<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">implicitly_wait<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c34 c67 c30\">3<\/span><span class=\"c5 c3\">)<\/span><span class=\"c17 c3\">\u00a0<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># procura pelos resultados<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">results\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">find_elements_by_class_name<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;r&#8221;<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># para cada resultado (&lt;div&gt;) procura a ancora (&lt;a&gt;) que contem o link da pagina<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c26 c30 c15\">print<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;* {} primeiros resultados para a busca &#8216;{}&#8217;:&#8221;<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">format<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c50 c34 c30\">len<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c34 c30\">results<\/span><span class=\"c5 c3\">),<\/span><span class=\"c3 c34 c30\">\u00a0query<\/span><span class=\"c5 c3\">))<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c26 c30 c15\">for<\/span><span class=\"c3 c34 c30\">\u00a0index<\/span><span class=\"c5 c3\">,<\/span><span class=\"c3 c34 c30\">\u00a0r\u00a0<\/span><span class=\"c3 c26 c30 c15\">in<\/span><span class=\"c3 c34 c30\">\u00a0<\/span><span class=\"c3 c34 c30 c50\">enumerate<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c34 c30\">results<\/span><span class=\"c5 c3\">):<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0link\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0r<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">find_elements_by_tag_name<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;a&#8221;<\/span><span class=\"c5 c3\">)[<\/span><span class=\"c3 c34 c67 c30\">0<\/span><span class=\"c5 c3\">].<\/span><span class=\"c3 c34 c30\">get_attribute<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;href&#8221;<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"c3 c26 c30 c15\">print<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8220;<\/span><span class=\"c3 c34 c30 c75\">\\t<\/span><span class=\"c1 c34 c30\">{:2d}. {}&#8221;<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">format<\/span><span class=\"c5 c3\">(<\/span><span class=\"c3 c34 c30\">index\u00a0<\/span><span class=\"c3 c34 c30 c46\">+<\/span><span class=\"c3 c34 c30\">\u00a0<\/span><span class=\"c3 c34 c30 c67\">1<\/span><span class=\"c5 c3\">,<\/span><span class=\"c3 c34 c30\">\u00a0link<\/span><span class=\"c5 c3\">))<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># tira um print da pagina<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">now\u00a0<\/span><span class=\"c5 c3\">=<\/span><span class=\"c3 c34 c30\">\u00a0datetime<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">now<\/span><span class=\"c5 c3\">().<\/span><span class=\"c3 c34 c30\">strftime<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c30 c34\">&#8216;%Y-%m-%d_%H-%M-%S&#8217;<\/span><span class=\"c5 c3\">)<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">save_screenshot<\/span><span class=\"c5 c3\">(<\/span><span class=\"c1 c34 c30\">&#8216;search_screenshot-{}.png&#8217;<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">format<\/span><span class=\"c3 c5\">(<\/span><span class=\"c3 c34 c30\">now<\/span><span class=\"c5 c3\">))<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c44 c30\"># fecha a sessao com o browser<\/span><\/p>\n<p class=\"c16\"><span class=\"c3 c34 c30\">browser<\/span><span class=\"c5 c3\">.<\/span><span class=\"c3 c34 c30\">quit<\/span><span class=\"c5 c3\">()<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"c27\"><span class=\"c4 c47 c34\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Para rodar o exemplo utilize o comando\u00a0<\/span><span class=\"c20 c4\">$ python gsearch.py<\/span><\/p>\n<p class=\"c22\"><span class=\"c47 c34\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"c4 c47 c34\">Agora \u00e9 s\u00f3 usar e abusar da criatividade para automatizar as tarefas do seu dia a dia no<\/span><span class=\"c4 c47 c34 c7\">\u00a0browser<\/span><span class=\"c35 c4 c34 c53\">: procure pelo pre\u00e7o de algum produto em m\u00faltiplas lojas simultaneamente ou verifique se saiu um novo epis\u00f3dio da sua s\u00e9rie preferida &#8211; \u00e9 com voc\u00ea! \ud83d\ude42<\/span><\/p>\n<p class=\"c45\"><span class=\"c4 c47 c15\">Dica:\u00a0<\/span><span class=\"c4 c34 c47\">usu\u00e1rios Linux podem fazer uso do\u00a0<\/span><span class=\"c9 c4 c47 c34 c7\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/pt.wikipedia.org\/wiki\/Crontab&amp;sa=D&amp;ust=1588915410977000\">cron<\/a><\/span><span class=\"c4 c47 c34 c7\">\u00a0<\/span><span class=\"c4 c47 c34\">para agendar a execu\u00e7\u00e3o de\u00a0<\/span><span class=\"c4 c34 c7 c35\">scripts!<\/span><\/p>\n<p class=\"c27\"><span class=\"c25 c31 c4 c15\">Hora dos testes!<\/span><\/p>\n<p class=\"c22\"><span class=\"c4\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Com o Selenium \u00e9 poss\u00edvel reproduzir todo o\u00a0<\/span><span class=\"c4 c7\">test suite\u00a0<\/span><span class=\"c4\">de um sistema no ambiente real onde a aplica\u00e7\u00e3o\u00a0<\/span><span class=\"c4 c7\">web<\/span><span class=\"c4\">\u00a0est\u00e1 rodando. Existem diferentes tipos de casos de teste que podem ser realizados com o apoio da ferramenta. Nesse exemplo iremos utilizar o Selenium em conjunto com o\u00a0<\/span><span class=\"c4 c7\">framework<\/span><span class=\"c4\">\u00a0para testes unit\u00e1rios do Python, o\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/docs.python.org\/3.6\/library\/unittest.html%23module-unittest&amp;sa=D&amp;ust=1588915410979000\">unittest<\/a><\/span><span class=\"c4\">. O unittest \u00e9 inspirado no famoso\u00a0<\/span><span class=\"c9 c4\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/junit&amp;sa=D&amp;ust=1588915410979000\">JUnit<\/a><\/span><span class=\"c18 c4\">\u00a0e est\u00e1 inclu\u00eddo como um m\u00f3dulo nativo na biblioteca padr\u00e3o do Python.<\/span><\/p>\n<p class=\"c22 c59\"><span class=\"c0\">Vamos definir dois testes, um teste para validar a abertura do menu \u2018Publica\u00e7\u00f5es\u2019 no site do PET-SI e outro para verificar se a busca por \u2018PET Reda\u00e7\u00e3o\u2019\u00a0<\/span><span class=\"c0\">retorna<\/span><span class=\"c0\">\u00a0algum resultado.\u00a0<\/span><span class=\"c4\">Para tal, c<\/span><span class=\"c18 c4\">rie um arquivo (e.g. utest_1.py) e cole o c\u00f3digo abaixo:<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<table class=\"c40\">\n<tbody>\n<tr class=\"c37\">\n<td class=\"c13\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c10\"><span class=\"c3 c44\">#!\/usr\/bin\/env python<\/span><\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">from<\/span><span class=\"c3\">\u00a0selenium\u00a0<\/span><span class=\"c3 c26 c15\">import<\/span><span class=\"c18 c3\">\u00a0webdriver<\/span><\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">from<\/span><span class=\"c3\">\u00a0selenium<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">webdriver<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">common<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">keys\u00a0<\/span><span class=\"c3 c26 c15\">import<\/span><span class=\"c18 c3\">\u00a0Keys<\/span><\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">from<\/span><span class=\"c3\">\u00a0selenium<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">webdriver<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">common<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">by\u00a0<\/span><span class=\"c3 c26 c15\">import<\/span><span class=\"c18 c3\">\u00a0By<\/span><\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">import<\/span><span class=\"c18 c3\">\u00a0unittest<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">class<\/span><span class=\"c3\">\u00a0PetPage<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">unittest<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">TestCase<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0setUp<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser\u00a0<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">\u00a0webdriver<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">Firefox<\/span><span class=\"c25 c3 c11 c38 c34\">()<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">implicitly_wait<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3 c67\">10<\/span><span class=\"c25 c3 c11 c38 c34\">)<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">get<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;http:\/\/coral.ufsm.br\/pet-si\/&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0test_open_publicacoes_page<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0\u00a0<\/span><span class=\"c3 c15\">\u00a0 self<\/span><span class=\"c3 c11 c15\">.<\/span><span class=\"c3 c15\">browser<\/span><span class=\"c3 c11 c15\">.<\/span><span class=\"c3 c15\">find_element_by_xpath<\/span><span class=\"c3 c11 c15\">(<\/span><span class=\"c1 c15\">&#8220;\/\/a[text() = &#8216;Publica\u00e7\u00f5es&#8217;]&#8221;<\/span><span class=\"c3 c11 c15\">).<\/span><span class=\"c3 c15\">click<\/span><span class=\"c3 c11 c15\">()<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">assertIn<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8216;category\/posts&#8217;<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">current_url<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c10\"><span class=\"c18 c3\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0test_search<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span class=\"c3 c15\">\u00a0self<\/span><span class=\"c3 c11 c15\">.<\/span><span class=\"c3 c15\">browser<\/span><span class=\"c3 c11 c15\">.<\/span><span class=\"c3 c15\">find_element_by_xpath<\/span><span class=\"c3 c11 c15\">(<\/span><span class=\"c1 c15\">&#8220;\/\/a[text() = &#8216;Publica\u00e7\u00f5es&#8217;]&#8221;<\/span><span class=\"c3 c11 c15\">).<\/span><span class=\"c3 c15\">click<\/span><span class=\"c3 c11 c15\">()<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field\u00a0<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">\u00a0self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">find_element_by_id<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;s&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">send_keys<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;PET Reda\u00e7\u00e3o&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">send_keys<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">Keys<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">ENTER<\/span><span class=\"c3 c11\">)<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c44\"># submit query<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">assertTrue<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">is_element_on_page<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">By<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">CSS_SELECTOR<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c1\">&#8216;div.post&#8217;<\/span><span class=\"c3 c11\">))\u00a0<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c44\"># check for results<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0tearDown<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">quit<\/span><span class=\"c3 c11\">()<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0is_element_on_page<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0how<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0what<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">try<\/span><span class=\"c3 c11\">:<\/span><span class=\"c18 c3\">\u00a0<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">find_element<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">by<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">how<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0value<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">what<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">except<\/span><span class=\"c3\">:<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">return<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c58\">False<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0\u00a0<\/span><span class=\"c3 c15 c26\">return<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c58\">True<\/span><\/p>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c10\"><span class=\"c3 c26 c15\">if<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c58\">__name__<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c46\">==<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c1\">&#8216;__main__&#8217;<\/span><span class=\"c3 c11\">:<\/span><\/p>\n<p class=\"c10\"><span class=\"c3\">\u00a0 \u00a0 unittest<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">main<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">verbosity<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3 c67\">2<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"c10 c23\">\u00a0<\/p>\n<p class=\"c22\"><span class=\"c0\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Rode o programa (<\/span><span class=\"c20 c4\">$ python utest_1.py<\/span><span class=\"c0\">) e veja o resultado. Voc\u00ea deve ter percebido que uma nova inst\u00e2ncia do\u00a0<\/span><span class=\"c0 c7\">browser<\/span><span class=\"c18 c0\">\u00a0\u00e9 aberta para cada um dos testes. Nem sempre esse comportamento \u00e9 desejado (veja a necessidade da redund\u00e2ncia nas linhas 15 e 19). Vamos melhorar um pouco nosso c\u00f3digo fazendo uso de algumas anota\u00e7\u00f5es. Para tal, crie um arquivo (e.g. utest_2.py) com o c\u00f3digo conforme segue abaixo:<\/span><\/p>\n<p class=\"c6 c23\">\u00a0<\/p>\n<table class=\"c19\">\n<tbody>\n<tr class=\"c37\">\n<td class=\"c13\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c6\"><span class=\"c3 c44\">\u00a0<\/span><span class=\"c3 c44 c15\">\u00a0 \u00a0\u2026<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c11\">@<\/span><span class=\"c3 c50\">classmethod<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0setUpClass<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">inst<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 inst<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser\u00a0<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">\u00a0webdriver<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">Firefox<\/span><span class=\"c25 c3 c11 c34 c38\">()<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 inst<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">implicitly_wait<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3 c67\">10<\/span><span class=\"c25 c3 c11 c38 c34\">)<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 inst<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">get<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;http:\/\/coral.ufsm.br\/pet-si\/&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c6 c23\">\u00a0<\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0test_01_open_publicacoes_page<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">find_element_by_xpath<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;\/\/a[text() = &#8216;Publica\u00e7\u00f5es&#8217;]&#8221;<\/span><span class=\"c3 c11\">).<\/span><span class=\"c3\">click<\/span><span class=\"c3 c11\">()<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">assertIn<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8216;category\/posts&#8217;<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">current_url<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c6\"><span class=\"c18 c3\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0test_02_search<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c25 c3 c11 c38 c34\">):<\/span><\/p>\n<p class=\"c6\"><span class=\"c25 c3 c11 c38 c34\">\u00a0 \u00a0 \u00a0 \u00a0 # n\u00e3o \u00e9 necess\u00e1rio navegar para \u2018Publica\u00e7\u00f5es\u2019 novamente<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field\u00a0<\/span><span class=\"c3 c11\">=<\/span><span class=\"c3\">\u00a0self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">find_element_by_id<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;s&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">send_keys<\/span><span class=\"c3 c11\">(<\/span><span class=\"c1\">&#8220;PET Reda\u00e7\u00e3o&#8221;<\/span><span class=\"c3 c11\">)<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">search_field<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">send_keys<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">Keys<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">ENTER<\/span><span class=\"c3 c11\">)<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c3 c44\"># submit query<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0 self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">assertTrue<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">self<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">is_element_on_page<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">By<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">CSS_SELECTOR<\/span><span class=\"c3 c11\">,<\/span><span class=\"c3\">\u00a0<\/span><span class=\"c1\">&#8216;div.post&#8217;<\/span><span class=\"c3 c11\">))\u00a0<\/span><span class=\"c3\">\u00a0\u00a0<\/span><span class=\"c3 c44\"># check for results<\/span><\/p>\n<p class=\"c6 c23\">\u00a0<\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c11\">@<\/span><span class=\"c3 c50\">classmethod<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0\u00a0<\/span><span class=\"c3 c26 c15\">def<\/span><span class=\"c3\">\u00a0tearDownClass<\/span><span class=\"c3 c11\">(<\/span><span class=\"c3\">inst<\/span><span class=\"c3 c11\">):<\/span><\/p>\n<p class=\"c6\"><span class=\"c3\">\u00a0 \u00a0 \u00a0 \u00a0inst<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">browser<\/span><span class=\"c3 c11\">.<\/span><span class=\"c3\">quit<\/span><span class=\"c3 c11\">()<\/span><\/p>\n<p class=\"c6\"><span class=\"c3 c15\">\u00a0 \u00a0\u2026<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"c22\"><span class=\"c0\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Rode o c\u00f3digo (<\/span><span class=\"c4 c20\">$ python utest_2.py<\/span><span class=\"c18 c0\">) e veja o resultado. \u00c9 importante notar que os testes s\u00e3o executados de acordo com seus nomes (ordena\u00e7\u00e3o de strings padr\u00e3o do Python &#8211; alfabeticamente + numericamente), por isso a adi\u00e7\u00e3o do n\u00famero do teste (01 e 02) garante a ordem de execu\u00e7\u00e3o. \u00c9 claro que isso \u00e9 apenas uma alternativa, nestes casos seria mais inteligente n\u00e3o criar m\u00e9todos independentes e sim um \u00fanico caso de teste.<\/span><\/p>\n<p class=\"c56\"><span class=\"c25 c31 c15 c70 c76\">Por onde continuar?!<\/span><\/p>\n<p class=\"c8\"><span class=\"c0 c15\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"c0\">O Selenium possui diversas funcionalidades a serem exploradas, nessa reda\u00e7\u00e3o apenas fizemos um\u00a0<\/span><span class=\"c0 c7\">overview<\/span><span class=\"c18 c0\">\u00a0geral da ferramenta. Aos interessados, seguem alguns t\u00f3picos para prosseguir os estudos na linha de testes automatizados:<\/span><\/p>\n<ul class=\"c42 lst-kix_l3esqijhqeo-0 start\">\n<li class=\"c32\"><span class=\"c33 c0\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/pt.wikipedia.org\/wiki\/Behavior_Driven_Development&amp;sa=D&amp;ust=1588915411017000\">Behavior Driven Development<\/a><\/span><span class=\"c0\">: escreva cen\u00e1rios de testes poderosos e elegantes com o\u00a0<\/span><span class=\"c33 c0\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/cucumber.io\/&amp;sa=D&amp;ust=1588915411018000\">Cucumber<\/a><\/span><span class=\"c0\">\u00a0(para Python veja o\u00a0<\/span><span class=\"c0 c33\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/behave.readthedocs.io\/en\/latest\/index.html%23&amp;sa=D&amp;ust=1588915411018000\">Behave<\/a><\/span><span class=\"c18 c0\">).<\/span><\/li>\n<li class=\"c32\"><span class=\"c33 c0\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=http:\/\/selendroid.io\/&amp;sa=D&amp;ust=1588915411019000\">Selendroid<\/a><\/span><span class=\"c18 c0\">: automatiza\u00e7\u00e3o de testes para aplicativos Android (nativos ou h\u00edbridos);<\/span><\/li>\n<li class=\"c32\"><span class=\"c33 c0\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/pypi.org\/project\/castro\/&amp;sa=D&amp;ust=1588915411019000\">castro<\/a><\/span><span class=\"c0\">: grava\u00e7\u00e3o da execu\u00e7\u00e3o dos testes (<\/span><span class=\"c18 c0\">muito \u00fatil em ambientes em que \u00e9 necess\u00e1rio apurar a raz\u00e3o da falha de algum caso de teste);<\/span><\/li>\n<li class=\"c39 c62\"><span class=\"c33 c0\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/robotframework.org\/&amp;sa=D&amp;ust=1588915411020000\">Robot Framework<\/a><\/span><span class=\"c0\">:\u00a0<\/span><span class=\"c0 c7\">A<\/span><span class=\"c0 c7\">cceptance test-driven development<\/span><span class=\"c0\">\u00a0(ATDD) e\u00a0<\/span><span class=\"c0 c7\">Robotic process automation<\/span><span class=\"c18 c0\">\u00a0(RPA).<\/span><\/li>\n<\/ul>\n<p class=\"c56 c23 c62\">\u00a0<\/p>\n<p class=\"c56 c23\">\u00a0<\/p>\n<p class=\"c74\"><span class=\"c25 c31 c54 c15\">REFER\u00caNCIAS<\/span><\/p>\n<ul class=\"c42 lst-kix_1jywh6hsn7qv-0 start\">\n<li class=\"c39 c29\"><span class=\"c21\">SeleniumHQ. Selenium Documentation. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.seleniumhq.org\/docs\/&amp;sa=D&amp;ust=1588915411021000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Python. unittest \u2014 Unit testing framework. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/docs.python.org\/3\/library\/unittest.html%23module-unittest&amp;sa=D&amp;ust=1588915411021000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Read the Docs. Selenium with Python. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/selenium-python.readthedocs.io\/getting-started.html&amp;sa=D&amp;ust=1588915411022000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">TechBeamers. Build A Selenium Python Test Suite From Scratch Using Unittest. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.techbeamers.com\/selenium-python-test-suite-unittest\/&amp;sa=D&amp;ust=1588915411022000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">TechBeamers. Selenium Webdriver \u2013 20 Coding Tips to Improve Quality. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.techbeamers.com\/selenium-webdriver-coding-tips\/&amp;sa=D&amp;ust=1588915411023000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c29 c39\"><span class=\"c21\">CherCher Tech. Python Unittest Selenium. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/chercher.tech\/python\/python-unittest-selenium&amp;sa=D&amp;ust=1588915411023000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">DevMedia. Dominando o Selenium Web Driver na pr\u00e1tica. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.devmedia.com.br\/dominando-o-selenium-web-driver-na-pratica\/34183&amp;sa=D&amp;ust=1588915411024000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Medium. Top Tutorials To Learn Selenium For Beginners. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/medium.com\/quick-code\/top-tutorials-to-learn-selenium-for-beginners-4e1f301585&amp;sa=D&amp;ust=1588915411025000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Medium. BDD, Cucumber and Selenium WebDriver based Test Automation Framework in Python. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/medium.com\/@hmurari\/bdd-cucumber-and-selenium-webdriver-based-test-automation-framework-in-python-ae092a7581d3&amp;sa=D&amp;ust=1588915411025000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">IBM. Automated testing with Selenium and Cucumber. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.ibm.com\/developerworks\/library\/a-automating-ria\/index.html&amp;sa=D&amp;ust=1588915411026000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">The Tara Nights. Google Search Using Selenium And Python \u2013 Selenium Python Basics. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/www.thetaranights.com\/google-search-using-selenium-and-python-selenium-python-basics\/&amp;sa=D&amp;ust=1588915411026000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Sauce Labs. Selenium Tips: CSS Selectors. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/saucelabs.com\/resources\/articles\/selenium-tips-css-selectors&amp;sa=D&amp;ust=1588915411027000\">link<\/a><\/span><span class=\"c14\">)<\/span><\/li>\n<li class=\"c39 c29\"><span class=\"c21\">Sauce Labs. Getting Started with Selenium for Automated Website Testing. (<\/span><span class=\"c2\"><a class=\"c28\" href=\"https:\/\/www.google.com\/url?q=https:\/\/wiki.saucelabs.com\/display\/DOCS\/Getting%2BStarted%2Bwith%2BSelenium%2Bfor%2BAutomated%2BWebsite%2BTesting&amp;sa=D&amp;ust=1588915411027000\">link<\/a><\/span><span class=\"c21\">)<\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>O desenvolvimento de aplica\u00e7\u00f5es\u00a0web\u00a0tornou-se extremamente popular nos \u00faltimos anos. Garantir o bom funcionamento desses sistemas considerando a grande variedade de\u00a0browsers\u00a0existentes, entretanto, pode causar uma grande dor de cabe\u00e7a\u00a0\u00a0(ol\u00e1, Internet Explorer!). Diversas ferramentas foram criadas para auxiliar nessa tortuosa fun\u00e7\u00e3o e, entre elas, est\u00e1 o\u00a0Selenium. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Com o Selenium \u00e9 poss\u00edvel automatizar diferentes tipos de testes necess\u00e1rios [&hellip;]<\/p>\n","protected":false},"author":2948,"featured_media":2660,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,112],"tags":[189,203,149],"class_list":["post-2666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-destaques","category-redacao","tag-automacao-e-testes","tag-frameworks","tag-redacao"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/2666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/users\/2948"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/comments?post=2666"}],"version-history":[{"count":0,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/2666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media\/2660"}],"wp:attachment":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media?parent=2666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/categories?post=2666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/tags?post=2666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}