Ruby Capybara :: ExpectationNotMet:超时等待Selenium会话重置失败/错误

时间:2018-06-18 19:04:04

标签: ruby selenium selenium-webdriver capybara

我不断在我的Selenium会话未重启的CI上出现错误错误。我在本地运行测试时没遇到这个问题。它只发生在我的CI服务器上。

我正在使用Capybara 2.18.0,rspec 3.7.0,slenium-webdriver 3.9.0和site_prism 2.13。有吗

Capybara::ExpectationNotMet: Timed out waiting for Selenium session reset
Failure/Error: raise Capybara::ExpectationNotMet.new('Timed out waiting for Selenium session reset') if (Capybara::Helpers.monotonic_time - start_time) >= 10

Capybara::ExpectationNotMet:
  Timed out waiting for Selenium session reset
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/capybara-2.18.0/lib/capybara/selenium/driver.rb:145:in `reset!'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/capybara-2.18.0/lib/capybara/session.rb:127:in `reset!'
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/capybara-2.18.0/lib/capybara.rb:314:in `block in reset_sessions!'

我的spec_helper.rb看起来像这样:

require 'rspec'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'capybara/dsl'
require 'selenium-webdriver'
require 'site_prism'

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.save_path = "#{Dir.pwd}/screenshots"

Capybara.default_driver = :selenium

Capybara.app_host = ENV['url']

if ENV['timeout']
  Capybara.default_max_wait_time = ENV['timeout'].to_i
else
  Capybara.default_max_wait_time = 15
end

RSpec.configure do |config|
  config.full_backtrace = true

  config.before(:each) do
    config.include Capybara::DSL
  end

  config.after(:each) do |example|
    if example.exception
      name = example.example_group.to_s
      name.slice!('RSpec::ExampleGroups::')
      name.gsub!('::', '#')
      whole_page.save_screenshot("#{name}##{example.description.tr(' ', '_')}-#{Time.now.strftime('%H_%M_%S')}.png")
    end
  end
end

1 个答案:

答案 0 :(得分:2)

当Capybara重置驱动程序时,它会告诉浏览器转到about:blank,然后等待最多10秒,因为页面上没有与CSS' / html / body / *&匹配的元素#39 ;.在你的情况下,不会在10秒内发生。

这样做的一个原因可能是你的onunload处理程序在CI硬件上执行的操作时间超过10秒(或打开警报消息等)?如果是这种情况,则解决方法是让测试访问一个没有onunload处理程序的页面,并在测试结束时检查该页面上可见的内容(可能是阻止后保持测试清洁)。要验证的另一件事是Chrome和chromedriver的版本在本地和CI之间是相同的。