<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wesley Miranda</title>
    <description>The latest articles on DEV Community by Wesley Miranda (@wesleymiranda).</description>
    <link>https://dev.to/wesleymiranda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3076407%2Fe006bc9d-9b36-44a5-9137-34509e065768.jpeg</url>
      <title>DEV Community: Wesley Miranda</title>
      <link>https://dev.to/wesleymiranda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wesleymiranda"/>
    <language>en</language>
    <item>
      <title>EXCEL VBA: PREENCHIMENTO AUTOMÁTICO DE TABELA</title>
      <dc:creator>Wesley Miranda</dc:creator>
      <pubDate>Fri, 22 Aug 2025 18:08:29 +0000</pubDate>
      <link>https://dev.to/wesleymiranda/excel-vbapreenchimento-automatico-de-tabela-2396</link>
      <guid>https://dev.to/wesleymiranda/excel-vbapreenchimento-automatico-de-tabela-2396</guid>
      <description>&lt;p&gt;No final do ano passado (2024), desenvolvi uma solução para um desafio recorrente que enfrentamos durante nosso processo de planejamento estratégico: a consolidação segura e eficiente de dados históricos e futuros da equipe.&lt;/p&gt;

&lt;p&gt;A situação era a seguinte: toda vez que iniciávamos o planejamento, recebíamos uma base de dados do RH (com informações como nome do funcionário, data de admissão, cargo, salário atual, etc.) em uma planilha, e eu me conectava a ela via Power Query. Essa mesma planilha precisava ser compartilhada com os gestores, para que eles pudessem prever e inserir futuras movimentações, como promoções, ajustes salariais ou mudanças de cargo e etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O grande dilema era:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se eu mantivesse a planilha vinculada direto à consulta (query) que puxa os dados do RH, corria o risco de sobrescrever ou perder todas as informações preenchidas manualmente pelos gestores ao atualizar os dados.      &lt;/p&gt;

&lt;p&gt;Se eu criasse uma planilha separada só para as projeções, ia acabar duplicando informações (ex: as promoções dependem do cargo atual), e eu teria as mesmas informações da primeira planilha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minha solução:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmir-s3-cdn-cf.behance.net%2Fproject_modules%2Ffs%2F2007dd233081551.68a899708ca9f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmir-s3-cdn-cf.behance.net%2Fproject_modules%2Ffs%2F2007dd233081551.68a899708ca9f.gif" width="760" height="296"&gt;&lt;/a&gt;&lt;br&gt;
    &lt;a href="https://mir-s3-cdn-cf.behance.net/project_modules/fs/2007dd233081551.68a899708ca9f.gif" rel="noopener noreferrer"&gt;link imagem melhor resolução&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Decidi usar VBA para criar um processo inteligente e não-destrutivo. Criei uma macro que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifica e trata a planilha como um objeto estruturado (ListObject): Isso me deu um controle muito maior sobre as linhas, colunas e dados, permitindo que a automação fosse precisa e menos vulnerável a quebras.&lt;/li&gt;
&lt;li&gt;Importa os dados do RH com segurança: Ao ser acionada, a macro percorre a tabela principal e compara as informações novas com as já existentes. Em vez de simplesmente substituir tudo, ela atualiza apenas as colunas específicas que vieram do RH (como salário atual ou cargo), mas preserva intactas as colunas onde os gestores fizeram suas projeções futuras.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desta forma, conseguimos o melhor dos dois mundos: os gestores têm liberdade para trabalhar em suas projeções diretamente na planilha, sem medo de perder o trabalho, e eu consigo trazer os dados oficiais mais recentes do RH sempre que necessário, mantendo tudo organizado e integrado em um único local.&lt;/p&gt;

