2016-03-24 1 views
0

Я переписываю спецификации функций для объектов страницы, и у меня есть проблема с методом fill_in.Capybara's fill_in на странице Объект страницы Prism не работает

Код выглядит следующим образом:

Страница объекта:

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 

Поле ввода определяется следующим образом:

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

Когда я запустите тест, я получаю f ollowing ошибка:

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

Однако, это поле доступно для поиска:

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

Я предполагаю, что это может быть связано с тем, как fill_in использует find когда CSS используются.

Есть ли способ обработать его как можно ближе к тому, как конечный пользователь будет взаимодействовать с формой? Я не хочу использовать login_page.email.set '[email protected]', потому что set не заботится, действительно ли поле является кликабельным/заполняемым и не скрытым каким-либо элементом.

ответ

0

Оказывается, что это работает:

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

[:name] символ атрибут любой уникальный вход вы можете иметь в коде.

Это помогло мне How to use fill_in with find in Capybara (if possible)

+0

Что вы подразумеваете под «Символом [: name] является любым уникальным атрибутом ввода, который может иметься в коде». Я в основном борюсь с термином «входной атрибут». Вы имеете в виду, что вы должны указать существующий атрибут из входного элемента, поэтому вы выбираете ': name' из' ... name = "password" ... '? – Matthias

+0

Оказывается, я наклеил неверный код html - я отредактировал фрагмент, чтобы соответствовать полю электронной почты, а не пароль :) И да, вы указываете существующий атрибут для элемента ввода, который является уникальным для этого элемента (на нем нет другого элемента на странице) – anks

0

Capbaras #fill_in в основном реализуется как find(:fillable_field, "the id/name/label text").set("value to set"). Site-prism перемещает поведение find в элемент, но позволяет вам указывать селектор, используемый при указании элемента. Таким образом, вместо того, чтобы делать

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

вы можете сделать

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

, который должен сделать login_page.email.set("xyz") эквивалентно использованию капибары FILL_IN. То же самое можно сделать с помощью: checkbox,: radio_button и т. Д.