Ruby Cucumber测试无@javascript标签时触发Selenium Net::ReadTimeout问题
最终解决结果
我选择放弃,直接完整重装了WSL2及所有相关环境,问题成功解决。如果您遇到了相同问题,硬重置环境是可行的解决方案。
问题背景
我已查阅过大量Stack Overflow过往帖子,其中的主流解决方案为:延长内部超时时间,给浏览器预留超出默认60秒的页面加载时长。
我运行的Cucumber测试体量很小(基准测试仅包含4个场景16个步骤),不使用Selenium时几乎瞬间就能通过,页面大多是静态内容,我后续测试仅需要查看运行过程和处理弹窗,不需要更长的加载时间。
这些测试几个月前(6月)还能完全正常运行,现在重新打开完全未修改的同一份代码仓库,所有带Selenium的测试都无法运行,执行时甚至不会打开浏览器。我判断问题与项目配置无关,因为配置没有任何变动。我已经尝试卸载并重装所有gems、更新依赖,均无效果。我完全通过WSL2开发该应用,上次打开这个项目后没有修改过WSL2配置,不清楚有什么本地系统设置或环境变量发生了变动。
我对Capybara仅做了一项配置:在env.rb文件中测试期间将Capybara.javascript_driver设为:selenium或:selenium_headless,其余全部使用默认配置。所用Firefox与geckodriver版本互相兼容。
版本信息
- Ubuntu - 20.04.1 LTS
- Ruby - 2.5.3
- Firefox - 92.0
- Geckodriver - 0.29.1
- xfce4 - 4.14(执行
apt list -a xfce4获取版本号,运行xfce4-about时报错:17:02:48.578: No vendor information found in "/usr/share/xfce4/vendorinfo"。)
相关依赖Gem
- selenium-webdriver (4.0.0.rc1)
- webdriver (0.18.0)
- cucumber (7.0.0)
- cucumber-rails (2.4.0)
日志信息
将geckodriver日志级别设为trace后,单个Cucumber场景的运行日志如下:
2021-09-15 17:42:19 DEBUG Selenium Executing Process ["/usr/bin/geckodriver", "--port=4444"] 2021-09-15 17:42:19 DEBUG Selenium polling for socket on ["127.0.0.1", 4444] 1631752939382 geckodriver INFO Listening on 127.0.0.1:4444 2021-09-15 17:42:19 WARN Selenium [DEPRECATION] [:browser_options] :options as a parameter for driver initialization is deprecated. Use :capabilities with an Array of value capabilities/options if necessary instead. 2021-09-15 17:42:19 INFO Selenium -> POST session 2021-09-15 17:42:19 INFO Selenium >>> http://127.0.0.1:4444/session | {"capabilities":{"alwaysMatch":{"browserName":"firefox","moz:firefoxOptions":{"log":{"level":"trace"}}}}} 2021-09-15 17:42:19 DEBUG Selenium > {"Accept"=>"application/json", "Content-Type"=>"application/json; charset=UTF-8", "User-Agent"=>"selenium/4.0.0.rc1 (ruby linux)", "Content-Length"=>"105"} 1631752939650 mozrunner::runner INFO Running command: "/usr/bin/firefox" "--marionette" "-no-remote" "-profile" "/tmp/rust_mozprofileqR2HiM" 1631752939651 geckodriver::marionette DEBUG Waiting 60s to connect to browser on 127.0.0.1:46793 Net::ReadTimeout (Net::ReadTimeout) /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/protocol.rb:181:in `rbuf_fill' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/protocol.rb:157:in `readuntil' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/protocol.rb:167:in `readline' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http/response.rb:40:in `read_status_line' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http/response.rb:29:in `read_new' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http.rb:1494:in `block in transport_request' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http.rb:1491:in `catch' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http.rb:1491:in `transport_request' /usr/share/rvm/rubies/ruby-2.5.3/lib/ruby/2.5.0/net/http.rb:1464:in `request' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/remote/http/default.rb:124:in `response_for' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/remote/http/default.rb:77:in `request' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/remote/http/common.rb:59:in `call' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/remote/bridge.rb:589:in `execute' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/remote/bridge.rb:52:in `create_session' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/common/driver.rb:338:in `create_bridge' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/common/driver.rb:73:in `initialize' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/common/driver.rb:53:in `new' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver/common/driver.rb:53:in `for' /usr/share/rvm/gems/ruby-2.5.3/gems/selenium-webdriver-4.0.0.rc1/lib/selenium/webdriver.rb:87:in `for' /home/nacho/Github/cs370/features/support/env.rb:18:in `<top (required)>' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/glue/registry_and_more.rb:121:in `require' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/glue/registry_and_more.rb:121:in `load_code_file' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime/support_code.rb:142:in `load_file' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime/support_code.rb:81:in `block in load_files!' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime/support_code.rb:80:in `each' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime/support_code.rb:80:in `load_files!' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime.rb:260:in `load_step_definitions' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/runtime.rb:72:in `run!' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/lib/cucumber/cli/main.rb:29:in `execute!' /usr/share/rvm/gems/ruby-2.5.3/gems/cucumber-7.0.0/bin/cucumber:9:in `<top (required)>' /usr/share/rvm/gems/ruby-2.5.3/bin/cucumber:23:in `load' /usr/share/rvm/gems/ruby-2.5.3/bin/cucumber:23:in `<main>' /usr/share/rvm/gems/ruby-2.5.3/bin/ruby_executable_hooks:24:in `eval' /usr/share/rvm/gems/ruby-2.5.3/bin/ruby_executable_hooks:24:in `<main>'
已尝试排查操作
我已仔细查阅日志,搜索了相关术语和报错行,暂时没有找到可操作的解决方案。此前尝试过以下操作:
- 访问
127.0.0.1:35213等每次测试随机变动的端口,可以正常打开我的应用 - 尝试访问测试期间固定的监听套接字如
127.0.0.1:4487和127.0.0.1:4487/session,要么无法加载,要么返回仅包含文字HTTP method not allowed的空白HTML页面
内容的提问来源于stack exchange,提问作者Austin Wangyu
相关产品推荐
相关产品推荐

