Estou trabalhando com muitos plug-ins jQuery, que geralmente criam elementos DOM sem id ou outras propriedades de identificação, e a única maneira de obtê-los na Capivara (por exemplo, clicando) - é obter seu vizinho (outro filho de seu ancestral) primeiro . Mas eu não encontrei em nenhum lugar, Capivara suporta tais coisas, por exemplo:
find('#some_button').parent.fill_in "Name:", :with => name
?
Respostas:
Eu realmente achei a resposta de Jamuraa útil, mas ir para o xpath completo me deu um pesadelo de uma string no meu caso, então eu felizmente usei a habilidade de concatenar find's em Capybara, me permitindo misturar seleção de css e xpath. Seu exemplo ficaria assim:
find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
Atualização do Capybara 2.0 :
find(:xpath,".//..")
provavelmente resultará em umAmbiguous match
erro. Nesse caso, usefirst(:xpath,".//..")
.fonte
.//..
encontrar o pai -..
basta, e isso também nunca é ambíguo.Não há como fazer isso com capivara e CSS. Eu usei XPath no passado para atingir esse objetivo, que tem uma maneira de obter o elemento pai e é compatível com Capivara:
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
fonte
find(:xpath, '//*[@id="some_button"]/..')
Eu descobri o seguinte que funciona:
find(:xpath, '..')
Capivara foi atualizado para suportar isso.
https://github.com/jnicklas/capybara/pull/505
fonte
Se você se deparou com isso tentando descobrir como encontrar qualquer nó pai (como no ancestral ) (como sugerido no comentário de @ vrish88 na resposta de @Pascal Lindelauf):
find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
fonte
Esta resposta refere-se a como manipular um elemento irmão, ao qual acredito que a pergunta original está se referindo
Sua hipótese de pergunta funciona com um pequeno ajuste. Se o campo gerado dinamicamente se parecer com este e não tiver um id:
<div> <input></input> <button>Test</button> </div>
Sua consulta seria:
find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')
Se a entrada gerada dinamicamente vier anexada com um elemento id (tenha cuidado com eles, embora como no angular, eles costumam mudar com base na adição e exclusão de elementos), seria algo assim:
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')
Espero que ajude.
fonte
Estou usando uma abordagem diferente, encontrando primeiro o elemento pai usando o texto dentro deste elemento pai:
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
Talvez isso seja útil em uma situação semelhante.
fonte
Eu precisava encontrar um ancestral com uma classe css, embora fosse indeterminado se o ancestral de destino tinha uma ou mais classes css presentes, então não vi uma maneira de fazer uma consulta xpath determinística. Em vez disso, trabalhei nisso:
def find_ancestor_with_class(field, cssClass) ancestor = field loop do ancestor = ancestor.find(:xpath, '..') break if ancestor.nil? break if ancestor.has_css? cssClass end ancestor end
Aviso: use com moderação, pois pode custar muito tempo nos testes, então certifique-se de que o ancestral está a apenas alguns saltos de distância.
fonte
break if ancestor[:class].split(" ").include?(css_class)
.ancestor(selector)
método integrado. Veja github.com/teamcapybara/capybara/commit/…Aqui está
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Existe um método pai presente;)
fonte