Como usar fill_in com find in Capybara (se possível)

90

Eu gostaria de fazer o seguinte, mas não posso devido à natureza de fill_in esperar um localizador como o primeiro argumento.

find(:css, "input[id$='donation_pledge_hundreds']").fill_in :with => "10"

Eu também tentei fazer

element = find(:css, "input[id$='donation_pledge_hundreds']")   
fill_in element.<method> , :with => "10"

mas não há métodos que retornem quaisquer dados para identificar o elemento para fill_in.

Alguma ideia da melhor maneira de encontrar um campo por meio de um regex para usar com fill_in?

formigas
fonte

Respostas:

160

Indo de memória pode não ser 100% correto, mas acho que se você tiver uma referência ao próprio elemento, você usaria em setvez de fill_in:

find(:css, "input[id$='donation_pledge_hundreds']").set("10")

No entanto, para seu exemplo específico, fill_indeve ser capaz de encontrar o elemento como você conhece seu ID:

fill_in 'donation_pledge_hundreds', with: "10"
Jon M
fonte
Bom homem, é esse mesmo. Esse campo específico é usado em contextos diferentes (autenticado / não autenticado) e, portanto, leva um ID de campo diferente. donation_pledge_hundreds é a parte comum do ID do campo, portanto, comparando o final do nome do campo $ =
formigas
8
Tenha cuidado ao usar 'set' em vez de outros métodos embutidos, pois ele não dispara eventos após alterar o valor.
Dan Caddigan
@DanCaddigan e é por isso que parece f3ck3d up: / como você faz então?
Ben
Você pode usar find(:css, "...").set("10").send_keys(:return)para pressionar voltar depois. Ele aciona os eventos relevantes. Eu não testei, mas você também pode, find(:css, "...").set("10").trigger(:blur)se for o seu lugar.
gondalez
5

Em vez de um método, você pode usar colchetes para retornar :nameou :id, por exemplo, element = find(:css, "input[id$='donation_pledge_hundreds']") fill_in element[:name], :with => "10" A mesma abordagem pode ser usada com select- select my_type, from: find('select[name$="[type]"]')[:name]

bhfailor
fonte
3
find("input[id$='donation_pledge_hundreds']").set "10"

É importante notar que você pode encadear seus achados.

@modal = find(".modal")
@modal.find('input[name=foo]').set "bar"
Nate
fonte
2
element = find(:css, "input[id$='donation_pledge_hundreds']")   
element.fill_in with: "10"
aki
fonte
Respostas apenas em código são desencorajadas. Adicione alguma explicação sobre como isso resolve o problema ou como isso difere das respostas existentes. Da avaliação
Nick
0
fill_in <$id>, :with => 'text you want to fill in'
Chints Vadgama
fonte