Working with the response DOM

Hi,

Anyone know a way to traverse/query the DOM in a response?

I’m trying to write reusable story step implementations and as much as
possible want to work with the actual response from a previous GET.

As an example, I often have buttons that POST/PUT a hidden value.
My goal is a reusable step implementation that takes the button label
and
works the existing response DOM to make an appropriate POST/PUT.

  • Andy


View this message in context:
http://www.nabble.com/Working-with-the-response-DOM-tf4681975.html#a13378946
Sent from the rspec-users mailing list archive at Nabble.com.

I completely forgot about Hpricot
http://code.whytheluckystiff.net/hpricot/

Looks perfect for this.

  • Andy

Andy W. wrote:

works the existing response DOM to make an appropriate POST/PUT.

  • Andy


View this message in context:
http://www.nabble.com/Working-with-the-response-DOM-tf4681975.html#a13378962
Sent from the rspec-users mailing list archive at Nabble.com.

I’ve been wondering the same for quite a while
http://www.nabble.com/simple-story,-extract-link-t4518721.html
but hadnt asked the question so succinctly

In that thread, Pat suggests helpers like click_link and submit_form
If you progress along these lines, please post your solution, I’m
very interested.

linoj

I’m playing with step implementations that use hpricot to manipulate
response.body.
Here’s what I have so far.
Very much work-in-progress, but may be of some use to you.

#This step implementation takes a button’s label, collects the inputs
and
does the POST/PUT
add.when(“I click the $button_text button”) do |button_text|
h = Hpricot(response.body)
form = h.search(“form[button][text()=#{button_text}]”).first
action = form[:action]
method = form[:method]
headers = {‘HTTP_REFERER’ => request.env[‘REQUEST_URI’]}
params = {}
form.search(‘input’).each{|i| params[i[:name]] = i[:value] }
send(method, action, params, headers)
end

#This step implementation takes an input field & value, and updates the
response.body
add.when(“I set the $input_field to $value”) do |input_field,value|
input_field.each{|s| s = s.sub!(/^‘(.*?)’$/,‘\1’) } # strip the
quotes if
used in the input field
input_field.gsub!(’ ', ‘_’) # join to get
an id
to search for…not robust enough?
h = Hpricot(response.body) # get body in
Hpricot
field_element = h.search(“input##{input_field}”).first # find the
input
field
field_element[:value] = value # update the
field’s value
response.body = h.to_html # put the
modified
body back in the response
end

  • Andy

Jonathan L. wrote:

possible want to work with the actual response from a previous GET.

rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users


View this message in context:
http://www.nabble.com/Working-with-the-response-DOM-tf4681975.html#a13400114
Sent from the rspec-users mailing list archive at Nabble.com.