teamcapybara / capybara

Acceptance test framework for web applications
http://teamcapybara.github.io/capybara/
MIT License
10.01k stars 1.45k forks source link

Errno::EMFILE Too many open files error in #has_css? #2450

Closed 907th closed 3 years ago

907th commented 3 years ago

Meta

Capybara Version: 3.35.3 Driver Information (and browser if relevant): selenium-webdriver 3.142.7 Ruby: 2.7.2p137

Expected Behavior

el.has_css?(selector) must return false when no such selector found.

Actual Behavior

Line of code all_forms.to_a.find { |el| el.has_css?(selector) } raises #<Errno::EMFILE: Failed to open TCP connection to 127.0.0.1:9515 (Too many open files - socket(2) for "127.0.0.1" port 9515)> error.

I used this code to debug in console:

all_forms.to_a.find { |el|
  begin
    el.has_css?(selector)
  rescue => e
    puts el.inspect
    puts e.inspect
    puts e.backtrace.join("\n")
    break
  end
}

Output with backtrace:

Click me to show output... ``` # # /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/socksify-1.7.1/lib/socksify.rb:178:in `initialize' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/socksify-1.7.1/lib/socksify.rb:178:in `initialize' /Users/laise/.rvm/rubies/ruby-2.7.2/lib/ruby/2.7.0/net/http.rb:960:in `open' /Users/laise/.rvm/rubies/ruby-2.7.2/lib/ruby/2.7.0/net/http.rb:960:in `block in connect' /Users/laise/.rvm/rubies/ruby-2.7.2/lib/ruby/2.7.0/timeout.rb:78:in `timeout' /Users/laise/.rvm/rubies/ruby-2.7.2/lib/ruby/2.7.0/net/http.rb:958:in `connect' /Users/laise/.rvm/rubies/ruby-2.7.2/lib/ruby/2.7.0/net/http.rb:943:in `do_start' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/webmock-3.9.3/lib/webmock/http_lib_adapters/net_http.rb:136:in `start_with_connect_without_finish' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/webmock-3.9.3/lib/webmock/http_lib_adapters/net_http.rb:104:in `request' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:129:in `response_for' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:82:in `request' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:64:in `call' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:167:in `execute' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:305:in `execute_script' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/driver.rb:213:in `execute_script' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:137:in `execute_script' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:141:in `evaluate_script' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/selenium/node.rb:207:in `path' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/element.rb:567:in `inspect' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/queries/selector_query.rb:97:in `description' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/queries/selector_query.rb:106:in `applied_description' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/queries/selector_query.rb:171:in `failure_message' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/result.rb:114:in `failure_message' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:112:in `block in assert_selector' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:844:in `block in _verify_selector_result' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/base.rb:83:in `synchronize' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:843:in `_verify_selector_result' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:110:in `assert_selector' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:39:in `block in has_selector?' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:877:in `make_predicate' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:39:in `has_selector?' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/capybara-3.35.3/lib/capybara/node/matchers.rb:310:in `has_css?' (pry):10:in `block in form_with' (pry):8:in `each' (pry):8:in `find' (pry):8:in `form_with' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:290:in `eval' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:290:in `evaluate_ruby' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:659:in `handle_line' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:261:in `block (2 levels) in eval' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:260:in `catch' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:260:in `block in eval' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:259:in `catch' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_instance.rb:259:in `eval' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:77:in `block in repl' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:67:in `loop' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:67:in `repl' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:38:in `block in start' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/input_lock.rb:61:in `__with_ownership' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/input_lock.rb:78:in `with_ownership' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:38:in `start' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/repl.rb:15:in `start' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-0.13.1/lib/pry/pry_class.rb:191:in `start' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:117:in `block in resume_pry' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:30:in `block (2 levels) in run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/byebug-11.1.3/lib/byebug/helpers/eval.rb:94:in `allowing_other_threads' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:30:in `block in run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:29:in `catch' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:29:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:113:in `resume_pry' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/pry-byebug-3.9.0/lib/byebug/processors/pry_processor.rb:65:in `at_line' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/byebug-11.1.3/lib/byebug/context.rb:98:in `at_line' /Users/laise/Work/itowl/my-project/spec/features/user_profile_spec.rb:14:in `form_with' /Users/laise/Work/itowl/my-project/spec/features/user_profile_spec.rb:25:in `perform' /Users/laise/Work/itowl/my-project/spec/features/user_profile_spec.rb:34:in `block (2 levels) in ' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:262:in `instance_exec' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:262:in `block in run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:508:in `block in with_around_and_singleton_context_hooks' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:465:in `block in with_around_example_hooks' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:486:in `block in run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:626:in `block in run_around_example_hooks_for' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:350:in `call' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-rails-4.0.1/lib/rspec/rails/adapters.rb:75:in `block (2 levels) in ' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:455:in `instance_exec' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:455:in `instance_exec' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:390:in `execute_with' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:628:in `block (2 levels) in run_around_example_hooks_for' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:350:in `call' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/webmock-3.9.3/lib/webmock/rspec.rb:37:in `block (2 levels) in
' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:455:in `instance_exec' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:455:in `instance_exec' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:390:in `execute_with' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:628:in `block (2 levels) in run_around_example_hooks_for' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:350:in `call' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:629:in `run_around_example_hooks_for' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/hooks.rb:486:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:465:in `with_around_example_hooks' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:508:in `with_around_and_singleton_context_hooks' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example.rb:259:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example_group.rb:644:in `block in run_examples' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example_group.rb:640:in `map' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example_group.rb:640:in `run_examples' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/example_group.rb:606:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:121:in `map' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/configuration.rb:2061:in `with_suite_hooks' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:116:in `block in run_specs' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/reporter.rb:74:in `report' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:115:in `run_specs' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:89:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:71:in `run' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/lib/rspec/core/runner.rb:45:in `invoke' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/gems/rspec-core-3.9.3/exe/rspec:4:in `' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/bin/rspec:23:in `load' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/bin/rspec:23:in `
' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/bin/ruby_executable_hooks:24:in `eval' /Users/laise/.rvm/gems/ruby-2.7.2@my-project/bin/ruby_executable_hooks:24:in `
' ```

Steps to reproduce

Do not know how to reproduce it locally. I only see this error on my local PC.

May be related to #2238

907th commented 3 years ago

I was able to resolve the issue by increasing the default MacOS open files limit (256) to 1024 in the shell where I run tests with ulimit -Sn 1024 command:

$ ulimit -Sn
256 # a default limit
$ rspec ./spec/features/myspec.rb
<Errno::EMFILE error>
$ ulimit -Sn 1024 # increase default limit
$ rspec ./spec/features/myspec.rb
<Success!>