Buscando elementos com precisão usando Capybara

Dicas - 03/Mai/2020 - por André Kanamura

Quando estamos implementando testes de navegação usando Capybara numa aplicação web, podemos utilizar alguns métodos que nos ajudam a localizar elementos específicos do HTML para executar ações sobre eles. Vamos utilizar como exemplo uma aplicação Ruby on Rails e Rspec.

Digamos, por exemplo, que você tenha um formulário de login com um botão "Entrar" e na sua barra de navegação, também exista um outro botão com o mesmo nome.

<div class="nav-bar">
  <a href="..." class="btn">Entrar</a>
</div>

...

<div class="form">
  <a href="..." class="btn">Entrar</a>
</div>

Os testes de login de usuário precisam executar a ação de clicar no botão "Entrar". No entanto, podemos ter problemas já que há dois botões com o mesmo nome. Para resolver essa duplicidade, podemos indicar ao Capybara que busque por um componente específico do HTML:

within 'form' do
  click_on 'Entrar'
end

Neste caso orientamos o Capybara que execute a ação click somente dentro do componente form. Assim, a ação de clique só ocorrerá em elementos que se encontram no formulário. Note que qualquer elemento dentro do form está contemplado pelo whitin. Por isso, o método pode ser utilizado para, por exemplo, preencher um formulário específico dentro de uma página que contenha mais de um formulário com campos iguais, como login de administrador ou usuário.

O whitin é mais interessante quando vamos executar uma série de ações dentro de um escopo. Se vamos fazer uma única ação, existe outra maneira de procurar por um elemento.

Vamos considerar agora a seguinte situação: um formulário em que queremos selecionar um item de uma lista com botões tipo radio.

<input type="radio" id="plano-anual">
<label for="plano-anual">Plano Anual</label><br>
<input type="radio" id="plano-mensal">
<label for="plano-mensal">Plano Mensal</label><br>
<input type="radio" id="plano-teste">
<label for="plano-teste">Experimente grátis 7 dias</label><br>

Podemos utilizar o método Capybara find para encontrar o elemento específico e executar uma ação:

find(:css, '#plano-mensal').click

Neste caso, o código implementado procura pelo elemento com id igual a plano-mensal e clica nele. O find pode ser utilizado em combinação com muitos outros métodos para executar ações:

find('div#address').fill_in('Street', with: 'Alameda Santos')
find(:css, '.start_date').set('2020-01-04')

O whithin e o find aceitam uma série de opções e você pode ler mais sobre eles em suas respectivas documentações.

Foto de perfil do autor
André Kanamura

Dev na Campus Code