0

我正在将功能规范重写为页面对象,但fill_in方法有问题。

代码如下:

页面对象:

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

规格:

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: 'wrong@mail.com'
    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">`

当我运行测试时,我收到以下错误:

[2] pry(#<RSpec::ExampleGroups::Login>)> login_page.fill_in login_page.email, 
with: 'wrong@mail.com'
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使用findCSS 时的使用方式有关。

有没有办法尽可能接近最终用户与表单的交互方式来处理它?我不想使用login_page.email.set 'wrong@mail.com',因为set不关心该字段是否实际上是可点击/可填充的并且未被某些元素隐藏。

4

2 回答 2

1

Capbaras#fill_in基本上实现为 find(:fillable_field, "the id/name/label text").set("value to set"). Site-prism 将查找行为移动到元素,但允许您指定在指定元素时使用的选择器。所以与其做

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")等同于使用 Capybaras fill_in。:checkbox、:radio_button 等也可以做到这一点。

于 2016-03-24T20:10:01.407 回答
0

事实证明这是有效的:

login_page.fill_in login_page.email[:name], with: 'wrong@mail.com'

[:name]符号是您在代码中可能拥有的任何唯一输入属性。

这帮助了我如何在 Capybara 中使用 fill_in 和 find (如果可能的话)

于 2016-03-24T17:13:17.300 回答