5

Javascript sürücüsü olarak poltergeist ve phantomjs kullanarak istek testi için capybara kullanarak bazı testler yazdım. Capybara: js ile form alanı bulamıyor: true

bir giriş formu doldurmak için aşağıdaki adımlara

js olmadan harika çalışır:

Capybara::ElementNotFound: Unable to find field "Email" 

giriş formunun kendisi:

it "signs in" do 
    visit new_user_session_path 
    fill_in "Email", with: user 
    fill_in "Password", with: password||"foobar" 
    click_button "Login" 
end 

Ben js ile benim testini tanımlarsanız it "signs in", js: true do benim test hatası ile başarısız ön formda form jeneratörü ve bootstrap olarak simple_form kullanılarak oluşturulmuştur. Alanların bir etiketi yoktur. Arama metni yalnızca yer tutucu özniteliğinde bulunur.

= 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' 

Bu kod aşağıdaki html kodunu

<form accept-charset="UTF-8" action="https://stackoverflow.com/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> 

üretir nasıl alanları js açık dahi olsa bulunur sağlamak için herhangi bir fikir var mı?

+0

Bunun için bir çalışma çözümü bulabildiniz mi? – Scott

+0

size yardımcı olacak bu linki deneyin http://stackoverflow.com/questions/15784398/test-case-for-hidden-field-is-not-working-with-cucumber – Arvind

cevap

3

Webrat testinizin nasıl geçtiğini bilmiyorum. Benim deneyimimde Capybara eşleşen bir Etiket veya kimlik yoksa "E-posta" bulamıyor. js => true: etiketi kullanmayın çünkü sizin durumda

, ben ne zaman oluşturulmakta olan visit new_user_session_path sonra ekran görüntüsü alın 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. 
+0

Bunu denedim, ama Kapibara 'user_email' alanını da bulamıyor. Bir sorun olabilir, ayrıca bir sınıf user_email ile bir öğe var mı? –

+1

@MichaelEf, evet mümkün. Bir projede kalıcı bir modelim olduğunda aynı şekilde karşılaştım. Hata "İddialı Maç" olmalıydı, aynı zamanda "Bulamıyor" olabilir. Tüm html kodunuzu iki kez kontrol edin. –

+0

Hata hala ElementNotFound'du. User_email sınıfı, simple_form tarafından üretildi. Bunu kaldırmanın bir yolunu bulamadım. Bu yüzden form alanlarımı değiştirdim: label => 'Email' ve 'Password'. Artık js özellikli bir test için üretilmiş ve basılmış bir etiket var ama hala başarı yok. –

1

ile alanını bulmak ve html doğrulamak için öneriyoruz.

visit new_user_session_path 
save_and_open_page 

hiçbir şey oluşturulamadı ediliyorsa, sadece boş bir html belge,

config.use_transactional_fixtures = false 

Ayrıca DatabaseCleaner gem kullanarak deneyin spec_helper.rb emin olun.

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 
İlgili konular