2

Poltergeist gem を使用して Cookie を設定しようとしている問題が発生しています。Poltergeist gem でクローズされた問題を読んだところ、これは私の側のユーザー エラーの問題のようですが、試行に丸一日費やしましたCookie を適切に設定するには、適切に設定できないようです。

注: このテストはセレンで問題なく動作しますが、セレンの実行時の問題によりポルターガイストを使用したいと思います。

私が取り組んでいるアプリケーションは、「_location」Cookie を使用して全体的な設定を決定しています。アプリケーションの任意のページに初めてアクセスしたときに、Cookie にアクセスできるようにする必要があります。そうしないと、場所が設定されていないために設定されていない値を探していると、javascript エラーが発生します。

Poltergeist gem の README には、 Cookie の次の使用法が示されています。

クッキーの操作

Cookie の検査と操作には、次のメソッドが使用されます。

page.driver.cookies- 現在のページにアクセスできる Cookie のハッシュ。キーは Cookie 名です。値は Cookie オブジェクトで、メソッドnameは 、valuedomainpathsecure?httponly?ですexpires

page.driver.set_cookie(name, value, options = {})- クッキーを設定します。オプション ハッシュは、次のキーを取ることができます: :domain:path:secure、。Time オブジェクトである必要があります。:httponly:expires:expires

page.driver.remove_cookie(name)- クッキーを削除する

-- specs/spec_helper.rb

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :debug => true)
end

Capybara.javascript_driver = :poltergeist

-- ビュー/管理者/記事/new.html.haml

= link_to_function "test js", '$(this).html("js works")'

-- specs/requests/article_products_spec.rb

require 'spec_helper'

describe "Associating Articles with Products and Product Categories" do

  before (:all) do
    @user = create(:user, role: "admin")
    5.times { create(:product_category) }
    @product_categories = ProductCategory.all
    @product_categories.each do |pc|
      4.times { create(:product, product_category: pc) }
    end
  end

  before (:each) do
    visit new_user_session_path
    page.driver.set_cookie("_location", "US")
    page.driver.cookies
    fill_in "Username Or Email", with: @user.email
    fill_in "Password", with: @user.password
    click_button "Sign In"
    visit new_admin_article_path
  end

  it "supports js", :js => true do
    click_link "test js"
    page.should have_content("js works")
  end

end

テスト応答

{"name"=>"visit", "args"=>["http://127.0.0.1:64554/users/sign_in"]}
{"error"=>{"name"=>"Poltergeist.JavascriptError", "args"=>[[{"message"=>"TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')", "stack"=>"TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')\n    at http://127.0.0.1:64554/assets/non_deferred.js:12338\n    at http://127.0.0.1:64554/assets/non_deferred.js:1076\n    at http://127.0.0.1:64554/assets/non_deferred.js:1194\n    at http://127.0.0.1:64554/assets/non_deferred.js:7539 in done\n    at http://127.0.0.1:64554/assets/non_deferred.js:8325"}]]}}
{"name"=>"reset", "args"=>[]}
{"response"=>true}
F

Failures:

  1) Associating Articles with Products and Product Categories supports js
     Failure/Error: visit new_user_session_path
     Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page:

       TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')
           at http://127.0.0.1:64554/assets/non_deferred.js:12338
           at http://127.0.0.1:64554/assets/non_deferred.js:1076
           at http://127.0.0.1:64554/assets/non_deferred.js:1194
           at http://127.0.0.1:64554/assets/non_deferred.js:7539 in done
           at http://127.0.0.1:64554/assets/non_deferred.js:8325
     # ./spec/requests/article_products_spec.rb:15:in `block (2 levels) in <top (required)>'
     # ./spec/support/vcr.rb:14:in `block (2 levels) in <top (required)>'

この失敗により、おそらくページにアクセスする前に Cookie を設定する必要があると思いましたが、Capybara スクリプトで「visit」を使用する前に page.driver.set_cookie コマンドを使用すると、実際には何も設定されないようです。 . この変更されたコード ブロックとこの結果セットからわかるように。

