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

Я пишу тест-огурец, в котором хочу получить 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

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


person Jon Kruger    schedule 01.11.2010    source источник


Ответы (10)


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

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

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

person llighterr    schedule 18.05.2014
comment
Тоже работает с poltergeist. - person Jesse Fisher; 06.05.2016

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

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

person Eric Hu    schedule 07.06.2011
comment
Используя Selenium, этот ответ не сработал для меня, но этот сработал. - person Jason Swett; 27.09.2016

В моей среде find возвращает Capybara :: Element, который отвечает на метод: 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 в зависимости от того, что еще вы загрузили с Capybara.

person Steve    schedule 15.03.2013

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

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

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

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
person Tobias Cohen    schedule 23.09.2013
comment
Не для всех undefined method inner_html for #<Capybara::Poltergeist::Node:0x007ff9aa8c59a0> - person Cyril Duchon-Doris; 23.09.2016

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

find('//tr[2]//td[7]')['outerHTML']
person Geoff The    schedule 03.02.2017

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

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

html = page.evaluate_script("document.getElementById('my_id').innerHTML")
person Andrei Botalov    schedule 17.03.2013

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

person Justin Halsall    schedule 19.11.2010

Если вы используете драйвер Poltergeist, эти методы позволят вам проверить соответствие:

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

Например:

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

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

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

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

person Steve Ross    schedule 05.11.2010
comment
Нет способа комментирования ... пробовал сделать так: find('//tr[2]//td[10]').content - person Jon Kruger; 05.11.2010
comment
Вы можете опубликовать свой реальный шаг? Было бы полезно посмотреть, что вы здесь делаете. Я сделал page.find (...) и обратился к документации Nokogiri, чтобы проанализировать ответ. Может, мне просто повезло ... Заметьте, я сказал page.find. Я думаю, что Capybara предоставляет объект страницы, где Webrat предоставил объект ответа. - person Steve Ross; 05.11.2010
comment
Содержание шага находится в исходном посте. - person Jon Kruger; 12.11.2010
comment
inner_html() должен дать вам все в пределах данного узла. inner_text() должен предоставить вам весь текст внутри узла. - person Steve Ross; 12.11.2010

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