2016-03-24 16 views
0

Özellik özellikleri sayfa nesnelerine yeniden yazıyor ve fill_in yöntemiyle ilgili bir sorunum var.Site Prism sayfa nesnesi üzerinde Capybara's fill_in çalışmıyor

Sayfa nesnesi:

class LoginPage < SitePrism::Page 
set_url '/login' 

section :navbar, NavbarSection, '.navbar-collapse' 
section :drop_menu, DropMenuSection, '.popover-content' 
element :email, 'input[name=email]' 
element :password, 'input[type=password]' 
element :submit, 'button[type=submit]' 
element :help, 'a', text: "Help! I can't sign in" 
end 

Spec: giriş alanı, bu aşağıdaki gibi tanımlanır

require 'spec_helper' 

feature 'Login', js: true do 
    let(:app) { App.new } 
    let(:login_page) { app.login } 

    scenario 'with invalid credentials results in error message' do 
    login_page.load 
    login_page.fill_in login_page.email, with: '[email protected]' 
    login_page.fill_in login_page.password, with: 'bad password' 
    login_page.submit.click 
    expect(login_page).to have_content 'Invalid credentials' 
    end 

aşağıdaki gibidir:

kodu

<input class="form-control input-lg ng-pristine ng-untouched 
ng-invalid ng-invalid-required" name="email" 
ng-model="login.credentials.email" placeholder="Email" 
required="" tabindex="0" aria-required="true" 
aria-invalid="true">` 

I testi yap, ben f ollowing hatası:

[2] pry(#<RSpec::ExampleGroups::Login>)> login_page.fill_in login_page.email, 
with: '[email protected]' 
Capybara::ElementNotFound: Unable to find field #<Capybara::Node::Element 
tag="input" path="/html/body/div[1]/div/div/div/div/div[2]/div/form/div[1]/div/input"> 

Ancak bu alan bulunabilmesini:

[1] pry(#<RSpec::ExampleGroups::Login>)> login_page.email 
=> #<Capybara::Node::Element tag="input" 
path="/html/body/div[1]/div/div/div/div/div[2]/div/form/div[1]/div/input"> 

Ben CSS kullanıldığında fill_infind nasıl kullandığı ile bağlantılı olabileceğini tahmin.

Son kullanıcının bu formla nasıl etkileşime gireceğine mümkün olduğunca yaklaşmanın bir yolu var mı? login_page.email.set '[email protected]' kullanmak istemiyorum, çünkü alan gerçekten tıklanabilir/doldurulabilir ve bazı öğeler tarafından gizlenmiyorsa set ilgilenmez.

cevap

0

Bu işler çıkıyor:

login_page.fill_in login_page.email[:name], with: '[email protected]' 

[:name] sembolü herhangi bir benzersiz giriş kodda olabilir özellik olduğunu.

Bu temelde find(:fillable_field, "the id/name/label text").set("value to set") olarak uygulanmaktadır Capbaras #fill_in bana How to use fill_in with find in Capybara (if possible)

+0

"[: name] sembolü, kodda sahip olabileceğiniz herhangi bir benzersiz giriş niteliğidir" ile ne demek istiyorsunuz? Esas olarak "girdi özniteliği" terimi ile mücadele ediyorum. Girdi öğesinden varolan bir özniteliği belirtmeniz gerektiğini mi kastediyorsunuz, bu yüzden ': name' den' ... name = 'password' ... '' komutunu seçtiniz mi? – Matthias

+0

Ters çıktı yanlış html kodu yapıştırdım - Snippet'i e-posta alanına uyacak şekilde düzenledim ve parola değil :) Ve evet, bu öğe için benzersiz olan giriş öğesi için varolan bir özniteliği belirtirsiniz (sayfadaki başka bir öğe yoktur) – anks

0

yardımcı oldu. Site prizması, bulma davranışını öğeye taşır, ancak öğeyi belirtirken kullanılan seçiciyi belirlemenize izin verir. Yani daha doğrusu

element :email, "some css to find the email field" 

yapmaktan daha sen capybaras FILL_IN kullanarak login_page.email.set("xyz") eşdeğer yapmalıdır

element :email, :fillable_field, "the id/name/label you would have passed to fill_in" 

yapabilirsiniz. Aynısı şunlar ile yapılabilir: onay kutusu,: radio_button, vb