Capybara:fill_in动作定位器

时间:2011-09-08 06:40:09

标签: ruby-on-rails rspec capybara

所以我有这个规范

describe "visit /signup" do
    before(:each) do
        get signup_path
    end
    it "has an email input field" do
        page.has_field?("#user_email")
    end
    it "accepts an email address" do
        page.fill_in('#user_email', :with=>Faker::Internet.email)
    end
end

第一次测试(有电子邮件输入)通过,第二次测试失败

Failure/Error: page.fill_in('#user_email', :with=>Faker::Internet.email)
Capybara::ElementNotFound:
   cannot fill in, no text field, text area or password field with id, name, or label '#user_email' found

输入[type ='text']元素存在于具有该DOM ID的页面上,尝试使用带有和不带散列的ID定位,并使用其输入:name作为定位器。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

这是因为当您在get块中使用visit时,您正在使用before。这样:

before(:each) do
  get signup_path
end

应该是这样的:

before(:each) do
    visit signup_path
end

否则你告诉Rack::Test访问该路径, Capybara!一个很小的区别,经常绊倒很多人!

答案 1 :(得分:2)

也许你应该删除#,例如

fill_in('user_email', :with=>Faker::Internet.email)

答案 2 :(得分:0)

我认为fill_in不在页面上。只需使用fill_in:

describe "visit /signup" do
    before(:each) do
        get signup_path
    end
    it "has an email input field" do
        page.has_field?("#user_email")
    end
    it "accepts an email address" do
        fill_in('#user_email', :with=>Faker::Internet.email)
    end
end