Как получить HTML в элементе, используя Capybara? - PullRequest
66 голосов
/ 01 ноября 2010

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

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

Ответы [ 10 ]

53 голосов
/ 18 мая 2014

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

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

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

24 голосов
/ 07 июня 2011

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

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

16 голосов
/ 15 марта 2013

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

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

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

7 голосов
/ 24 сентября 2013

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

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

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

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
5 голосов
/ 03 февраля 2017

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

find('//tr[2]//td[7]')['outerHTML']
4 голосов
/ 17 марта 2013

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

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

html = page.evaluate_script("document.getElementById('my_id').innerHTML")
1 голос
/ 19 ноября 2010

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

0 голосов
/ 22 января 2016

Вы также можете переключиться на 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 голосов
/ 05 ноября 2014

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

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

Например:

page.find('[name="form-field"]').native.value == 'something'
0 голосов
/ 05 ноября 2010

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

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

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

...