如何从使用Capybara的Cucumber Step获取整个页面的响应HTML?

时间:2013-03-16 13:03:16

标签: ruby-on-rails ruby cucumber bdd

在运行我的规格时,我会发现Capybara无法根据标签等找到元素的错误。然后我想我想要HTML,或以某种方式调试错误。

这是/features/merge.feature

#Just a test!
Scenario: Cannot merge articles when not admin
    Given I am not an admin
    When I am on the edit article page
    Then I should not see the "merge articles" form

这是:/feature/step_definitions/merge.rb - 它只包含“Given”语句!

Given /am not an admin$/ do
  visit '/accounts/login'
  puts "TEZT"
  puts page.native
  puts page.native.text
  fill_in 'user_login', :with => 'editor_rico'
  fill_in 'user_password', :with => 'a'
  click_button 'Login'
end

Given /^I am an admin$/ do
  visit '/accounts/login'
  fill_in 'user_login', :with => 'admin_rico'
  fill_in 'user_password', :with => 'a'
  click_button 'Login'
end

然后我收到这个错误:

Scenario: Cannot merge articles when not admin    
# features/article_merging.feature:20
Given I am not an admin                 
#features/step_definitions/article_steps.rb:39
cannot fill in, no text field, text area or password field with id, name, or label
'user_login' found (Capybara::ElementNotFound)
(eval):2:in `fill_in'
./features/step_definitions/article_steps.rb:44:in `/am not an admin$/'
features/article_merging.feature:21:in `Given I am not an admin'

Havin在这里与Cucumber合作很艰难。

1)为什么我得到上述

2)我如何调试它,我想看看HTML代码!

3 个答案:

答案 0 :(得分:3)

当您的网页HTML不包含名称,ID或标签input的任何textarea'user_login'元素时,会显示此错误。如果您将launchy gem添加到Gemfile中,您将能够看到页面的外观:

Gemfile

group :test do
  gem 'launchy'
  gem 'capybara'
  ...
end

然后,在feature/step_definitions/merge.rb文件中:

Given /^I am not an admin$/ do
  visit '/accounts/login'
  save_and_open_page
end

save_and_open_page会在您的浏览器中打开当前页面,因此您可以检查HTML并查看其外观。

希望它有所帮助! :)

答案 1 :(得分:1)

它认为上述代码的问题是“页面”在您结束该部分之后才可用。

尝试将'puts'放入'When'或'Then'步骤

您可以按如下方式查询页面(假设您正在使用RSpec)

page.should have_content 'foo'
page.should have_selector 'h1', text: => 'Hello dave'

希望这有帮助

答案 2 :(得分:0)

您还可以通过将page.body打印到标准输出来查看HTML响应。

Given /^I am not an admin$/ do
  visit '/accounts/login'
  puts page.body
end