web-dev-qa-db-ja.com

Capybaraを使用して要素にHTMLを取得するにはどうすればよいですか?

要素にHTMLを取得するキュウリのテストを書いています。

例えば:

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

誰もこれを行う方法を知っていますか?

66
Jon Kruger

HTML DOM innerHTMLプロパティを呼び出すことができます:

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

すべてのブラウザーまたはドライバーで動作するはずです。 w3schools で利用可能なすべてのプロパティを確認できます

53
llighterr

この投稿は古いですが、まだ必要な場合は方法を見つけたと思います。

Capybara要素からNokogiriノードにアクセスするには(Capybara 1.0.0beta1、Nokogiri 1.4.4を使用)、これを試してください:

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>"

最後の部分は異なる場合がありますが、そのノード変数のどこかでHTMLを見つけることができるはずです

24
Eric Hu

私の環境では、findはCapybara :: Elementを返します。これは、上記のEric Huのように:nativeメソッドに応答し、Selenium :: WebDriver :: Element(私にとって)を返します。次に:textがコンテンツを取得するため、次のように簡単になります。

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

テーブルセルの内容を探している場合。 Capybara :: Elementにはcontent、inner_html、inner_text、またはnodeメソッドはありません。人々が物事を作り上げているだけではないと仮定すると、おそらくあなたはカピバラをロードした他のものに応じて、findとは異なる何かを得るでしょう。

16
Steve

できるように見える(node).native.inner_htmlたとえば、次のようなHTMLを使用して、HTMLコンテンツを取得します。

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

次のことができます。

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

Cyril Duchon-Dorisと同じ問題に遭遇し、 https://github.com/teampoltergeist/poltergeist/issues/629 のHTMLにアクセスする方法Capybara :: Poltergeist :: NodeouterHTMLプロパティ経由です。例:

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

他の回答のほとんどは、Racktestでのみ機能します(Racktest固有の機能を使用するため)。

ドライバーがjavascript評価(Seleniumなど)をサポートしている場合、innerHTMLを使用できます。

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

find('//tr[2]//td[10]').nodeを呼び出して、実際のnokogiriオブジェクトを取得してください

1
Justin Halsall

capybara-ui に切り替えて、次のこともできます。

# 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

さて、CapybaraはNokogiriを使用して解析するため、このページが適切な場合があります。

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

contentがあなたが探している方法だと思います。

0
Steve Ross

Poltergeistドライバーを使用している場合、これらのメソッドを使用すると、一致するものを検査できます。

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

例えば:

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