teampoltergeist / poltergeist

A PhantomJS driver for Capybara
MIT License
2.5k stars 415 forks source link

Better error message? #179

Closed mperham closed 11 years ago

mperham commented 12 years ago
  1) basket integration handles item removal and empty state
     Failure/Error: click_button 'login_submit'
     Capybara::Poltergeist::ObsoleteNode:
       Capybara::Poltergeist::ObsoleteNode
     # (eval):2:in `click_button'
     # ./spec/requests/basket_exercise_spec.rb:167:in `login'
     # ./spec/requests/basket_exercise_spec.rb:28:in `block (2 levels) in <top (required)>'

As someone new to Poltergeist, I have no idea what this means or how to debug it. An error message giving me some context would be useful. Note I'm trying to port from capybara-webkit and the test works fine there.

jonleighton commented 12 years ago

Hmm, that error shouldn't be bubbling right up. It should be caught by Capybara. Can you provide the full (rspec -b) backtrace please?

mperham commented 12 years ago
     Capybara::Poltergeist::ObsoleteNode:
       Capybara::Poltergeist::ObsoleteNode
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:21:in `rescue in command'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:17:in `command'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:88:in `click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/element.rb:99:in `block in click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/base.rb:46:in `wait_until'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/element.rb:99:in `click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/actions.rb:38:in `click_button'
     # (eval):2:in `click_button'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/dsl.rb:161:in `click_button'
mperham commented 12 years ago

The underlying problem was that I was filling in a form that wasn't visible. c-w didn't care.

jonleighton commented 12 years ago

Right. If the form is not visible it should not be possible to fill it in - a user wouldn't be able to fill it in either. But this error message should be better. Did capybara time out while waiting for the form to become visible? (which never happened, obviously...)

mperham commented 12 years ago

Doubtful, I have animations disabled.

On 17 Oct 2012, at 14:08, Jon Leighton notifications@github.com wrote:

Right. If the form is not visible it should not be possible to fill it in - a user wouldn't be able to fill it in either. But this error message should be better. Did capybara time out while waiting for the form to become visible? (which never happened, obviously...)

— Reply to this email directly or view it on GitHub.

jonleighton commented 12 years ago

Could you post the debug output from Poltergeist please? (Configure poltergeist with the :debug option, see the readme)

mperham commented 12 years ago
1 (poltergeist=09910 spec/) ~/src/clymb> rspec -b spec/requests/basket_exercise_spec.rb:54

