【问题标题】:How do i get the response HTML of an entire Page from a Cucumber Step that uses Capybara?如何从使用 Capybara 的 Cucumber Step 获取整个页面的响应 HTML?
【发布时间】:2019-10-25 23:39:22
【问题描述】:

在运行我的规范时,我遇到了 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 /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'

在这里和 Cucumber 一起工作很艰难..

1) 为什么会出现上述情况

2) 怎么调试,我想看 HTML 代码!

【问题讨论】:

    标签: ruby-on-rails ruby cucumber bdd


    【解决方案1】:

    当您的页面 HTML 不包含任何带有名称、id 或标签 'user_login'inputtextarea 元素时,就会出现此错误。如果您将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 并查看它的外观。

    希望对您有所帮助! :)

    【讨论】:

    • 谢谢@mrcasals - 这工作得很好。我还读到了你可以实际做的地方:puts page.body。
    • 也不错!但是使用我的示例的要点是,如果您预编译您的应用程序资产,您将准确地看到您正在通过您的步骤复制的内容(即,使用 HTML 和 CSS),这总是好的:) 但是,是的,@如果您赶时间,987654330@ 也可以工作:)
    【解决方案2】:

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

    尝试将您的“放置”放入“何时”或“然后”步骤

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

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

    希望对你有帮助

    【讨论】:

    • 我编辑了问题@muttonlamb 请再看一遍,因为我不明白这个答案。我正在使用 Cucumber 和工作步骤定义。我在文档中读到可能有一个叫做 Page 的东西。我不确定。
    • 好像水豚没有找到页面上的元素,您是否尝试过在浏览器中正常打开页面?然后,您可以检查 HTML 并确定您的字段命名是否正确。下面关于使用launchy的建议也不错
    • 这也有助于应该断言。谢谢!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多