带有无头chrome的水豚无法清除使用不同子域的测试用例之间的会话

时间:2018-11-20 09:52:44

标签: session selenium-webdriver capybara google-chrome-headless

我将Rails测试从capybara-webkit切换到了无头Chrome。当我运行不访问默认Capybara主机的测试时,第一种情况通过了,但是第二种情况失败了,因为用户在尝试登录时已经登录了

我使用chromedriver v2.45selenium-webdriver (3.141.0)capybara (2.18.0)

我有以下设置:

require 'selenium-webdriver'

Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new(
    args: %w[headless disable-gpu no-sandbox]
  )
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :chrome

访问另一个域后,我试图将应用程序主机更改为默认域

using_app_host("http://another.lvh.me") do
  visit '/'

  # do something
end

using_app_host

def using_app_host(host)
  original_host = Capybara.app_host
  Capybara.app_host = host
  yield
ensure
  Capybara.app_host = original_host
end

但这没有帮助。

规格结构如下:

feature "Use another subdomain", js: true do
  before { login } # use default Capybara app host http://root.lvh.me

  scenario "case 1" do
    using_app_host("http://another.lvh.me") do
      # do something
    end
  end

  scenario "case 2" do
    using_app_host("http://another.lvh.me") do
      # do something else
    end
  end
end

有什么主意,为什么导航到另一个域时水豚/无头Chrome无法清理测试用例之间的用户会话?

3 个答案:

答案 0 :(得分:1)

您是否将会话信息存储在浏览器window.localStorage和/或window.sessionStorage中?如果是这样,您可以通过传递给驱动程序的选项设置清除这些内容(注意:这些设置是Capybara 3.12+中硒驱动程序的默认设置)

Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new(args: %w[no-sandbox])
  options.headless!
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options, clear_local_storage: true, clear_session_storage: true)
end  

答案 1 :(得分:0)

即使我面临着同样的问题。

添加清除Cookie的步骤后,会话也无法正常工作。我在env.rb中添加了以下代码,以便每次进行新测试时都开始一个新会话

也许您可以尝试一下。

Before do
  Capybara.session_name = ":session_#{Time.zone.now.to_i}" 
end

After do
  Capybara.current_session.driver.quit
end

此外,您可以添加chrome选项以在隐身窗口中打开会话

答案 2 :(得分:0)

我发现此线程在反向上下文中很有用。我有一个测试设置,其中我将会话凭据存储在本地存储中。因此,从capybara v3.11升级到v3.12破坏了该套件,使得每次登录时只有第一个方案通过,其余方案都会失败。 这是因为根据水豚3.12的默认行为清除了本地存储空间

我更新了我的套件,以在注册驱动程序时将clear_local_storage和clear_session_storage显式设置为false。

Capybara.register_driver :selenium_chrome do |app|
    Capybara::Selenium::Driver.new(app, 
                                   browser: :chrome, 
                                   clear_local_storage: false, 
                                   clear_session_storage: false)