&lt;p&gt;Foi um projeto extremamente gratificante, que eliminou um ponto de stress anual e garantiu que nosso processo de planejamento fosse baseado em dados confiáveis e completos. Acabo de reabri-la e utilizá-la novamente para o ciclo de 2025!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>10 Boas Práticas com Selenium para Evitar Bloqueios e Melhorar Sua Automação Web</title>
      <dc:creator>Wesley Miranda</dc:creator>
      <pubDate>Thu, 24 Apr 2025 01:16:41 +0000</pubDate>
      <link>https://dev.to/wesleymiranda/10-boas-praticas-com-selenium-para-evitar-bloqueios-e-melhorar-sua-automacao-web-7mh</link>
      <guid>https://dev.to/wesleymiranda/10-boas-praticas-com-selenium-para-evitar-bloqueios-e-melhorar-sua-automacao-web-7mh</guid>
      <description>&lt;h3&gt;
  
  
  1. Não Abuse no Volume de Requisições
&lt;/h3&gt;

&lt;p&gt;Muitas vezes na ânsia de coletar os dados exageramos na quantidade de requisições, o que gera riscos de bloqueios mesmo em sites famosos. Por exemplo se acessar &lt;a href="https://pt.wikipedia.org/robots.txt" rel="noopener noreferrer"&gt;o arquivo robots.txt da wikipedia&lt;/a&gt; verá a seguinte mensagem: "&lt;em&gt;algumas aranhas mal-comportadas por aí que são muito rápidas. Se você for irresponsável, seu acesso ao site poderá ser bloqueado&lt;/em&gt;".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjssbyo8e7o8n1dq0d9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjssbyo8e7o8n1dq0d9j.png" alt="Mensagem de bloqueio a requisições em grande volume na wikipedia" width="651" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respeite &lt;code&gt;robots.txt&lt;/code&gt; e limites de requisições para evitar bloqueios.
&lt;/li&gt;
&lt;li&gt;Use delays entre ações para não sobrecarregar o servidor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Crie um Perfil específico para isso no Chrome
&lt;/h3&gt;

&lt;p&gt;Evite login repetido, configure um perfil de usuário para manter cookies, cache e sessões salvas. Como usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ChromeOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--user-data-dir=C:/caminho/do/perfil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;profile-directory=Perfil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Vantagem&lt;/strong&gt;: Mantém configurações pessoais (extensões, preferências) entre execuções.  &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Defina uma Pasta Padrão para Downloads
&lt;/h3&gt;

&lt;p&gt;Evite bagunça e arquivos temporários, configure um diretório fixo para baixar arquivos, e evite deixar os seus arquivos pessoais misturados com os arquivos baixados pela automação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="n"&gt;prefs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;download.default_directory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:/caminho/para/downloads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;download.prompt_for_download&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_experimental_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prefs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Vantagem&lt;/strong&gt;: Organiza os downloads e facilita a automação de arquivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use Esperas (Waits) Adequadas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Evite &lt;code&gt;time.sleep()&lt;/code&gt; fixos, pois tornam o script lento e pouco confiável.&lt;/li&gt;
&lt;li&gt;Prefira &lt;strong&gt;WebDriverWait&lt;/strong&gt; + &lt;strong&gt;expected_conditions&lt;/strong&gt; para esperar por elementos de forma dinâmica:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.support.ui&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WebDriverWait&lt;/span&gt;
  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.support&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;expected_conditions&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;EC&lt;/span&gt;
  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.common.by&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;

  &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WebDriverWait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;until&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;EC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;presence_of_element_located&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;meu-elemento&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Selecione Elementos de Forma Robusta
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Priorize seletores como &lt;strong&gt;ID&lt;/strong&gt;, &lt;strong&gt;CSS Selectors&lt;/strong&gt; ou &lt;strong&gt;XPath&lt;/strong&gt; estáveis.
&lt;/li&gt;
&lt;li&gt;Evite XPath muito complexos ou dependentes de textos variáveis.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Gerencie Sessões e Drivers Corretamente
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sempre feche o navegador com &lt;code&gt;driver.quit()&lt;/code&gt; (não apenas &lt;code&gt;driver.close()&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acha que algo importante ficou de fora? Adicione nos comentários.&lt;/p&gt;

</description>
      <category>selenium</category>
      <category>webscraping</category>
      <category>automation</category>
      <category>rpa</category>
    </item>
  </channel>
</rss>
