2010-11-01 18 views
57

Estoy escribiendo una prueba de pepino donde quiero obtener el código HTML en un elemento.¿Cómo obtengo el código HTML en un elemento usando Capybara?

Por ejemplo:

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 

Alguien sabe cómo hacer esto?

Respuesta

0

Bueno, capibara utiliza Nokogiri para analizar, por lo que esta página puede ser apropiada:

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

creo content es el método que busca.

+0

No hay ningún método de comentario ... intentado hacer esto: 'find ('// tr [2] // td [10]'). Content' –

+0

¿Puedes publicar tu paso real? Sería útil ver lo que estás haciendo aquí. He hecho page.find (...) y me he referido a la documentación de Nokogiri para analizar la respuesta. Tal vez tuve suerte ... Tenga en cuenta que dije page.find. Creo que Capybara proporciona el objeto de página donde Webrat proporcionó el objeto de respuesta. –

+0

El contenido del paso está en la publicación original. –

1

intente llamar find('//tr[2]//td[10]').node en él para llegar a los reales nokogiri objeto

23

Este post es viejo, pero creo que he encontrado una manera si todavía necesita esto.

Para acceder al nodo Nokogiri del elemento Carpincho (Capibara usando 1.0.0beta1, Nokogiri 1.4.4) intente esto:

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

La última parte puede variar para usted, pero usted debería ser capaz de encontrar el HTML en alguna parte de esa variable de nodo

+2

Tenga en cuenta que esto funciona solo para RackTest –

+0

Usando Selenium, esta respuesta no funcionó para mí, pero [ésta] (http://stackoverflow.com/a/15439366/199712) sí. –

14

En mi entorno, find devuelve un elemento Capybara :: que responde al método nativo como Eric Hu mencionado anteriormente, que devuelve Selenium :: WebDriver :: Element (para mí) . Entonces: el texto se pone el contenido, por lo que podría ser tan simple como:

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

si usted está buscando el contenido de una celda de la tabla. No hay contenido, inner_html, inner_text o métodos de nodo en un Capybara :: Element. Asumiendo que las personas no solo están inventando cosas, quizás obtengas algo diferente de lo que encuentres dependiendo de qué más hayas cargado con Capibara.

4

La mayoría de las otras respuestas solo funcionan en Racktest (ya que usan las características específicas de Racktest).

Si el controlador es compatible con JavaScript evaluación (como el selenio) puede utilizar innerHTML:

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

parece que se puede hacer (node).native.inner_html para obtener el contenido HTML, por ejemplo, con HTML así:

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

que podría hacer lo siguiente:

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

No es para todo el mundo 'método indefinido inner_html for # ' –

31

Puede llamar HTML DOM innerHTML propiedad:

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

debería funcionar para cualquier navegador o conductor. Puede comprobar todas las propiedades disponibles en w3schools

+0

Esto también funciona con selenium chromedriver. – nruth

+6

Funciona con 'poltergeist' también. –

0

También puede cambiar a capybara-ui y hacer lo siguiente:

# 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>) 
2

me encontré con el mismo problema que Cyril Duchon-Doris, y por https://github.com/teampoltergeist/poltergeist/issues/629 la forma de acceder al código HTML de una Carpincho :: :: Poltergeist Nodo es a través de la propiedad outerHTML, por ejemplo:

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