1

以下に指定されたコードを使用してフォームに入力し (Cucumber テストで)、フォームを送信すると、paramsコントローラーでハッシュが完全に空になります。

私はいくつかのデバッグを行い、カピバラのいくつかの深いレベルで、実際に送信すると、valueノコギリノードには呼び出しの前に属性が設定されclick_buttonていません。

visit '/'
click_link 'Sign out' if has_link? 'Sign out'
click_link 'Log in'

find(:css, '#user_email').set 'my@email.com'
find(:css, '#user_password').set 'foobar'
find(:css, '#user_remember_me').set true

click_button 'Sign in'

コントローラーでの私のparamsハッシュ:

{"utf8"=>"✓", "user"=>{"email"=>"", "password"=>"", "remember_me"=>"1"}, "commit"=>"Sign in", "action"=>"create", "controller"=>"auth"}

フォームの HTML は次のようなものです。

<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="blah-blah-blah"></div>
<div class="email">
<label for="user_email" title="Email or LDAP username">Login</label>
:
<input autofocus="autofocus" id="user_email" name="user[email]" placeholder="EMAIL or LDAP" size="30" title="Email or LDAP username" type="text" value="">
</div>
<div class="password">
<label for="user_password">Password</label>
:
<input id="user_password" name="user[password]" placeholder="PASSWORD" size="30" type="password">
</div>
<div class="rememberable">
<label for="user_remember_me">Remember me</label>
:
<div class="checkbox">
<input name="user[remember_me]" type="hidden" value="0"><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1">
</div>
</div>
<div class="signin">
<div class="wrapper">
<div class="input">
Sign in
<input name="commit" type="submit" value="Sign in">
</div>
</div>
</div>
</form>

の実行からの出力cucumber features/my_feature.feature -vb:

shybovycha@shybovycha-laptop:~/projects/rails/my_project$ cucumber features/my_feature.feature -vb
Using the default profile...
Code:
  * features/support/env.rb
[RailsAdmin] RailsAdmin initialization disabled by default. Pass SKIP_RAILS_ADMIN_INITIALIZER=false if you need it.
Clearing database
Running db:migrate
Running db:seed for our instance
  * features/support/capybara_headers.rb
  * features/step_definitions/backoffice.rb
  * features/step_definitions/content_verification .rb
  * features/step_definitions/db_manipulation.rb
  * features/step_definitions/forms_and_links.rb
  * features/step_definitions/jenkins_integration.rb
  * features/step_definitions/mobile_view.rb
  * features/step_definitions/navigation.rb
  * features/step_definitions/users_manipulation.rb

Features:
  * features/my_feature.feature
Parsing feature files took 0m0.135s

Feature: my_feature

  Scenario: do some actions               # features/my_feature.feature:3
    Given a logged in user                 # features/step_definitions/users_manipulation.rb:45
    And some data exists                      # features/step_definitions/db_manipulation.rb:12
    When I visit some page        # features/step_definitions/navigation.rb:13
    And click "Subscribe" link                      # features/step_definitions/forms_and_links.rb:6
      no link with title, id or text 'Subscribe' found (Capybara::ElementNotFound)
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/node/finders.rb:154:in `raise_find_error'
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/node/finders.rb:27:in `block in find'
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/node/base.rb:54:in `wait_until'
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/node/finders.rb:27:in `find'
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/node/actions.rb:27:in `click_link'
      (eval):2:in `click_link'
      /var/lib/gems/1.9.1/gems/capybara-1.1.3/lib/capybara/dsl.rb:161:in `click_link'
      /home/shybovycha/projects/rails/my_project/features/step_definitions/forms_and_links.rb:8:in `block in <top (required)>'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/core_ext/instance_exec.rb:48:in `instance_exec'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/core_ext/instance_exec.rb:48:in `block in cucumber_instance_exec'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/core_ext/instance_exec.rb:69:in `cucumber_run_with_backtrace_filtering'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/core_ext/instance_exec.rb:36:in `cucumber_instance_exec'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/rb_support/rb_step_definition.rb:69:in `invoke'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/step_match.rb:25:in `invoke'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/step_invocation.rb:60:in `invoke'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/step_invocation.rb:38:in `accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:99:in `block in visit_step'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:163:in `broadcast'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:98:in `visit_step'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/step_collection.rb:15:in `block in accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/step_collection.rb:14:in `each'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/step_collection.rb:14:in `accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:93:in `block in visit_steps'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:163:in `broadcast'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:92:in `visit_steps'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/scenario.rb:55:in `block (2 levels) in accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:80:in `block (2 levels) in with_hooks'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:96:in `before_and_after'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:79:in `block in with_hooks'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:120:in `call'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:120:in `block (3 levels) in around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/language_support/language_methods.rb:9:in `block in around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/language_support/language_methods.rb:91:in `call'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/language_support/language_methods.rb:91:in `execute_around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/language_support/language_methods.rb:8:in `around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:119:in `block (2 levels) in around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:117:in `call'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:117:in `around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:91:in `around'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:78:in `with_hooks'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/scenario.rb:53:in `block in accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/scenario.rb:108:in `with_visitor'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/scenario.rb:47:in `accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:51:in `block in visit_feature_element'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:163:in `broadcast'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:50:in `visit_feature_element'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/feature.rb:43:in `block in accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/feature.rb:42:in `each'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/feature.rb:42:in `accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:20:in `block in visit_feature'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:163:in `broadcast'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:19:in `visit_feature'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/features.rb:29:in `block in accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/features.rb:17:in `each'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/features.rb:17:in `each'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/features.rb:28:in `accept'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:14:in `block in visit_features'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:163:in `broadcast'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/ast/tree_walker.rb:13:in `visit_features'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:46:in `run!'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:43:in `execute!'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:20:in `execute'
      /var/lib/gems/1.9.1/gems/cucumber-1.2.1/bin/cucumber:14:in `<top (required)>'
      /usr/local/bin/cucumber:19:in `load'
      /usr/local/bin/cucumber:19:in `<main>'
      features/my_feature.feature:7:in `And click "Subscribe" link'
