Rspec 测试在 GitLab CI 中使用无头 Chrome 失败



我有以下规范代码用于测试用户登录功能。

feature "User login" do
context "using browser", :js => true do
before(:each) do
visit "/"
first(:link, "Login", visible: :any).click
end
scenario "with valid details" do
...
# rest of code.
end
end
end

它在我的本地机器中使用无头铬工作正常。这是我在spec_helper.rb中的Capybara javascript_driver配置。

Capybara.register_driver :headless_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 = :headless_chrome

但是不使用gitlab-ci,下面是我得到的错误。

失败/错误:第一个(:链接,"登录",可见::any)。单击

NoMethodError: undefined 方法 'click' for nil:NilClass./spec/features/user_login_spec.rb:6:in 'block (3 level) in '/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec/retry.rb:115:in "运行中的阻止"/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec/retry.rb:104:in "循环"/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec/retry.rb:104:in "跑"/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec_ext/rspec_ext.rb:12:in "run_with_retry">

我发现这个博客使用无头铬,但没有任何帮助。

以下是我正在使用的依赖项版本。

google-chrome-stable (63.0.3239.108-1)
chromedriver (2.34)

默认情况下,first没有等待/重试行为,这意味着如果匹配的链接在运行时不存在,它将不会等待一个链接出现。 此外,传递visible: :any以查找您将调用click的元素没有任何意义,因为您无法单击不可见的元素,因此也会导致错误。 如果您确实需要/想要使用first(多个匹配的链接,您无法缩小到一个),那么您应该使用

before(:each) do
visit "/"
first(:link, "Login", minimum: 1).click
end

minimum: 1选项将首先触发等待/重试最多Capybara.default_max_wait_time秒,以便匹配的链接显示在页面上。 这是使用firstall通常的原因之一 查找要与之实际交互的元素时的错误选择(除非您之前对某些内容进行了查找,以确保页面处于稳定状态,或者使用任何计数选项来触发等待/重试行为)。如果页面上实际上没有多个匹配的链接,那么您应该只使用

before(:each) do
visit "/"
click_link('Login') # same as find(:link, 'Login').click
end

最新更新