Session 水豚与无头铬不';t清除使用不同子域的测试用例之间的会话

Session 水豚与无头铬不';t清除使用不同子域的测试用例之间的会话,session,selenium-webdriver,capybara,google-chrome-headless,Session,Selenium Webdriver,Capybara,Google Chrome Headless,我将rails测试从capybara webkit切换到无头chrome。当我运行一个不访问默认Capybara主机的测试时,第一个测试通过,但第二个测试失败,因为用户在尝试登录时已经登录 我使用的是chromedriver v2.45、selenium webdriver(3.141.0)和capybara(2.18.0) 我有以下设置: require 'selenium-webdriver' Capybara.register_driver :chrome do |app| opti

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

我使用的是chromedriver v2.45、selenium 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
其中
使用应用程序\u主机

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不清理测试用例之间的用户会话吗?

你是否将会话信息存储在浏览器
窗口中。本地存储
和/或
窗口。会话存储
?如果是这样,您可以通过传递给驱动程序的选项将这些设置为清除(注意:这些设置是Capybara 3.12+中selenium驱动程序的默认设置)


就连我也面临着同样的问题

添加清除Cookie的步骤后,会话也不起作用。我在env.rb中添加了以下代码,以便每次为新测试启动新会话

也许你可以试试这个

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

After do
  Capybara.current_session.driver.quit
end

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

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

在注册驱动程序时,我更新了套件,将clear_local_存储和clear_session_存储显式设置为false

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

嗨,Thomas,我试图添加
清除本地存储:true,清除会话存储:true
,但没有帮助。似乎只有当规范案例使用不同的主机(而不是默认的Capybara主机)时,问题才会重现。我更新了question@Hirurg103您确定本地/会话存储中存储的信息实际上是您的问题吗?假设您实际将信息存储在本地或会话存储中,则当会话重置时,Capybara只能重置其所在子域的存储。如果您需要为其他子域清除它,您需要手动访问它们并调用
page.driver.browser.local\u storage/session\u storage.clear
(特定于硒)-也不是在Capybara 3.12中的默认行为
clear\u local\u storage:true,clear\u session\u storage:true
set@Hirurg103也,如果root.lvh.me上的本地/会话存储确实需要重置(并且在另一个.lvh.me上不需要重置任何内容),另一个选项是在结束测试之前访问root.lvh.me/whatever上的页面-因此,当Capybara重置会话时,这是活动子域。嗨,Thomas,实际上,我将水豚升级到了
v3.12
,问题已经解决了。在我使用水豚
v2.18
之前。现在,在我访问
http://another.lvh.me
。另外,我不需要使用
Capybara.reset\u会话重置会话在每个测试用例之后。可能水豚
v2.18
chrome-72.0.3626.28-beta
chromedriver-2.45
不完全兼容,并且无法正确重置会话?你怎么看?@hiurg103-Capybara 3.12默认情况下更改为清除会话和本地存储,使用Chrome可以清除所有域的Cookie(纯webdriver只能清除当前域的Cookie,但Capybara在使用Chrome时会做一些特殊的事情)。您的问题可能与会话/本地存储无关,完全是基于cookie的。嗨,Kiran,我尝试了您的解决方案,但没有帮助。在规范案例中,似乎只有当用户访问另一个主机(而不是默认的Capybara应用程序主机)时,问题才会重现。我相应地更新了问题
Capybara.register_driver :selenium_chrome do |app|
    Capybara::Selenium::Driver.new(app, 
                                   browser: :chrome, 
                                   clear_local_storage: false, 
                                   clear_session_storage: false)