-- specs/requests/article_products_spec.rb

describe "Associating Articles with Products and Product Categories" do

  before (:all) do
    @user = create(:user, role: "admin")
    5.times { create(:product_category) }
    @product_categories = ProductCategory.all
    @product_categories.each do |pc|
      4.times { create(:product, product_category: pc) }
    end
  end

  before (:each) do
    page.driver.set_cookie("_location", "US")
    page.driver.cookies
    visit new_user_session_path
    fill_in "Username Or Email", with: @user.email
    fill_in "Password", with: @user.password
    click_button "Sign In"
    visit new_admin_article_path
  end

  it "supports js", :js => true do
    click_link "test js"
    page.should have_content("js works")
  end
end

テスト応答

{"name"=>"set_cookie", "args"=>[{:name=>"_location", :value=>"US", :domain=>"127.0.0.1"}]}
{"response"=>true}
{"name"=>"cookies", "args"=>[]}
{"response"=>[]}
{"name"=>"visit", "args"=>["http://127.0.0.1:64090/users/sign_in"]}
{"error"=>{"name"=>"Poltergeist.JavascriptError", "args"=>[[{"message"=>"TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')", "stack"=>"TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')\n    at http://127.0.0.1:64090/assets/non_deferred.js:12338\n    at http://127.0.0.1:64090/assets/non_deferred.js:1076\n    at http://127.0.0.1:64090/assets/non_deferred.js:1194\n    at http://127.0.0.1:64090/assets/non_deferred.js:7539 in done\n    at http://127.0.0.1:64090/assets/non_deferred.js:8325"}]]}}
{"name"=>"reset", "args"=>[]}
{"response"=>true}
F

Failures:

  1) Associating Articles with Products and Product Categories supports js
     Failure/Error: visit new_user_session_path
     Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page:

       TypeError: 'null' is not an object (evaluating 'response.custentitydefault_shipping_location')
           at http://127.0.0.1:64554/assets/non_deferred.js:12338
           at http://127.0.0.1:64554/assets/non_deferred.js:1076
           at http://127.0.0.1:64554/assets/non_deferred.js:1194
           at http://127.0.0.1:64554/assets/non_deferred.js:7539 in done
           at http://127.0.0.1:64554/assets/non_deferred.js:8325
     # ./spec/requests/article_products_spec.rb:15:in `block (2 levels) in <top (required)>'
     # ./spec/support/vcr.rb:14:in `block (2 levels) in <top (required)>'

外部 Cookie ファイルを使用して、phantomjs_options ブロックをポルターガイスト ドライバーに渡すことも試みました。それは実際にはもう少し先に進んでいるように見えましたが、null cookie_jar になってしまいました。この試みを以下に示します。

--spec/spec_helper.rb

  Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, [phantomjs_options: [--cookies-file="#{::Rails.root}/spec/requests/cookies.txt"]] )
  end

  Capybara.javascript_driver = :poltergeist

-- cookie.txt

phantom.addCookie({
    'name':     '_location',
    'value':    'US',
    'domain':   'localhost',
    'expires':  (new Date()).getTime() + 3600
});

テスト応答 F

Failures:

  1) Associating Articles with Products and Product Categories supports js
     Failure/Error: visit new_user_session_path
     NoMethodError:
       undefined method `cookie_jar' for nil:NilClass
     # ./spec/requests/article_products_spec.rb:15:in `block (2 levels) in <top (required)>'
     # ./spec/support/vcr.rb:14:in `block (2 levels) in <top (required)>'

Finished in 2.42 seconds
1 example, 1 failure
4

1 に答える 1

3

Poltergeist にオプションを指定しようとして、PhantomJS のオプションと混同されたと思います。登録ブロックは次のようになります。

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :phantomjs_options => ["--cookies-file=#{::Rails.root}/spec/requests/cookies.txt"])
end

それが役立つことを願っています。

于 2013-06-12T16:59:50.043 に答える