使用Headless Chrome的GitLab CI中的Rspec测试失败

问题描述 投票:0回答:1

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

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,下面是我得到的错误。

失败/错误:首先(:链接,“登录”,可见::任何).click

NoMethodError:未定义的方法'click'为nil:NilClass ./spec/features/user_login_spec.rb:6:''block(3级)in'/usr/local/bundle/gems/rspec-retry-0.5.6/lib /rspec/retry.rb:115:in'block in run'/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec/retry.rb:104:in'loop'/ usr / local /bundle/gems/rspec-retry-0.5.6/lib/rspec/retry.rb:104:in'run'/usr/local/bundle/gems/rspec-retry-0.5.6/lib/rspec_ext/rspec_ext。 rb:12:在'run_with_retry'中

我发现this blog使用无头铬,但没有任何帮助。

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

google-chrome-stable (63.0.3239.108-1)
chromedriver (2.34)
ruby-on-rails selenium-webdriver capybara gitlab-ci google-chrome-headless
1个回答
1
投票

默认情况下,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
© www.soinside.com 2019 - 2024. All rights reserved.