Rspec Capybara Webkit:随机无法从回溯中找到匹配行
Rspec Capybara Webkit: Random Unable to find matching line from backtrace
我正在使用 Rspec (3.0.0)、Capybara (2.4.4) 和 Capybara-Webkit (1.5.1) 设置前端测试。我的应用程序使用 Sinatra,因此它不是 Rails 应用程序。
我收到一个奇怪的错误,这似乎是随机的。它可能每三四次尝试发生一次,但它会使其余测试失败。当它通过时一切都很好,Rspec 不会抱怨。
我试过重新安装每个 gem,到处放置 sleep
语句,将等待时间增加到一个不合理的值,但没有任何效果。
我弄乱了 gems 的版本,但错误不断出现。我试图将测试放在救援区,我感到羞耻,但即使那样也没有用。
我找到的答案似乎已经过时,更新软件也没有解决问题。另一个答案表明 Chrome 插件有问题,但这也没有用。
这是我能够收集到的信息:
- 它链接到打开新 window 的测试(见下文)。也许是某种 interaction/timing 错误?
- 当我把日志到处放的时候,好像到了测试的尾声,
expect
语句是真的。似乎在退出测试后出现错误。
- 发生这种情况时,其余测试也会失败,代码如下:
Errno::EPIPE:Broken pipe
Gemfile 的相关部分:
gem 'byebug' # debugger
gem 'capybara'
gem 'capybara-webkit'
gem 'rspec', '~> 3.0.0' # tdd'
gem 'faker' # create fake, but realistic data
gem 'launchy'
失败测试内容:
it 'should submit signup form and open auth popup' do
page.fill_in('email', with: EMAIL)
page.fill_in('password', with: PASSWORD)
page.within_window window_opened_by {click_button 'Sign Up'} do
page.fill_in('EmailAddress', with: EMAIL)
page.fill_in('Password', with: PASSWORD)
page.click_button('sign-in')
end
while auth_connect = page.has_selector?('.loading-container.active.visible')
sleep 0.5
end
expect(checkElementsKyc(page)).to be true
end
失败案例的结果(我已经包含了下一个测试,returns之后的每个测试都是一样的):
Failures:
1) signup_flow signup should submit signup form and open dwolla auth popup
Failure/Error: Unable to find matching line from backtrace
EOFError:
end of file reached
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read_nonblock'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:40:in `gets'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:283:in `check'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:210:in `command'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:38:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/driver.rb:251:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/session.rb:103:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `block in reset_sessions!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `each'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `reset_sessions!'
# /home/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/rspec.rb:20:in `block (2 levels) in <top (required)>'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec_with_rescue'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:356:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `each'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:485:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:344:in `run_after_example'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:163:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:301:in `with_around_example_hooks'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:145:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:494:in `block in run_examples'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `run_examples'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:457:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block in run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/reporter.rb:54:in `report'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:108:in `run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:86:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:70:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:38:in `invoke'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/exe/rspec:4:in `<top (required)>'
# /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `load'
# /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
2) signup_flow edit_details should not pass test with invalid dob
Failure/Error: Unable to find matching line from backtrace
Errno::EPIPE:
Broken pipe
# ./test/scripts/test_helper.rb:18:in `block (2 levels) in <top (required)>'
如有任何帮助,我们将不胜感激!即使是 debugging/logging 工具也会非常有用。
谢谢!
更新:
使用webkit_debug后,我确定是水豚重置浏览器时触发的错误。这是 webkit_debug 的输出:
Finished "Node.attribute" with response "Success(true)"
Wrote response true "true"
Received "Reset()"
Started "Reset()"
Aborting request to ""
should submit signup form and open auth popup (FAILED - 1)
Failures:
Capybara 默认行为是在每次测试后在 :after 挂钩中重置会话。
如堆栈跟踪中所示,此函数 (reset_sessions!) 使我的测试崩溃。
作为临时解决方案,我猴子修补了水豚Gem,以便我可以选择是否在测试后重置会话。
这是我的猴子补丁:
module Capybara
class << self
attr_accessor :keep_sessions
def reset_sessions!
unless Capybara.keep_sessions
session_pool.each { |mode, session| session.reset! }
end
end
alias_method :reset!, :reset_sessions!
end
end
之后,我只是在有问题的测试结束时执行 Capybara.keep_sessions=true
。它正在运行,错误已消失,但我知道这并不理想。
希望对您有所帮助!
我正在使用 Rspec (3.0.0)、Capybara (2.4.4) 和 Capybara-Webkit (1.5.1) 设置前端测试。我的应用程序使用 Sinatra,因此它不是 Rails 应用程序。
我收到一个奇怪的错误,这似乎是随机的。它可能每三四次尝试发生一次,但它会使其余测试失败。当它通过时一切都很好,Rspec 不会抱怨。
我试过重新安装每个 gem,到处放置 sleep
语句,将等待时间增加到一个不合理的值,但没有任何效果。
我弄乱了 gems 的版本,但错误不断出现。我试图将测试放在救援区,我感到羞耻,但即使那样也没有用。
我找到的答案似乎已经过时,更新软件也没有解决问题。另一个答案表明 Chrome 插件有问题,但这也没有用。
这是我能够收集到的信息:
- 它链接到打开新 window 的测试(见下文)。也许是某种 interaction/timing 错误?
- 当我把日志到处放的时候,好像到了测试的尾声,
expect
语句是真的。似乎在退出测试后出现错误。 - 发生这种情况时,其余测试也会失败,代码如下:
Errno::EPIPE:Broken pipe
Gemfile 的相关部分:
gem 'byebug' # debugger
gem 'capybara'
gem 'capybara-webkit'
gem 'rspec', '~> 3.0.0' # tdd'
gem 'faker' # create fake, but realistic data
gem 'launchy'
失败测试内容:
it 'should submit signup form and open auth popup' do
page.fill_in('email', with: EMAIL)
page.fill_in('password', with: PASSWORD)
page.within_window window_opened_by {click_button 'Sign Up'} do
page.fill_in('EmailAddress', with: EMAIL)
page.fill_in('Password', with: PASSWORD)
page.click_button('sign-in')
end
while auth_connect = page.has_selector?('.loading-container.active.visible')
sleep 0.5
end
expect(checkElementsKyc(page)).to be true
end
失败案例的结果(我已经包含了下一个测试,returns之后的每个测试都是一样的):
Failures:
1) signup_flow signup should submit signup form and open dwolla auth popup
Failure/Error: Unable to find matching line from backtrace
EOFError:
end of file reached
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read_nonblock'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:49:in `read'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/connection.rb:40:in `gets'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:283:in `check'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:210:in `command'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/browser.rb:38:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.5.1/lib/capybara/webkit/driver.rb:251:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/session.rb:103:in `reset!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `block in reset_sessions!'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `each'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara.rb:257:in `reset_sessions!'
# /home/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/rspec.rb:20:in `block (2 levels) in <top (required)>'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:287:in `instance_exec_with_rescue'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:356:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `each'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:410:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/hooks.rb:485:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:344:in `run_after_example'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:163:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:301:in `with_around_example_hooks'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example.rb:145:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:494:in `block in run_examples'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:490:in `run_examples'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:457:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `block in run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/example_group.rb:458:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `map'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:112:in `block in run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/reporter.rb:54:in `report'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:108:in `run_specs'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:86:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:70:in `run'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/lib/rspec/core/runner.rb:38:in `invoke'
# /home/xalio08/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rspec-core-3.0.4/exe/rspec:4:in `<top (required)>'
# /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `load'
# /home/xalio08/.rbenv/versions/2.1.4/bin/rspec:23:in `<main>'
#
# Showing full backtrace because every line was filtered out.
# See docs for RSpec::Configuration#backtrace_exclusion_patterns and
# RSpec::Configuration#backtrace_inclusion_patterns for more information.
2) signup_flow edit_details should not pass test with invalid dob
Failure/Error: Unable to find matching line from backtrace
Errno::EPIPE:
Broken pipe
# ./test/scripts/test_helper.rb:18:in `block (2 levels) in <top (required)>'
如有任何帮助,我们将不胜感激!即使是 debugging/logging 工具也会非常有用。
谢谢!
更新:
使用webkit_debug后,我确定是水豚重置浏览器时触发的错误。这是 webkit_debug 的输出:
Finished "Node.attribute" with response "Success(true)"
Wrote response true "true"
Received "Reset()"
Started "Reset()"
Aborting request to ""
should submit signup form and open auth popup (FAILED - 1)
Failures:
Capybara 默认行为是在每次测试后在 :after 挂钩中重置会话。 如堆栈跟踪中所示,此函数 (reset_sessions!) 使我的测试崩溃。
作为临时解决方案,我猴子修补了水豚Gem,以便我可以选择是否在测试后重置会话。
这是我的猴子补丁:
module Capybara
class << self
attr_accessor :keep_sessions
def reset_sessions!
unless Capybara.keep_sessions
session_pool.each { |mode, session| session.reset! }
end
end
alias_method :reset!, :reset_sessions!
end
end
之后,我只是在有问题的测试结束时执行 Capybara.keep_sessions=true
。它正在运行,错误已消失,但我知道这并不理想。
希望对您有所帮助!