无头 chrome 的水豚不会清除使用不同子域的测试用例之间的会话
Capybara with headless chrome doesn't clear session between test cases which use different subdomains
我将 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
其中 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)
我将 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
其中 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)