2016-03-24 5 views
0

Ich überschreibe Feature-Spezifikationen zu Seitenobjekten und ich habe ein Problem mit fill_in Methode.Capybaras fill_in auf einem Site-Prism-Seitenobjekt funktioniert nicht

Der Code ist wie folgt:

Seite Objekt:

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:

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 

Das Eingabefeld wie folgt definiert ist:

<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">` 

Als ich führe den Test durch, ich bekomme den f ach Fehler:

[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"> 

dieses Feld ist jedoch auffindbar:

[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"> 

Ich denke, es könnte mit angeschlossen werden, wie fill_in verwendet find wenn CSS verwendet werden.

Gibt es eine Möglichkeit, so nah wie möglich damit umzugehen, wie der Endbenutzer mit dem Formular interagieren würde? Ich möchte nicht login_page.email.set '[email protected]' verwenden, denn set ist egal, wenn das Feld tatsächlich anklickbar/befüllbar und nicht durch irgendein Element verdeckt ist.

Antwort

0

Es stellt sich heraus, dass dies funktioniert:

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

Das [:name] Symbol ist jede eindeutige Eingabe Attribut, das Sie im Code haben.

Das half mir How to use fill_in with find in Capybara (if possible)

+0

Was meinen Sie mit "Das [: name] -Symbol ist ein eindeutiges Eingabe-Attribut, das Sie im Code haben können". Ich kämpfe hauptsächlich mit dem Begriff "Eingabeattribut". Meinst du, du musst ein existierendes Attribut vom Eingabeelement angeben, also hast du ': name' aus' ... name = "password" gewählt ... '? – Matthias

+0

Es stellte sich heraus, dass ich falschen HTML-Code eingefügt habe - ich habe das Snippet so bearbeitet, dass es in das E-Mail-Feld passt und kein Passwort :) Und ja, Sie geben ein vorhandenes Attribut für das Eingabeelement an, das für dieses Element eindeutig ist (kein anderes Element auf der Seite hat es) – anks

0

Capbaras #fill_in grundsätzlich als find(:fillable_field, "the id/name/label text").set("value to set") umgesetzt wird. Site-prism verschiebt das Suchverhalten nach Element, erlaubt es Ihnen jedoch, den Selektor anzugeben, der beim Angeben des Elements verwendet wird. Also anstatt

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

tun können Sie tun

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

die login_page.email.set("xyz") äquivalent zur Verwendung von Capybaras fill_in machen sollte. Das gleiche gilt für: checkbox,: radio_button usw.

Verwandte Themen