Como usar o Selenium IDE com Scripts & Comandos (Assert, Verify)

Índice:

Anonim

Usaremos o site da Mercury Tours como nosso aplicativo da web em teste. É um sistema de reserva de voos online que contém todos os elementos de que precisamos para este tutorial. Seu URL é http://demo.guru99.com/test/newtours/, e este será nosso URL base.

Criar um script por gravação

Vamos agora criar nosso primeiro script de teste no Selenium IDE usando o método mais comum - por gravação. Posteriormente, executaremos nosso script usando o recurso de reprodução.

Passo 1

  • Abra o Firefox e o Selenium IDE.
  • Digite o valor do nosso URL básico: http://demo.guru99.com/test/newtours/.
  • Ative o botão Gravar (se ainda não estiver ativado por padrão).
Passo 2

No Firefox, navegue até http://demo.guru99.com/test/newtours/. O Firefox deve levá-lo para uma página semelhante à mostrada abaixo.

etapa 3
  • Clique com o botão direito em qualquer espaço em branco da página, como no logotipo da Mercury Tours no canto superior esquerdo. Isso abrirá o menu de contexto do Selenium IDE. Nota: Não clique em nenhum objeto ou imagem com hiperlink
  • Selecione a opção "Mostrar comandos disponíveis".
  • Em seguida, selecione "assertTitle exact: Welcome: Mercury Tours." Este é um comando que garante que o título da página está correto.
Passo 4
  • Na caixa de texto "Nome do usuário" da Mercury Tours, digite um nome de usuário inválido, "invalidUNN".
  • Na caixa de texto "Senha", digite uma senha inválida, "invalidPWD".
Etapa 5
  • Clique no botão "Sign-In". O Firefox deve levá-lo a esta página.
Etapa 6

Desative o botão de gravação para interromper a gravação. Seu script agora deve ser semelhante ao mostrado abaixo.

Etapa 7

Agora que concluímos nosso script de teste, devemos salvá-lo em um caso de teste. No menu Arquivo, selecione "Salvar caso de teste". Como alternativa, você pode simplesmente pressionar Ctrl + S.

Etapa 8
  • Escolha o local desejado e nomeie o caso de teste como "Invalid_login".
  • Clique no botão "Salvar".
Etapa 9.

Observe que o arquivo foi salvo como HTML.

Etapa 10.

Volte para o Selenium IDE e clique no botão Playback para executar todo o script. O Selenium IDE deve ser capaz de replicar tudo perfeitamente.

Introdução aos Comandos do Selênio - Selenês

  • Os comandos Selenese podem ter no máximo dois parâmetros: destino e valor.
  • Os parâmetros não são obrigatórios o tempo todo. Depende de quantos o comando precisará.

3 tipos de comandos

Ações

Esses são comandos que interagem diretamente com os elementos da página.

Exemplo: o comando "clicar" é uma ação porque você interage diretamente com o elemento em que está clicando.

O comando "digitar" também é uma ação porque você está colocando valores em uma caixa de texto, e a caixa de texto os mostra a você em troca. Há uma interação bidirecional entre você e a caixa de texto.

Acessores

Eles são comandos que permitem armazenar valores em uma variável.

Exemplo: o comando "storeTitle" é um acessador porque apenas "lê" o título da página e o salva em uma variável. Ele não interage com nenhum elemento da página.

Afirmações

São comandos que verificam se uma determinada condição é atendida.

3 tipos de afirmações

  • Assert . Quando um comando "assert" falha, o teste é interrompido imediatamente.
  • Verifique . Quando um comando "verificar" falha, o Selenium IDE registra essa falha e continua com a execução do teste.
  • WaitFor . Antes de prosseguir para o próximo comando, os comandos "waitFor" irão primeiro esperar que uma determinada condição se torne verdadeira.
    • Se a condição se tornar verdadeira dentro do período de espera, a etapa será aprovada.
    • Se a condição não se tornar verdadeira, a etapa falhará. A falha é registrada e a execução do teste prossegue para o próximo comando.
    • Por padrão, o valor do tempo limite é definido como 30 segundos. Você pode alterar isso na caixa de diálogo Selenium IDE Options na guia General.

Assert vs. Verify

Comandos Comuns

Comando Número de Parâmetros Descrição
abrir 0 - 2

Abre uma página usando um URL.

click / clickAndWait 1

Clica em um elemento especificado.

type / typeKeys 2

Digita uma sequência de caracteres.

