Как да получа 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 Property:

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

ако търсите съдържанието на клетка от таблица. Няма методи за съдържание, inner_html, inner_text или възли на Capybara::Element. Ако приемем, че хората не просто си измислят нещата, може би ще получите нещо различно от 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