Run options: include {:locations=>{"./spec/requests/basket_exercise_spec.rb"=>[54]}}
{"name"=>"resize", "args"=>[1100, 700]}
{"response"=>true}
{"name"=>"visit", "args"=>["http://127.0.0.1:54545/preview"]}
{"response"=>{"status"=>"success"}}
{"name"=>"find", "args"=>[".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')][((./@id = 'user_session_email' or ./@name = 'user_session_email') or ./@id = //label[normalize-space(string(.)) = 'user_session_email']/@for)] | .//label[normalize-space(string(.)) = 'user_session_email']//.//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]"]}
{"response"=>{"page_id"=>1, "ids"=>[0]}}
{"name"=>"visible", "args"=>[1, 0]}
{"response"=>false}
{"name"=>"find", "args"=>[".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')][((./@id = 'user_session_email' or ./@name = 'user_session_email') or ./@id = //label[contains(normalize-space(string(.)), 'user_session_email')]/@for)] | .//label[contains(normalize-space(string(.)), 'user_session_email')]//.//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]"]}
{"response"=>{"page_id"=>1, "ids"=>[1]}}
{"name"=>"visible", "args"=>[1, 1]}
{"response"=>false}
{"name"=>"tag_name", "args"=>[1, 0]}
{"response"=>"INPUT"}
{"name"=>"attribute", "args"=>[1, 0, "type"]}
{"response"=>"email"}
{"name"=>"set", "args"=>[1, 0, "dude1@secret.com"]}
{"response"=>true}
{"name"=>"find", "args"=>[".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')][((./@id = 'user_session_password' or ./@name = 'user_session_password') or ./@id = //label[normalize-space(string(.)) = 'user_session_password']/@for)] | .//label[normalize-space(string(.)) = 'user_session_password']//.//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]"]}
{"response"=>{"page_id"=>1, "ids"=>[2]}}
{"name"=>"visible", "args"=>[1, 2]}
{"response"=>false}
{"name"=>"find", "args"=>[".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')][((./@id = 'user_session_password' or ./@name = 'user_session_password') or ./@id = //label[contains(normalize-space(string(.)), 'user_session_password')]/@for)] | .//label[contains(normalize-space(string(.)), 'user_session_password')]//.//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]"]}
{"response"=>{"page_id"=>1, "ids"=>[3]}}
{"name"=>"visible", "args"=>[1, 3]}
{"response"=>false}
{"name"=>"tag_name", "args"=>[1, 2]}
{"response"=>"INPUT"}
{"name"=>"attribute", "args"=>[1, 2, "type"]}
{"response"=>"password"}
{"name"=>"set", "args"=>[1, 2, "password"]}
{"response"=>true}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[4]}}
{"name"=>"visible", "args"=>[1, 4]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[5]}}
{"name"=>"visible", "args"=>[1, 5]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 4]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[6]}}
{"name"=>"visible", "args"=>[1, 6]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[7]}}
{"name"=>"visible", "args"=>[1, 7]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 6]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[8]}}
{"name"=>"visible", "args"=>[1, 8]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[9]}}
{"name"=>"visible", "args"=>[1, 9]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 8]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[10]}}
{"name"=>"visible", "args"=>[1, 10]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[11]}}
{"name"=>"visible", "args"=>[1, 11]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 10]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[12]}}
{"name"=>"visible", "args"=>[1, 12]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[13]}}
{"name"=>"visible", "args"=>[1, 13]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 12]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[14]}}
{"name"=>"visible", "args"=>[1, 14]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[15]}}
{"name"=>"visible", "args"=>[1, 15]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 14]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[16]}}
{"name"=>"visible", "args"=>[1, 16]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[17]}}
{"name"=>"visible", "args"=>[1, 17]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 16]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[18]}}
{"name"=>"visible", "args"=>[1, 18]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[19]}}
{"name"=>"visible", "args"=>[1, 19]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 18]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[20]}}
{"name"=>"visible", "args"=>[1, 20]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[21]}}
{"name"=>"visible", "args"=>[1, 21]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 20]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[22]}}
{"name"=>"visible", "args"=>[1, 22]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[23]}}
{"name"=>"visible", "args"=>[1, 23]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 22]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[24]}}
{"name"=>"visible", "args"=>[1, 24]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[25]}}
{"name"=>"visible", "args"=>[1, 25]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 24]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[26]}}
{"name"=>"visible", "args"=>[1, 26]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[27]}}
{"name"=>"visible", "args"=>[1, 27]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 26]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[28]}}
{"name"=>"visible", "args"=>[1, 28]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[29]}}
{"name"=>"visible", "args"=>[1, 29]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 28]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[30]}}
{"name"=>"visible", "args"=>[1, 30]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[31]}}
{"name"=>"visible", "args"=>[1, 31]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 30]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[32]}}
{"name"=>"visible", "args"=>[1, 32]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[33]}}
{"name"=>"visible", "args"=>[1, 33]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 32]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[34]}}
{"name"=>"visible", "args"=>[1, 34]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[35]}}
{"name"=>"visible", "args"=>[1, 35]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 34]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[36]}}
{"name"=>"visible", "args"=>[1, 36]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[37]}}
{"name"=>"visible", "args"=>[1, 37]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 36]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[38]}}
{"name"=>"visible", "args"=>[1, 38]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[39]}}
{"name"=>"visible", "args"=>[1, 39]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 38]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[40]}}
{"name"=>"visible", "args"=>[1, 40]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[41]}}
{"name"=>"visible", "args"=>[1, 41]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 40]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[42]}}
{"name"=>"visible", "args"=>[1, 42]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[43]}}
{"name"=>"visible", "args"=>[1, 43]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 42]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[44]}}
{"name"=>"visible", "args"=>[1, 44]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[45]}}
{"name"=>"visible", "args"=>[1, 45]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 44]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[46]}}
{"name"=>"visible", "args"=>[1, 46]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[47]}}
{"name"=>"visible", "args"=>[1, 47]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 46]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[48]}}
{"name"=>"visible", "args"=>[1, 48]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[49]}}
{"name"=>"visible", "args"=>[1, 49]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 48]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[50]}}
{"name"=>"visible", "args"=>[1, 50]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[51]}}
{"name"=>"visible", "args"=>[1, 51]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 50]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[52]}}
{"name"=>"visible", "args"=>[1, 52]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[53]}}
{"name"=>"visible", "args"=>[1, 53]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 52]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[54]}}
{"name"=>"visible", "args"=>[1, 54]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[55]}}
{"name"=>"visible", "args"=>[1, 55]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 54]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[56]}}
{"name"=>"visible", "args"=>[1, 56]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[57]}}
{"name"=>"visible", "args"=>[1, 57]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 56]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[58]}}
{"name"=>"visible", "args"=>[1, 58]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[59]}}
{"name"=>"visible", "args"=>[1, 59]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 58]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[60]}}
{"name"=>"visible", "args"=>[1, 60]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[61]}}
{"name"=>"visible", "args"=>[1, 61]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 60]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[62]}}
{"name"=>"visible", "args"=>[1, 62]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[63]}}
{"name"=>"visible", "args"=>[1, 63]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 62]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[64]}}
{"name"=>"visible", "args"=>[1, 64]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[65]}}
{"name"=>"visible", "args"=>[1, 65]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 64]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[66]}}
{"name"=>"visible", "args"=>[1, 66]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[67]}}
{"name"=>"visible", "args"=>[1, 67]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 66]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[68]}}
{"name"=>"visible", "args"=>[1, 68]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[69]}}
{"name"=>"visible", "args"=>[1, 69]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 68]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[70]}}
{"name"=>"visible", "args"=>[1, 70]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[71]}}
{"name"=>"visible", "args"=>[1, 71]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 70]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[72]}}
{"name"=>"visible", "args"=>[1, 72]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[73]}}
{"name"=>"visible", "args"=>[1, 73]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 72]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or ./@value = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit'] | .//button[(((./@id = 'login_submit' or ./@value = 'login_submit') or normalize-space(string(.)) = 'login_submit') or ./@title = 'login_submit')] | .//input[./@type = 'image'][./@alt = 'login_submit']"]}
{"response"=>{"page_id"=>1, "ids"=>[74]}}
{"name"=>"visible", "args"=>[1, 74]}
{"response"=>false}
{"name"=>"find", "args"=>[".//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')] | .//button[(((./@id = 'login_submit' or contains(./@value, 'login_submit')) or contains(normalize-space(string(.)), 'login_submit')) or contains(./@title, 'login_submit'))] | .//input[./@type = 'image'][contains(./@alt, 'login_submit')]"]}
{"response"=>{"page_id"=>1, "ids"=>[75]}}
{"name"=>"visible", "args"=>[1, 75]}
{"response"=>false}
{"name"=>"click", "args"=>[1, 74]}
{"error"=>{"name"=>"Poltergeist.ObsoleteNode", "args"=>[]}}
{"name"=>"reset", "args"=>[]}
{"response"=>true}
F
Failures:

  1) basket integration handles basic basket manipulation
     Failure/Error: click_button 'login_submit'
     Capybara::Poltergeist::ObsoleteNode:
       Capybara::Poltergeist::ObsoleteNode
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:21:in `rescue in command'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:17:in `command'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/poltergeist-1.0.1/lib/capybara/poltergeist/node.rb:88:in `click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/element.rb:99:in `block in click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/base.rb:46:in `wait_until'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/element.rb:99:in `click'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/node/actions.rb:38:in `click_button'
     # (eval):2:in `click_button'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/capybara-1.1.2/lib/capybara/dsl.rb:161:in `click_button'
     # ./spec/requests/basket_exercise_spec.rb:170:in `login'
     # ./spec/requests/basket_exercise_spec.rb:57:in `block (2 levels) in <top (required)>'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example.rb:113:in `instance_eval'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example.rb:113:in `block in run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example.rb:253:in `with_around_each_hooks'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example.rb:110:in `run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:378:in `block in run_examples'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:374:in `map'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:374:in `run_examples'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/example_group.rb:360:in `run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:28:in `map'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:28:in `block in run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/reporter.rb:34:in `report'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:25:in `run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
     # /Users/mperham/.rvm/gems/ruby-1.9.3-p125@theclymb3/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `block in autorun'
mperham commented 12 years ago

Current problem: I have a method which increments the quantity for an item in my shopping cart:

  def bump_quantity(index)
    item = page.all("#basket ul.item-list li.cart-item")[index]
    input = item.find("input[type=number]")
    current = input.value
    input.set(current.to_i + 1)
  end

The set returns true but when I examine the page text, it does not reflect the quantity change. I'm firing an AJAX call to update the server based on the change() event. I assume set() will trigger the input's change() handlers in JS?

jonleighton commented 12 years ago

@mperham regarding your click_button issue. we can see that capybara is repeatedly finding the button and trying to click it. each time the click results in an ObsoleteNode error (because the button is not visible) and so capybara tries again. eventually it times out. see here for an explanation of capybara's page polling behaviour if you're not familiar with it.

so the question is: should this button be visible on your page? is poltergeist somehow incorrectly treating it as invisible? as I said before, it should not be possible to interact with invisible elements on a page, but this behaviour does differ from other drivers which don't care whether something is visible.

The error is obviously not very helpful, so I will look into making that better.

jonleighton commented 12 years ago

regarding the issue with set, I've opened #182 for that.

jonleighton commented 11 years ago

Closing this as a dup of #192.