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