【问题标题】:Capybara session not closing at end of testCapybara 会话未在测试结束时关闭
【发布时间】:2018-02-28 20:47:15
【问题描述】:

我有一系列使用 selenium/capybara/rspec 的自动化测试。对于我的一个测试,我正在弄脏一个表单并验证是否触发了某些错误。到此测试结束...问题是当测试运行完毕后,代码会尝试关闭浏览器,会弹出一条 JavaScript 消息,其中包含 This page is asking you to confirm that you want to leave - data you have entered may not be saved.

在我的规范助手中,我有:

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

Capybara.default_driver = :firefox
Capybara.app_host = ********* #redacted
Capybara.default_max_wait_time = 5

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

  config.after(:each) do
    Capybara.reset_sessions!
  end
end

并且使用Capybara::ExpectationNotMet: Timed out waiting for Selenium session reset 测试失败

如何让测试最后关闭浏览器?

【问题讨论】:

    标签: ruby selenium selenium-webdriver rspec capybara


    【解决方案1】:

    您没有指明您正在使用的浏览器和浏览器版本(例如 FF 59 最近进行了一项更改,使得处理卸载模式更难处理),也没有指明您使用的任何其他测试 gem 版本重新使用,因此很难说您当前的问题是否会通过升级来解决(可能)。但是,您可以在知道将出现卸载模式的测试中通过添加来解决此问题

    accept_confirm do
      visit("about:blank") # or any page in your app that doesn't have an unload modal ( / for instance )
    end
    

    到这些特定测试结束。如果您想保持实际测试代码的清洁,这可以在功能上的元数据触发的 after 块中实现。要通过元数据实现它,您需要将 RSpec 配置块更改为类似

    RSpec.configure do |config|
      config.before(:each) do
        config.include Capybara::DSL
      end
    
      config.after(:each, clear_unload_modal: true) do
        accept_confirm do # may need to be Capybara.current_session.accept_confirm depending on your includes
          visit("/") # may need to be Capybara.current_session.visit
        end
      end
    
      config.after(:each) do
        Capybara.reset_sessions!
      end
    end
    

    然后用 :clear_unload_modal 标记每个需要它的测试

    scenario "blah blah", :clear_unload_modal do
      ....
    end
    

    【讨论】:

    • 在问题中添加了一些可能更好地解决问题的内容。
    • @Zack 你还没有说明你使用的是什么版本的 FF - 如果是 59,那么你需要使用 Capybara 的 master 分支才能在没有你做任何其他事情的情况下工作。您是否尝试在弹出问题的测试结束时调用我的答案中的代码?
    • 我使用的是 58.0.2 64 位。该代码确实有效,但它要求我在以这种方式结束的每个测试结束时插入该代码。这感觉像是一种处理问题的 hacky 方式。不过我很欣赏这个解决方案。
    • @Zack 如果您使用的是最新的 geckodriver 和 capybara(它在 Capybara 测试套件中经过专门测试),这应该不是 FF 58 的问题。至于代码的工作,正如我在回答中所说,如果你将它放在由元数据触发的 after 块中,你实际上不需要在每个测试结束时插入它,我已经扩展了我的答案以说明这一点一步一步来。
    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多