我将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
有什么主意,为什么导航到另一个域时水豚/无头Chrome无法清理测试用例之间的用户会话?
答案 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)