WebMock拦截Selenium删除会话请求问题求助
系统环境
- Ruby v2.6
- WebMock gem v3.18.1
- Selenium Webdriver gem v4.1.0
- RSpec gem v3.11.0
- Capybara gem v3.36.0
问题概述
在GitLab CI上运行测试套件时,所有测试均通过,但WebMock拦截了Capybara的Selenium驱动发起的删除会话请求。
743个测试用例,0失败,30个待定
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/webmock-3.18.1/lib/webmock/http_lib_adapters/net_http.rb:104:in
`request': Real HTTP connections are disabled. Unregistered request:
DELETE
http://selenium__standalone-chrome:4444/wd/hub/session/0146cfc5158d585f445cfcdbda289733
错误出现在测试运行完成后,但RSpec输出出现换行,怀疑错误实际发生在测试执行期间。
已在spec/support/capybara.rb中配置允许包含selenium或session的URL连接:
selenium_session_requests = %r{/((__.+__)|(hub/session.*))$} allowed_connections = [ '0.0.0.0', '127.0.0.1', 'https://chromedriver.storage.googleapis.com', 'localhost', /selenium/, selenium_session_requests ].freeze RSpec.configure do |config| config.before(:suite) do WebMock.enable! end config.after(:suite) do WebMock.disable! end Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}" Capybara.javascript_driver = ENV.fetch('CAPYBARA_JAVASCRIPT_DRIVER', :chrome_headless).to_sym WebMock.disable_net_connect!(allow: allowed_connections, net_http_connect_on_start: allowed_connections) end
曾在before(:suite)块中确认,类似http://selenium__standalone-chrome:4444/wd/hub/session/0146cfc5158d585f445cfcdbda289733的会话URL会被WebMock允许。按照提示尝试stub该请求(本无需此操作),但仍出现相同错误。
当前现象
WebMock阻止Selenium驱动关闭浏览器。
期望结果
浏览器正常关闭,无错误抛出。
GitLab CI配置
在.gitlab-ci.yml中配置了Selenium的Docker服务:
image: ruby:2.6 services: - postgres:10.1 - selenium/standalone-chrome:latest - redis:latest
该服务的URL通过环境变量暴露给测试:
- export SELENIUM_REMOTE_URL="http://selenium__standalone-chrome:4444/wd/hub"
完整错误输出
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/webmock-3.18.1/lib/webmock/http_lib_adapters/net_http.rb:104:in
request': Real HTTP connections are disabled. Unregistered request: DELETE http://selenium__standalone-chrome:4444/wd/hub/session/0146cfc5158d585f445cfcdbda289733 with headers {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json; charset=UTF-8', 'User-Agent'=>'selenium/4.1.0 (ruby linux)'} (WebMock::NetConnectNotAllowedError) You can stub this request with the following snippet: stub_request(:delete, "http://selenium__standalone-chrome:4444/wd/hub/session/0146cfc5158d585f445cfcdbda289733"). with( headers: { 'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json; charset=UTF-8', 'User-Agent'=>'selenium/4.1.0 (ruby linux)' }). to_return(status: 200, body: "", headers: {}) ============================================================ from /builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/remote/http/default.rb:124:inresponse_for' from
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/remote/http/default.rb:77:inrequest' from /builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/remote/http/common.rb:59:incall' from
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/remote/bridge.rb:588:inexecute' from /builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/remote/bridge.rb:188:inquit' from
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/selenium-webdriver-4.1.0/lib/selenium/webdriver/common/driver.rb:181:inquit' from /builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/capybara-3.36.0/lib/capybara/selenium/driver.rb:293:inquit' from
/builds/abelsoninfo/aws/pips/pips-console/vendor/ruby/ruby/2.6.0/gems/capybara-3.36.0/lib/capybara/selenium/driver.rb:512:in
`block in setup_exit_handler'
内容的提问来源于stack exchange,提问作者James

