web-dev-qa-db-fra.com

Comment obtenir le code HTML dans un élément utilisant Capybara?

J'écris un test de concombre pour lequel je souhaite obtenir le code HTML d'un élément.

Par exemple:

within 'table' do
  # this works
  find('//tr[2]//td[7]').text.should == "these are the comments" 

  # I want something like this (there is no "html" method)
  find('//tr[2]//td[7]').html.should == "these are the <b>comments</b>" 
end

Quelqu'un sait-il comment faire ça?

63
Jon Kruger

Vous pouvez appeler HTML DOM innerHTML Property:

find('//tr[2]//td[7]')['innerHTML']

Devrait fonctionner pour n'importe quel navigateur ou pilote .. Vous pouvez vérifier toutes les propriétés disponibles sur w3schools

46
llighterr

Cet article est vieux, mais je pense avoir trouvé un moyen de continuer si vous en avez toujours besoin.

Pour accéder au nœud Nokogiri à partir de l'élément Capybara (avec Capybara 1.0.0beta1, Nokogiri 1.4.4), essayez ceci:

elem = find('//tr[2]//td[10]')
node = elem.native
#This will give you a Nokogiri XML element

node.children[1].attributes["href"].value.should == "these are the <b>comments</b>"

La dernière partie peut varier pour vous, mais vous devriez pouvoir trouver le code HTML quelque part dans cette variable de noeud.

23
Eric Hu

Dans mon environnement, find retourne un Capybara :: Element - qui répond à la méthode: native comme le mentionne Eric Hu ci-dessus, qui renvoie un Selenium :: WebDriver :: Element (pour moi). Ensuite: text obtient le contenu, ce qui pourrait être aussi simple que:

results = find(:xpath, "//td[@id='#{cell_id}']")
contents = results.native.text

si vous recherchez le contenu d'une cellule de tableau. Il n'y a pas de méthodes content, inner_html, inner_text ou node sur un Capybara :: Element. En supposant que les gens ne fassent pas que inventer des choses, vous obtiendrez peut-être quelque chose de différent en fonction de ce que vous avez chargé avec Capybara.

16
Steve

On dirait que vous pouvez faire (node).native.inner_html pour obtenir le contenu HTML, par exemple avec HTML comme ceci:

<div><strong>Some</strong> HTML</div>

Vous pouvez faire ce qui suit:

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
6
Tobias Cohen

J'ai rencontré le même problème que Cyril Duchon-Doris, et par https://github.com/teampoltergeist/poltergeist/issues/629 le moyen d'accéder au HTML d'un Capybara :: Poltergeist :: Node est via la propriété outerHTML, par exemple:

find('//tr[2]//td[7]')['outerHTML']
5
Geoff The

La plupart des autres réponses ne fonctionnent que dans Racktest (car elles utilisent des fonctionnalités spécifiques à Racktest).

Si votre pilote prend en charge l'évaluation javascript (telle que Selenium), vous pouvez utiliser innerHTML:

html = page.evaluate_script("document.getElementById('my_id').innerHTML")
4
Andrei Botalov

essayez d'appeler find('//tr[2]//td[10]').node dessus pour obtenir l'objet nokogiri actuel

1
Justin Halsall

Vous pouvez également passer à capybara-ui et procéder comme suit:

# define your widget, in this case in your role
class User < Capybara::UI::Role
  widget :seventh_cell, [:xpath, '//tr[2]//td[7]']
end

# then in your tests
role = User.new

expect(role.widget(:seventh_cell).html).to eq(<h1>My html</h1>)
0
steel

Eh bien, Capybara utilise Nokogiri pour analyser, cette page pourrait donc être appropriée:

http://nokogiri.org/Nokogiri/XML/Node.html

Je crois que content est la méthode que vous recherchez.

0
Steve Ross

Si vous utilisez le pilote Poltergeist, ces méthodes vous permettront de vérifier quelles correspondances:

http://www.rubydoc.info/gems/poltergeist/1.5.1/Capybara/Poltergeist/Node

Par exemple:

page.find('[name="form-field"]').native.value == 'something'
0
Rimian