我有以下用于测试用户登录功能的规范代码。
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:未定义的方法'点击'为零:NilClass ./spec/features/user_login_spec.rb:6:in'阻止(3级)' /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'
我发现this blog使用无头镀铬但没有任何帮助。
以下是我正在使用的依赖项版本。
google-chrome-stable (63.0.3239.108-1)
chromedriver (2.34)
答案 0 :(得分:1)
默认情况下,first
没有等待/重试行为,这意味着如果匹配链接在运行时不存在,则不会等待一个链接出现。另外,传递visible: :any
以查找您将要调用click
的元素没有任何意义,因为您无法单击不可见的元素,因此也会导致错误。如果你确实需要/想要使用first
(多个匹配的链接,你不能将其范围缩小到一个)那么你应该使用
before(:each) do
visit "/"
first(:link, "Login", minimum: 1).click
end
minimum: 1
选项将首先触发等待/重试最多Capybara.default_max_wait_time
秒,以便在页面上显示匹配的链接。这是使用first
和all
的原因之一
在寻找实际与之交互的元素时的错误选择(除非您已经完成了先前的查找以确保页面处于稳定状态,或使用任何计数选项来触发等待/重试行为)。如果页面上实际上没有多个匹配链接,那么您应该只使用
before(:each) do
visit "/"
click_link('Login') # same as find(:link, 'Login').click
end