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

Capybara with headless chrome doesn't clear session between test cases which use different subdomains

我将 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

知道为什么 capybara/headless chrome 在导航到另一个域时不清除测试用例之间的用户会话吗?

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

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  

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

添加清除 cookies 的步骤后,session 也不起作用。我在 env.rb 中添加了以下代码,以便每次都开始新的会话以进行新的测试

也许你可以试试这个。

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

After do
  Capybara.current_session.driver.quit
end

此外,您可以添加 chrome 选项以隐身打开会话 window

我发现此线程在反向上下文中很有用。我有一个测试设置,其中我将会话凭证存储在本地存储中。因此,从 capybara v3.11 升级到 v3.12 破坏了套件,以至于只有第一个场景会通过,而其余场景每次都会在登录页面上失败。 那是因为根据 capybara 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)