Capybara/Rspec - 有没有办法在点击提交之前测试输入框是否已经填满?

Capybara/Rspec - Is there a way to test if an input box has been filled before clicking on submit?

我正在学习 RSpec 和 Capybara,并尝试测试用户是否可以导航到登录页面(由 Devise 提供支持)并成功登录。测试没有看到成功登录后应该出现的页面。使用浏览器时,如果输入不存在,它 returns 到登录页面。我正在使用 Rails 5.

login_spec.rb

require 'spec_helper'
require 'rails_helper'
RSpec.feature "Logging in a User" do
    scenario "Logging in user shows special content" do
        visit "/"
        click_link "Sign In"    

        page.should have_content("Password")

        #fill in login information
        page.fill_in 'Email', with: 'admin@example.com'
        page.fill_in 'Password', with: 'some_password'
        click_on 'Log in'

        page.should have_no_content("Wait for the text which is available in the sign in page but not on next page")
        page.should have_content('User:')
        expect(page.current_path).to eq(root_path)
    end
end

水豚错误信息:

  1) Logging in a User Logging in user shows special content
     Failure/Error: page.should have_content('User:')
       expected to find text "User:" in "Log in\nEmail\nPassword\nRemember me\nSign up Forgot your password?"
     # ./spec/features/login_spec.rb:17:in `block (2 levels) in <top (required)>'

是的,您可以检查是否已使用 have_field 匹配器

填写字段
expect(page).to have_field('Email', with: 'admin@example.com')

将验证页面是否有标签为 'Email' 且填充值为 'admin@example.com' 的字段。

这不是您当前问题的原因,但您混合使用 RSpec 的 shouldexpect 语法是否有原因?你真的应该坚持一个,最好是`期待新代码 - 所以

expect(page).to have_content("Password")
expect(page).not_to have_content("Wait for the text which is ...

而不是

page.should have_content("Password")
page.should have_no_content("Wait for the text which is ...

另外 - 你几乎不应该使用普通的 RSpec 匹配器(eq,等等)与水豚相关的任何东西,你应该使用水豚提供的匹配器

expect(page).to have_current_path(root_path)

而不是expect(current_path)...