verifyTitle / assertTitle 1

Compara o título da página real com um valor esperado.

verifyTextPresent 1

Verifica se um determinado texto é encontrado na página.

verifyElementPresent 1

Verifica a presença de um determinado elemento.

verifyTable 2

Compara o conteúdo de uma tabela com os valores esperados.

waitForPageToLoad 1

Pausa a execução até que a página seja completamente carregada.

waitForElementPresent 1

Pausa a execução até que o elemento especificado se torne presente.

Crie um script manualmente com o Firebug

Agora, vamos recriar o mesmo caso de teste manualmente, digitando os comandos. Desta vez, precisaremos usar o Firebug.

Passo 1
  • Abra o Firefox e o Selenium IDE.
  • Digite o URL base (http://demo.guru99.com/test/newtours/).
  • O botão de gravação deve estar DESLIGADO.
Etapa 2: Clique na linha em branco superior no Editor.

Digite "abrir" na caixa de texto Comando e pressione Enter.

etapa 3
  • Navegue no Firefox até o nosso URL base e ative o Firebug
  • No painel Selenium IDE Editor, selecione a segunda linha (a linha abaixo do comando "abrir") e crie o segundo comando digitando "assertTitle" na caixa Comando.
  • Sinta-se à vontade para usar o recurso de preenchimento automático.
Passo 4
  • No Firebug, expanda a tag para exibir a tag .</li> <li>Clique no valor da tag <title> (que é "Bem-vindo: Mercury Tours") e cole-o no campo Destino no Editor.</li> </ul> </td> </tr> <tr> <td><strong>Etapa 5</strong> <ul> <li>Para criar o terceiro comando, clique na terceira linha em branco no Editor e digite "digite" na caixa de texto Comando.</li> <li>No Firebug, clique no botão "Inspecionar".</li> </ul> </td> </tr> <tr> <td>Clique na caixa de texto Nome do usuário. Observe que o Firebug mostra automaticamente o código HTML desse elemento.</td> </tr> <tr> <td><strong>Etapa 6</strong> <p>Observe que a caixa de texto Nome do usuário não possui um ID, mas possui um atributo NAME. Devemos, portanto, usar seu NOME como o localizador. Copie o valor NAME e cole-o no campo Destino no Selenium IDE.</p> <p>Ainda na caixa de texto Destino, prefixe "userName" com "name =", indicando que o Selenium IDE deve ter como alvo um elemento cujo atributo NAME é "userName".</p> <p>Digite "invalidUN" na caixa de texto Valor do Selenium IDE. Seu script de teste agora deve ser semelhante à imagem abaixo. Terminamos o terceiro comando. Nota: Em vez de invalidUN, você pode inserir qualquer outra string de texto. Mas o Selenium IDE diferencia maiúsculas de minúsculas e você digita valores / atributos exatamente como no aplicativo.</p> </td> </tr> <tr> <td><strong>Etapa 7</strong> <ul> <li>Para criar o quarto comando, digite "digite" na caixa de texto Comando.</li> <li>Novamente, use o botão "Inspecionar" do Firebug para obter o localizador da caixa de texto "Senha".</li> </ul> <ul> <li> <p>Cole o atributo NAME ("senha") no campo Destino e prefixe-o com "nome ="</p> </li> <li> <p>Digite "invalidPW" no campo Valor no Selenium IDE. Seu script de teste agora deve ser semelhante à imagem abaixo.</p> </li> </ul> </td> </tr> <tr> <td><strong>Etapa 8</strong> <ul> <li>Para o quinto comando, digite "clickAndWait" na caixa de texto Comando no Selenium IDE.</li> <li>Use o botão "Inspecionar" do Firebug para obter o localizador do botão "Entrar".</li> </ul> <ul> <li>Cole o valor do atributo NAME ("login") na caixa de texto Destino e prefixe-o com "name =".</li> <li>Seu script de teste agora deve ser semelhante à imagem abaixo.</li> </ul> </td> </tr> </tbody> </table> <p><strong>Etapa 9:</strong> Salve o caso de teste da mesma maneira que fizemos na seção anterior.</p> <a id="menu-6"></a> <h2>Usando o botão Localizar</h2> <p><strong>O botão Localizar no Selenium IDE é usado para verificar se o que colocamos na caixa de texto Destino é de fato o elemento de IU correto.</strong></p> <p>Vamos usar o caso de teste Invalid_login que criamos nas seções anteriores. Clique em qualquer comando com uma entrada de destino, digamos, o terceiro comando.</p> <p>Clique no botão Encontrar. Observe que a caixa de texto Nome do usuário na página Mercury Tours fica destacada por um segundo.</p> <p>Isso indica que o Selenium IDE foi capaz de detectar e acessar o elemento esperado corretamente. Se o botão Localizar realçar um elemento diferente ou nenhum elemento, então deve haver algo errado com seu script.</p> <a id="menu-7"></a> <h2>Executar Comando</h2> <p><strong>Isso permite que você execute qualquer comando único sem executar todo o caso de teste</strong> . Basta clicar na linha que deseja executar e, em seguida, clicar em "Ações> Executar este comando" na barra de menus ou simplesmente pressionar "X" no teclado.</p> <p><strong>Etapa 1.</strong> Certifique-se de que seu navegador esteja na página inicial da Mercury Tours. Clique no comando que deseja executar. Neste exemplo, clique na linha "type | userName | invalidUN".</p> <p><strong>Etapa 2.</strong> Pressione "X" no teclado.</p> <p><strong>Etapa 3.</strong> Observe que a caixa de texto do nome de usuário é preenchida com o texto "invalidUN"</p> <p><strong>A execução de comandos dessa maneira depende muito da página que o Firefox está exibindo no momento</strong> . Isso significa que se você tentar o exemplo acima com a página inicial do Google exibida em vez de Mercury Tours ', sua etapa falhará porque não há uma caixa de texto com um atributo "userName" na página inicial do Google.</p> <a id="menu-8"></a> <h2>Ponto de partida</h2> <p><strong>Um ponto inicial é um indicador que informa ao Selenium IDE em quais linhas a execução será iniciada</strong> . <strong>Sua tecla de atalho é "S".</strong></p> <p>No exemplo acima, a reprodução começará na terceira linha (digite | senha | invalidPW). <strong>Você só pode ter um ponto inicial em um único script de teste.</strong></p> <p>O ponto de início é semelhante a Executar Comando, de forma que eles dependem da página exibida no momento. O ponto inicial falhará se você estiver na página errada.</p> <a id="menu-9"></a> <h2>Breakpoints</h2> <p>Os pontos de interrupção são indicadores que informam ao Selenium IDE onde pausar automaticamente o teste. <strong>A tecla de atalho é "B".</strong></p> <p>O destaque amarelo significa que a etapa atual está pendente. Isso prova que o Selenium IDE pausou a execução nessa etapa. <strong>Você pode ter vários pontos de interrupção em um caso de teste.</strong></p> <a id="menu-10"></a> <h2>Etapa</h2> <p>Ele permite que você execute comandos sucessivos um de cada vez após pausar o caso de teste. Vamos usar o cenário da seção anterior "Pontos de interrupção".</p> <table> <tbody> <tr> <td width="50%"> </td> <td> <p><strong>Antes de clicar em "Etapa".</strong></p> <p>O caso de teste pausa na linha "clickAndWait | login".</p> </td> </tr> <tr> <td width="50%"> </td> <td> <p><strong>Depois de clicar em "Etapa".</strong></p> <p>A linha "clickAndWait | login" é executada e pausa para o próximo comando (verifyTitle | Sign-on: Mercury Tours).</p> <p>Observe que a próxima linha está pausada, embora não haja nenhum ponto de interrupção lá. Este é o objetivo principal do recurso Step - ele executa os comandos seguintes, um de cada vez, para dar a você mais tempo para inspecionar o resultado após cada etapa.</p> </td> </tr> </tbody> </table> <a id="menu-11"></a> <h2>Coisas importantes a serem observadas ao usar outros formatos na visualização de código-fonte</h2> <p><strong>Selenium IDE funciona bem apenas com HTML - outros formatos ainda estão em modo experimental</strong> . <strong>NÃO</strong> é <strong>aconselhável</strong> criar ou editar testes usando outros formatos na visualização do código-fonte porque ainda há muito trabalho necessário para torná-lo estável. Abaixo estão os bugs conhecidos da versão 1.9.1.</p> <ul> <li>Você não será capaz de executar a reprodução nem voltar para a visualização em tabela, a menos que reverta para o HTML.</li> <li>A única maneira de adicionar comandos com segurança no código-fonte é gravando-os.</li> <li>Quando você modifica o código-fonte manualmente, tudo é perdido quando você muda para outro formato.</li> <li>Embora você possa salvar seu caso de teste na Visualização de código-fonte, o Selenium IDE não será capaz de abri-lo.</li> </ul> <p><strong>A maneira recomendada de converter os testes Selenese é usar a opção "Export Test Case As ..." no menu File, e não por meio da Source View.</strong></p> <a id="menu-12"></a> <h2>Resumo</h2> <ul> <li>Os scripts de teste podem ser criados gravando ou digitando os comandos e parâmetros manualmente.</li> <li>Ao criar scripts manualmente, o Firebug é usado para obter o localizador.</li> <li>O botão Localizar é usado para verificar se o comando é capaz de acessar o elemento correto.</li> <li>A Visualização de tabela exibe um script de teste em formato tabular enquanto a Visualização de código-fonte o exibe em formato HTML.</li> <li>Alterar a visualização do código-fonte para um formato não HTML ainda é experimental.</li> <li>Não use a Visualização do código-fonte na criação de testes em outros formatos. Em vez disso, use os recursos de exportação.</li> <li>Os parâmetros não são obrigatórios o tempo todo. Depende do comando.</li> <li>Existem três tipos de comandos:</li> <ul> <li>Ações - interage diretamente com os elementos da página</li> <li>Acessores - "lê" uma propriedade de elemento e a armazena em uma variável</li> <li>Assertions - compara um valor real com um esperado</li> </ul> <li>As afirmações têm três tipos:</li> <ul> <li>Assert - em caso de falha, as etapas seguintes não são mais executadas</li> <li>Verificar - em caso de falha, as etapas seguintes ainda são executadas.</li> <li>WaitFor - passa se a condição especificada se tornar verdadeira dentro do período de tempo limite; caso contrário, irá falhar</li> </ul> <li>Os comandos mais comuns são:</li> <ul> <li>abrir</li> <li>click / clickAndWait</li> <li>type / typeKeys</li> <li>verifyTitle / assertTitle</li> <li>verifyTextPresent</li> <li>verifyElementPresent</li> <li>verifyTable</li> <li>waitForPageToLoad</li> <li>waitForElementPresent</li> </ul> </ul> </div> </article> </div> </div> </div> </div> </div> <aside class="col-lg-4 sidebar sidebar--right"> <div class="widget widget-popular-posts"> <h2 class="widget-title">Publicações Populares</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003298-005-adding-slight-dimensionality" title="# 005: Adicionando leve dimensionalidade - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/3230672/005_adding_slight_dimensionality_css-tricks.png.webp" loading="lazy" alt="# 005: Adicionando leve dimensionalidade - CSS-Tricks" title="# 005: Adicionando leve dimensionalidade - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003298-005-adding-slight-dimensionality" title="# 005: Adicionando leve dimensionalidade - CSS-Tricks" rel="bookmark"># 005: Adicionando leve dimensionalidade - CSS-Tricks 2025</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003299-006-photoshopping-the-main-navigation" title="# 006: Photoshopping a navegação principal - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/2530897/006_photoshopping_the_main_navigation_css-tricks.png.webp" loading="lazy" alt="# 006: Photoshopping a navegação principal - CSS-Tricks" title="# 006: Photoshopping a navegação principal - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003299-006-photoshopping-the-main-navigation" title="# 006: Photoshopping a navegação principal - CSS-Tricks" rel="bookmark"># 006: Photoshopping a navegação principal - CSS-Tricks 2025</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003301-009-setting-up-our-local-dev-environment" title="# 009: Configurando nosso ambiente de desenvolvimento local - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/2896628/009_setting_up_our_local_dev_environment_css-tricks.png.webp" loading="lazy" alt="# 009: Configurando nosso ambiente de desenvolvimento local - CSS-Tricks" title="# 009: Configurando nosso ambiente de desenvolvimento local - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003301-009-setting-up-our-local-dev-environment" title="# 009: Configurando nosso ambiente de desenvolvimento local - CSS-Tricks" rel="bookmark"># 009: Configurando nosso ambiente de desenvolvimento local - CSS-Tricks 2025</a></h3> </div> </div> </li> </ul> </div> <div class="widget widget-popular-posts"> <h2 class="widget-title">Melhores comentários para o mês</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226002-type-of-network-topology-bus-ring-star-mesh-tree-p2p-hybrid" title="Tipo de topologia de rede: Barramento, Anel, Estrela, Malha, Árvore, P2P, Híbrido" rel="bookmark">Tipo de topologia de rede: Barramento, Anel, Estrela, Malha, Árvore, P2P, Híbrido</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226003-address-resolution-protocol-arp" title="Protocolo de resolução de endereço (ARP)" rel="bookmark">Protocolo de resolução de endereço (ARP)</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226004-difference-between-mac-address-and-ip-address" title="Diferença entre endereço MAC e endereço IP" rel="bookmark">Diferença entre endereço MAC e endereço IP</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226005-hamming-code-error-correction-examples" title="Código de Hamming: Exemplos de correção de erros" rel="bookmark">Código de Hamming: Exemplos de correção de erros</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226006-how-to-find-and-change-mac-address-in-mac-os" title="Como encontrar & Alterar endereço MAC no Mac OS" rel="bookmark">Como encontrar & Alterar endereço MAC no Mac OS</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226007-internet-vs-intranet-key-differences" title="Internet vs Intranet: Principais diferenças" rel="bookmark">Internet vs Intranet: Principais diferenças</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226008-lan-vs-wan-whats-the-difference" title="LAN vs WAN: Qual é a diferença?" rel="bookmark">LAN vs WAN: Qual é a diferença?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226010-tcpip-vs-osi-model-whats-the-difference" title="Modelo TCP / IP vs OSI: Qual é a diferença?" rel="bookmark">Modelo TCP / IP vs OSI: Qual é a diferença?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226011-tcp-vs-udp-whats-the-difference" title="TCP vs UDP: Qual é a diferença?" rel="bookmark">TCP vs UDP: Qual é a diferença?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226012-ipv4-vs-ipv6-whats-the-difference" title="IPv4 vs IPv6: Qual é a diferença?" rel="bookmark">IPv4 vs IPv6: Qual é a diferença?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226013-what-is-a-mac-address-full-form-how-to-find-it-on-windows" title="O que é um endereço MAC? Formulário completo, como encontrá-lo no Windows" rel="bookmark">O que é um endereço MAC? Formulário completo, como encontrá-lo no Windows</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226014-http-vs-https-what-is-difference-between-http-and-https" title="HTTP vs HTTPS: Qual é a diferença entre HTTP e HTTPS?" rel="bookmark">HTTP vs HTTPS: Qual é a diferença entre HTTP e HTTPS?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226015-put-vs-post-whats-the-difference" title="PUT vs POST: Qual é a diferença?" rel="bookmark">PUT vs POST: Qual é a diferença?</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226016-what-is-network-security-key-how-to-find-on-router-windows" title="O que é a chave de segurança da rede? Como Encontrar no Roteador, Windows" rel="bookmark">O que é a chave de segurança da rede? Como Encontrar no Roteador, Windows</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8226017-difference-between-synchronous-and-asynchronous-transmission" title="Diferença entre transmissão síncrona e assíncrona" rel="bookmark">Diferença entre transmissão síncrona e assíncrona</a></h3> </div> </div> </li> </ul> </div> <div class="widget widget-popular-posts"> <h2 class="widget-title">Principais Artigos</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003129-focus-visible" title=": foco visível - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/5683416/_focus-visible_css-tricks.png.webp" loading="lazy" alt=": foco visível - CSS-Tricks" title=": foco visível - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003129-focus-visible" title=": foco visível - CSS-Tricks" rel="bookmark">: foco visível - CSS-Tricks 2025</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003132-nth-last-of-type" title=": enésimo último do tipo - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/5845775/_nth-last-of-type_css-tricks.png.webp" loading="lazy" alt=": enésimo último do tipo - CSS-Tricks" title=": enésimo último do tipo - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003132-nth-last-of-type" title=": enésimo último do tipo - CSS-Tricks" rel="bookmark">: enésimo último do tipo - CSS-Tricks 2025</a></h3> </div> </div> </li><li class="post-list-small__item"> <div class="post-list-small__entry clearfix"> <div class="post-list-small__img-holder"> <div class="thumb-container thumb-100"><a href="/8003133-nth-child" title=": enésima criança - CSS-Tricks" rel="bookmark"><img src="https://cdn.css-code.org/3031889/_nth-child_css-tricks.png.webp" loading="lazy" alt=": enésima criança - CSS-Tricks" title=": enésima criança - CSS-Tricks" class="post-list-small__img--rounded" style="width:88px;height:88px" /></a></div> </div> <div class="post-list-small__body"> <h3 class="post-list-small__entry-title"><a href="/8003133-nth-child" title=": enésima criança - CSS-Tricks" rel="bookmark">: enésima criança - CSS-Tricks 2025</a></h3> </div> </div> </li> </ul> </div> </aside> </div> </div> <footer class="footer footer--dark"> <div class="container"> <div class="footer__widgets"> <div class="row"> <div class="col-lg-4"> <div class="widget"> <h2 class="widget-title">Publicações Populares</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8224743-jsp-standard-action-tags-include-usebean-forward-param" title="Tags de ação padrão JSP: include, useBean, forward, param" rel="bookmark">Tags de ação padrão JSP: include, useBean, forward, param</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8224744-jsp-expression-language-el-tutorial" title="Tutorial de linguagem de expressão JSP (EL)" rel="bookmark">Tutorial de linguagem de expressão JSP (EL)</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8224745-15-best-java-programming-books-for-beginner-2021-update" title="15 melhores livros de programação Java para iniciantes (atualização de 2021)" rel="bookmark">15 melhores livros de programação Java para iniciantes (atualização de 2021)</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8224746-try-catch-exception-handling-in-jsp" title="Try Catch: Exception Handling in JSP" rel="bookmark">Try Catch: Exception Handling in JSP</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8224747-mvc-architecture-in-jsp-with-example" title="Arquitetura MVC em JSP com Exemplo" rel="bookmark">Arquitetura MVC em JSP com Exemplo</a></h3> </div> </div> </li> </ul> </div> </div> <div class="col-lg-4"> <div class="widget"> <h2 class="widget-title">Escolha Do Editor</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8004210-162-what-the-heck-is-serverless" title="Nº 162: O que diabos é sem servidor? - CSS-Tricks" rel="bookmark">Nº 162: O que diabos é sem servidor? - CSS-Tricks</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8004211-166-learn-to-integrate-visual-testing-with-percy" title="# 166: Aprenda a integrar testes visuais com Percy - CSS-Tricks" rel="bookmark"># 166: Aprenda a integrar testes visuais com Percy - CSS-Tricks</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8004212-16-creating-the-photoshop-mockup" title="# 16: Criando o Photoshop Mockup - CSS-Tricks" rel="bookmark"># 16: Criando o Photoshop Mockup - CSS-Tricks</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8004213-165-building-your-backend-with-serverless-functions" title="# 165: Criando seu back-end com funções sem servidor - CSS-Tricks" rel="bookmark"># 165: Criando seu back-end com funções sem servidor - CSS-Tricks</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8004214-171-movable-stacked-card-row-in-css" title="# 171: Linha de cartão empilhado móvel em CSS - CSS-Tricks" rel="bookmark"># 171: Linha de cartão empilhado móvel em CSS - CSS-Tricks</a></h3> </div> </div> </li> </ul> </div> </div> <div class="col-lg-4"> <div class="widget"> <h2 class="widget-title">Principais Artigos</h2> <ul class="post-list-small"> <li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8225013-node-js-npm-tutorial-create-publish-extend-and-manage" title="Node.js NPM Tutorial: Criar, publicar, estender & Gerenciar" rel="bookmark">Node.js NPM Tutorial: Criar, publicar, estender & Gerenciar</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8225015-node-js-promise-tutorial" title="Node.js Promise Tutorial" rel="bookmark">Node.js Promise Tutorial</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8225016-bluebird-promises-tutorial" title="Tutorial Bluebird Promises" rel="bookmark">Tutorial Bluebird Promises</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8225017-node-js-express-framework-tutorial-learn-in-10-minutes" title="Tutorial Node.js Express FrameWork - Aprenda em 10 minutos" rel="bookmark">Tutorial Node.js Express FrameWork - Aprenda em 10 minutos</a></h3> </div> </div> </li><li class="post-list-small__item"> <div> <div> <h3 class="post-list-small__entry-title"><a href="/8225019-node-js-generators-and-compare-with-callbacks" title="Node.js Generators & Compare com chamadas de retorno" rel="bookmark">Node.js Generators & Compare com chamadas de retorno</a></h3> </div> </div> </li> </ul> </div> </div> </div> <p>© Copyright pt.css-code.org, 2025 Outubro | <a href="https://pt.css-code.org/about-site" title="Sobre o site">Sobre o site</a> | <a href="https://pt.css-code.org/contacts" title="Contatos">Contatos</a> | <a href="https://pt.css-code.org/privacy-policy" title="Política de Privacidade">Política de Privacidade</a>. </p> </div> </div> </footer> <link href="https://css-code.org/template/css/style.min.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" /> </body> </html>