Capybara引发了这个奇怪的错误,第一个例子总是能正常工作,但后续的例子在执行过程中第二次调用visit方法时,也出现了同样的错误。
TypeError:'no implicit conversion of Symbol into Integer' TypeError:'没有将符号隐式转换为整数'。
我已经尝试过捆绑更新,改变我的mocks周围,但似乎没有任何改变.我不知道如何重现它,因为我不知道它是如何发生的。
问题首次出现在从rails 3.2升级到5.2之后。
测试环境会出现错误,而Capybara却能正常通过。
所有测试都能单独通过。
无论是否在同一个例子中,它总是在第二次访问调用时发生。
selenium
和 selenium_chrome
以及无头变体before(:each)
阻止bundle update --conservative
和 bundle update
config.raise_server_errors
在Capybara配置中selenium-webdriver
版本编辑1: 只发生在 js: true
测试
溯源。
Editar Documentação
Editar Documentação
com falha
documentação adicional não entregue
Capybara starting Puma...
* Version 4.3.1 , codename: Mysterious Traveller
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:37485
não consegue editar de pendente para indeferido
com sucesso
indeferido para deferido
consegue editar de indeferido para deferido (FAILED - 1)
pendente para indeferido
consegue editar de pendente para indeferido (FAILED - 2)
Failures:
1) Editar Documentação Editar Documentação com sucesso indeferido para deferido consegue editar de indeferido para deferido
Failure/Error: visit edit_candidatura_path(candidatura)
TypeError:
no implicit conversion of Symbol into Integer
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/session.rb:271:in `[]='
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/session.rb:271:in `visit'
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/dsl.rb:58:in `block (2 levels) in <module:DSL>'
# ./spec/features/candidatos/editar_documentacao_spec.rb:41:in `block (5 levels) in <top (required)>'
2) Editar Documentação Editar Documentação com sucesso pendente para indeferido consegue editar de pendente para indeferido
Failure/Error: visit edit_candidatura_path(candidatura)
TypeError:
no implicit conversion of Symbol into Integer
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/session.rb:271:in `[]='
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/session.rb:271:in `visit'
# /home/gurja/.rvm/gems/ruby-2.5.3@sispos_novo/gems/capybara-3.32.1/lib/capybara/dsl.rb:58:in `block (2 levels) in <module:DSL>'
# ./spec/features/candidatos/editar_documentacao_spec.rb:73:in `block (5 levels) in <top (required)>'
Top 3 slowest examples (15.28 seconds, 89.3% of total time):
Editar Documentação Editar Documentação com falha documentação adicional não entregue não consegue editar de pendente para indeferido
10.53 seconds ./spec/features/candidatos/editar_documentacao_spec.rb:106
Editar Documentação Editar Documentação com sucesso indeferido para deferido consegue editar de indeferido para deferido
2.43 seconds ./spec/features/candidatos/editar_documentacao_spec.rb:40
Editar Documentação Editar Documentação com sucesso pendente para indeferido consegue editar de pendente para indeferido
2.32 seconds ./spec/features/candidatos/editar_documentacao_spec.rb:72
Finished in 17.11 seconds (files took 5 seconds to load)
3 examples, 2 failures
Failed examples:
rspec ./spec/features/candidatos/editar_documentacao_spec.rb:40 # Editar Documentação Editar Documentação com sucesso indeferido para deferido consegue editar de indeferido para deferido
rspec ./spec/features/candidatos/editar_documentacao_spec.rb:72 # Editar Documentação Editar Documentação com sucesso pendente para indeferido consegue editar de pendente para indeferido
Capybara配置。
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w(headless disable-gpu) }
)
Capybara::Selenium::Driver.new(app, { browser: :chrome, desired_capabilities: capabilities })
end
Capybara.javascript_driver = :chrome
Capybara.configure do |config|
config.raise_server_errors
end
RSpec.configure do |config|
config.before(:each, js: true) do
Capybara.page.driver.browser.manage.window.maximize
end
end
Gemfile:
ruby '2.5.3'
# Aplicações Gerais
gem 'rails', '~> 5.2'
gem 'rake', '13.0.1'
# gem 'rack-cache'
gem 'mysql2', '0.5.2'
gem 'cancancan', '3.0.2'
gem 'nokogiri', '1.10.8'
# gem 'exception_notification', '2.6.1', :require => 'exception_notifier'
gem 'acts_as_votable', '0.12.1'
gem 'time_splitter', '1.1.0'
gem 'httparty', '0.17.3'
# gem 'rails-erd', '1.5.2', require: false
# gem 'sprockets-rails', :require => 'sprockets/railtie'
gem 'iconv', '1.0.8'
gem 'has_scope', '0.7.2'
gem 'font-awesome-rails', '4.7.0.5'
gem 'responders', '~> 2.0'
# JSON
gem 'json', '2.3.0'
gem 'multi_json', '~> 1.14', '>= 1.14.1'
# JQuery
gem 'jquery-rails', '4.3.5'
gem 'jquery-ui-rails', '6.0.1'
# gem 'bxslider-rails'
gem 'select2-rails', '4.0.3'
gem 'multi-select-rails', '0.9.12'
# Javascript
gem 'js-routes', '1.4.9'
gem 'therubyracer', '0.12.3'
# gem 'highcharts-rails'
gem 'sprockets', '3.7.2'
gem 'uglifier', '4.2.0'
# Query
gem 'will_paginate', '3.1.7'
# ActiveRecord
gem 'paperclip', '6.1.0'
gem 'delayed_job_active_record', '4.1.4'
gem 'amoeba', '3.1.0'
gem 'activeresource', '5.1.0'
# Validations
gem 'validates_timeliness', '4.1.1'
gem 'charlock_holmes_bundle_icu', '~> 0.6.9.2'
# gem 'rqrcode'
# Documentos
gem 'spreadsheet', '1.2.6'
gem 'to_xls', '1.5.3'
gem 'rtf', '0.3.3'
gem 'prawn', '2.2.2'
gem 'prawn-table', '0.2.2'
gem 'prawn-qrcode', '0.5.1'
# Ruby
# gem 'whenever'
# gem 'daemons', '1.0.10'
# gem 'websocket', '1.2.1'
# gem 'concurrent-ruby'
# GrayLog
gem 'gelf', '3.1.0'
# Assets Pipeline
gem 'sass-rails', '6.0.0'
gem 'coffee-rails', '5.0.0'
gem 'tinymce-rails', '5.2.0'
gem 'highcharts-rails', '6.0.3'
# Migracao para o docker
gem 'puma', '4.3.1'
# Acertos
gem 'rubocop', require: false
group :development, :test do
gem 'byebug'
gem 'uniform_notifier', '1.13.0'
gem 'factory_bot_rails', '5.1.1'
# gem 'awesome_print'
gem 'rspec-rails'
gem 'rails3-generators'
# gem 'mongrel', '1.2.0.pre2'
# gem 'email_spec', '1.5.0'
# gem 'public_suffix', '1.4.6'
# gem 'webrick', '~> 1.3.1'
end
group :development do
gem 'bullet'
gem 'brakeman', :require => false
end
group :test do
gem 'shoulda-matchers'
gem 'capybara'
gem 'selenium-webdriver'
gem 'database_cleaner', '1.7.0'
# gem 'launchy'
gem 'webmock'
# # gem "activerecord-mysql2-retry-ext"
gem 'simplecov'
gem 'simplecov-rcov'
# gem 'transpec'
# gem 'parser', '2.3.3.1'
end
group :production, :homologacao do
gem 'SyslogLogger'
# gem 'newrelic_rpm'
end
group :development, :test, :homologacao do
gem 'letter_opener'
end
editar_documentacao_spec.rb。
# coding: UTF-8
require 'spec_helper'
RSpec.feature 'Editar Documentação', type: :feature do
let(:admin) { create :administrador_suporte }
let(:iduff) { admin.vinculacao.identificacao_login.iduff }
let(:candidato) { create :candidato }
let(:deferido) { create :situacao_documentacao, :deferido }
let(:indeferido) { create :situacao_documentacao, :indeferido }
let(:pendente) { create :situacao_documentacao, :pendente }
let(:cpf_xpath) { '//*[@id="edit_candidatura_1"]/fieldset[2]/div[1]/span[2]/input' }
let(:rg_xpath) { '//*[@id="edit_candidatura_1"]/fieldset[2]/div[2]/span[2]/input' }
let(:diploma_xpath) { '//*[@id="edit_candidatura_1"]/fieldset[2]/div[3]/div/div/span[2]/input' }
let(:documentao_adicional_xpath) { '//*[@id="doc_adicional"]/span/input' }
before(:each) do
deferido
indeferido
pendente
candidatura
situacao
login_user(iduff)
end
describe 'Editar Documentação', js: true do
context 'com sucesso' do
context 'indeferido para deferido' do
let(:situacao) do
create :situacao_candidatura, :aguardando_avaliacao_desempenho
end
let(:candidatura) do
create :candidatura_documentacao_indeferida, candidato: candidato
end
scenario 'consegue editar de indeferido para deferido' do
visit edit_candidatura_path(candidatura)
attach_file('candidatura_documentacoes_candidatura_attributes_0_documento',
"#{Rails.root}/spec/fixtures/documentos/cpf.pdf")
xpath_fill_autocomplete(cpf_xpath, with: deferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_1_documento',
"#{Rails.root}/spec/fixtures/documentos/rg.pdf")
xpath_fill_autocomplete(rg_xpath, with: deferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_2_documento',
"#{Rails.root}/spec/fixtures/documentos/diploma.pdf")
xpath_fill_autocomplete(diploma_xpath, with: deferido.descricao)
xpath_fill_autocomplete(documentao_adicional_xpath, with: deferido.descricao)
click_on 'Salvar'
expect(page).to have_content "Documentos Atualizados com sucesso!"
end
end
context 'pendente para indeferido' do
let(:situacao) do
create :situacao_candidatura, :indeferido_aguardando_reenvio
end
let(:candidatura) do
create :candidatura_aguardando_avaliacao, candidato: candidato
end
scenario 'consegue editar de pendente para indeferido' do
visit edit_candidatura_path(candidatura)
attach_file('candidatura_documentacoes_candidatura_attributes_0_documento',
"#{Rails.root}/spec/fixtures/documentos/cpf.pdf")
xpath_fill_autocomplete(cpf_xpath, with: indeferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_1_documento',
"#{Rails.root}/spec/fixtures/documentos/rg.pdf")
xpath_fill_autocomplete(rg_xpath, with: indeferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_2_documento',
"#{Rails.root}/spec/fixtures/documentos/diploma.pdf")
xpath_fill_autocomplete(diploma_xpath, with: indeferido.descricao)
xpath_fill_autocomplete(documentao_adicional_xpath, with: deferido.descricao)
click_on 'Salvar'
expect(page).to have_content "Documentos Indeferidos!"
end
end
end
context 'com falha' do
let(:situacao) do
create :situacao_candidatura, :indeferido_aguardando_reenvio
end
context 'documentação adicional não entregue' do
let(:candidatura) do
create :candidatura_aguardando_avaliacao, candidato: candidato
end
scenario 'não consegue editar de pendente para indeferido' do
visit edit_candidatura_path(candidatura)
attach_file('candidatura_documentacoes_candidatura_attributes_0_documento',
"#{Rails.root}/spec/fixtures/documentos/cpf.pdf")
xpath_fill_autocomplete(cpf_xpath, with: indeferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_1_documento',
"#{Rails.root}/spec/fixtures/documentos/rg.pdf")
xpath_fill_autocomplete(rg_xpath, with: indeferido.descricao)
attach_file('candidatura_documentacoes_candidatura_attributes_2_documento',
"#{Rails.root}/spec/fixtures/documentos/diploma.pdf")
xpath_fill_autocomplete(diploma_xpath, with: indeferido.descricao)
click_on 'Salvar'
expect(page).to have_content "Documentação adicional não entregue!"
end
end
end
end
end
我设法解决了这个问题。这是Capybara在我的项目中的版本问题,可能是包的版本冲突,因为我在Stackoverflow或Capybara的Github问题中没有发现这个问题。
我把它降级到了3.10.1,它就能正常工作了,然后我逐步升级,直到3.15.1。比这更新的版本都坏了。