我使用使用poltergeist和phantomjs作为javascript驱动程序进行请求测试,使用capybara编写了一些测试。
以下填写登录表单的步骤很好,没有js:
it "signs in" do
visit new_user_session_path
fill_in "Email", with: user
fill_in "Password", with: password||"foobar"
click_button "Login"
end
如果我用js it "signs in", js: true do
定义我的测试,我的测试失败并出现错误:
Capybara::ElementNotFound: Unable to find field "Email"
登录表单本身是使用simple_form作为表单生成器和前端的bootstrap构建的。 这些字段没有标签。搜索文本仅包含在占位符属性中。
= simple_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
= f.input :email, :placeholder => User.human_attribute_name(:email), :label => false, :input_html => {:class => 'input-xlarge'}
= f.input :password, :placeholder => User.human_attribute_name(:password), :label => false, :input_html => {:class => 'input-xlarge'}
%div
= f.button :submit, "Login", :class => 'btn btn-large btn-primary'
此代码生成以下html代码
<form accept-charset="UTF-8" action="/users/login" class="simple_form new_user" id="new_user" method="post" novalidate="novalidate">
<div style="margin:0;padding:0;display:inline">
<input name="utf8" type="hidden" value="✓">
</div>
<div class="control-group email required user_email">
<div class="controls">
<input class="string email required input-xlarge" id="user_email" name="user[email]" placeholder="Email" size="50" type="email" value="">
</div>
</div>
<div class="control-group password required user_password">
<div class="controls">
<input class="password required input-xlarge" id="user_password" name="user[password]" placeholder="Password" size="50" type="password">
</div>
</div>
<div>
<input class="btn btn btn-large btn-primary" name="commit" type="submit" value="Login">
</div>
</form>
您是否有任何想法,即使js被激活,如何确保找到字段?
答案 0 :(得分:3)
我不知道您的Webrat测试是如何通过的。根据我的经验,如果没有匹配的标签或ID,Capybara找不到“电子邮件”。
在您的情况下,由于您不使用标签,我建议您找到ID为
的字段fill_in "user_email", with user.email
# user_email is the id created by simple_form in general case. Verify yours.
# Don't need "#" before id.
答案 1 :(得分:1)
在visit new_user_session_path
之后截取屏幕截图并验证在以下情况下呈现html:js =&gt;真。
visit new_user_session_path
save_and_open_page
如果没有渲染任何内容,只需要一个空的html文档,请确保在spec_helper.rb中
config.use_transactional_fixtures = false
也尝试使用DatabaseCleaner gem。
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with :truncation
end
config.before(:each) do
if example.metadata[:js]
DatabaseCleaner.strategy = :truncation
else
DatabaseCleaner.strategy = :transaction
end
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end