...

そのエラーは、コンテンツが見つからなかったことを除いて何も教えてくれません。理由は、ハッシュが空であるためdevise認証を行わないためです。したがって、ユーザーデータを取得できませんでした。そのため、認証できませんでした。そのため、ユーザーはページを表示できず、エラー メッセージを表示するホームページにリダイレクトされます。そのため、テストで使用する必要があるコンテンツが見つかりません。params

4

1 に答える 1

2

問題の解決策と理由が見つかりました。

理由

ショートバージョン

どういうわけか、カピバラは ( PhantomJSを使用しても) 要素が表示されているかどうかを認識しません。私のテストではなく、カピバラの内部です。

詳細な理由の説明

1ページにサインアップフォームサインインフォームの2つのフォームがあります。どちらも非表示ですが、ユーザーがサインインまたはサインアップボタンを押すと、対応するフォームが表示されます。どちらのフォームにも、フィールド#user_email#user_passwordが含まれています。ただし、サインアップ フォームには#user_password_confirmationが含まれていますが、サインインフォームには代わりに#user_remember_meが含まれています。

フォームのコードを見てください。

<div class="forms">
    <div class="signup-form" style="display: block;">
        <form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
            <div style="margin:0;padding:0;display:inline">
                <input name="utf8" type="hidden" value="&#10003;" />
                <input name="authenticity_token" type="hidden" value="viNleUNDfdlp92j9vVU9QravqMRbmCUZDqw3pV9jQK0=" />
            </div>

            <div class="email">
                <input autofocus="autofocus" id="user_email" name="user[email]" placeholder="EMAIL or LDAP" size="30" type="email" value="" />
            </div>

            <div class="password">
                <input id="user_password" name="user[password]" placeholder="PASSWORD" size="30" type="password" />
            </div>

            <div class="password">
                <input id="user_password_confirmation" name="user[password_confirmation]" placeholder="PASSWORD CONFIRMATION" size="30" type="password" />
            </div>

            <div class="signup">
                Sign up
                <input name="commit" type="submit" value="Sign up" />
            </div>
        </form>
    </div>

    <div class="signin-form" style="display: none;">
        <form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post">
            <div style="margin:0;padding:0;display:inline">
                <input name="utf8" type="hidden" value="&#10003;" />
                <input name="authenticity_token" type="hidden" value="viNleUNDfdlp92j9vVU9QravqMRbmCUZDqw3pV9jQK0=" />
            </div>

            <div class="email">
                <input autofocus="autofocus" id="user_email" name="user[email]" placeholder="EMAIL or LDAP" size="30" title="Email or LDAP username" type="text" value="" />
            </div>

            <div class="password">
                <input id="user_password" name="user[password]" placeholder="PASSWORD" size="30" type="password" />
            </div>

            <div class="rememberable">
                <label for="user_remember_me">Remember me</label>:

                <div class="checkbox">
                    <input name="user[remember_me]" type="hidden" value="0" />
                    <input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
                </div>
            </div>

            <div class="signin">
                Sign in
                <input name="commit" type="submit" value="Sign in" />
            </div>
        </form>
    </div>
</div>

さて、テストでは、サインイン フォームを見えるようにする行があります。次に、test は表示されているフォームに入力してサーバーに送信しようとします。

しかし、なぜかカピバラは目に見える形見えない形を区別していません。そのため、以前はサインアップフォームであった最初のフォーム内に入力を入力します。

次に、サインイン ボタンをクリックするコード行があります。見る?入力されたフォームはサインアップで、送信はサインインです。

ソリューション

ショートバージョン

使用しないでくださいfill_in 'Input', :with => 'value'

代わりにfind(:css, '#selector').set 'value'またはを使用してください。find(:xpath, '/selector').set 'value'

詳細な説明

説明した理由により、指定されたラベル/ID/タイトルに一致する最初の可視要素fill_inを検索します(私の例では数行上にあります) Input

1 つのページに同じラベル/ID/タイトルの入力がいくつかあるが、フォームが異なるfill_in場合、あいまいで間違った要素を埋める可能性があります。

このメソッドは、指定されたセレクター ルールに一致する最初の要素findを検索します(または、指定した最初の引数に基づいて、上記の例では) css selectorxpathcss selector

重要な注意点

そのため、可能な限り多くの特定のセレクターを常に渡すようにしてください

于 2012-11-17T11:43:40.297 に答える