Как получить HTML-код в элементе с помощью Capybara?

Im, пишущий тест огурца, где я хочу получить 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

Кто-нибудь знает, как это сделать?

Ответ 1

Вы можете вызвать HTML DOM innerHTML Свойство:

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

Должен работать для любого браузера или драйвера. Вы можете проверить все доступные свойства на w3schools

Ответ 2

Этот пост старый, но я думаю, что нашел способ, если вам это еще нужно.

Чтобы получить доступ к Nokogiri node из элемента Capybara (используя 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 где-нибудь в этой переменной node

Ответ 3

В моей среде find возвращает Capybara:: Element - который отвечает на собственный метод, как упомянутый выше Eric Hu, который возвращает Selenium:: WebDriver:: Element (для меня). Затем: текст получает содержимое, поэтому он может быть таким же простым, как:

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

если вы ищете содержимое ячейки таблицы. В Capybara:: Element нет методов content, inner_html, inner_text или node. Предполагая, что люди не просто подстраиваются, возможно, вы получаете что-то другое от поиска в зависимости от того, что еще вы загрузили с Capybara.

Ответ 4

Похоже, вы можете сделать (node).native.inner_html, чтобы получить HTML-контент, например, с помощью HTML:

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

Вы можете сделать следующее:

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

Ответ 5

Большинство других ответов работают только в Racktest (поскольку они используют специальные функции Racktest).

Если ваш драйвер поддерживает оценку javascript (например, Selenium), вы можете использовать innerHTML:

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

Ответ 6

Я столкнулся с тем же вопросом, что и Кирилл Дюшон-Дорис, и за https://github.com/teampoltergeist/poltergeist/issues/629 способ доступа к HTML файлу Capybara:: Полтергейст:: Node через свойство outerHTML, например:

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

Ответ 7

попробуйте вызвать find('//tr[2]//td[10]').node на нем, чтобы перейти к фактическому объекту nokogiri

Ответ 8

Хорошо, Capybara использует Nokogiri для разбора, поэтому эта страница может быть подходящей:

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

Я считаю, что content - это метод, который вы ищете.

Ответ 10

Вы также можете переключиться на 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>)