在 Alpine Linux 上使用无头 Chrome/Chromium 的 Rspec

Sig*_*Sig 12 rspec ruby-on-rails alpine-linux

在 Alpine 3.10.1 上,我尝试使用headless_chrome.

 config.before(:each, type: :system, js: true) do
    driven_by :selenium, using: :headless_chrome
  end
Run Code Online (Sandbox Code Playgroud)

我已经安装capybara和webdrivers.

由于我还没有找到Chrome在 Alpine上安装的方法,我尝试过Chromium(76.0.3809.87-r0)。但是,当我运行规范时,它找不到驱动程序。

ChildProcess::LaunchError: 没有那个文件或目录 - /root/.webdrivers/chromedriver

我也试过chromium-chromedriver直接通过 apk安装,但结果是一样的。

有没有安装方式Chrome上高山,或使用Chromium与Capybara?

Jas*_*ett 5

要使其发挥作用,需要三件事:

  1. 使用 selenium-webdriver 而不是 webdrivers
  2. 在 Docker 镜像上安装 chromium、chromium-chromedriver 和 selenium
  3. 配置水豚驱动程序

详细信息如下。

使用 selenium-webdriver 而不是 webdrivers

如果您碰巧在您的 中使用 webdrivers gem Gemfile,请将其替换为selenium-webdriver.

在 Docker 镜像上安装 chromium、chromium-chromedriver 和 selenium

更改您的Dockerfile以便安装以下软件包:

chromium chromium-chromedriver python3 python3-dev py3-pip
Run Code Online (Sandbox Code Playgroud)

然后,在此之后,包括行RUN pip3 install -U selenium.

下面是完整的示例Dockerfile。

FROM ruby:2.7.2-alpine AS builder

RUN apk add --no-cache \
    build-base libffi-dev \
    nodejs yarn tzdata \
    postgresql-dev postgresql-client zlib-dev libxml2-dev libxslt-dev readline-dev bash \
    #
    # For testing
    chromium chromium-chromedriver python3 python3-dev py3-pip \
    #
    # Nice-to-haves
    git vim \
    #
    # Fixes watch file issues with things like HMR
    libnotify-dev

RUN pip3 install -U selenium

FROM builder AS development

# Add the current apps files into docker image
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install any extra dependencies via Aptfile - These are installed on Heroku
# COPY Aptfile /usr/src/app/Aptfile
# RUN apk add --update $(cat /usr/src/app/Aptfile | xargs)

ENV PATH /usr/src/app/bin:$PATH

# Install latest bundler
RUN bundle config --global silence_root_warning 1

EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]

FROM development AS production

COPY Gemfile /usr/src/app
COPY .ruby-version /usr/src/app
COPY Gemfile.lock /usr/src/app

COPY package.json /usr/src/app
COPY yarn.lock /usr/src/app

# Install Ruby Gems
RUN bundle config set deployment 'true'
RUN bundle config set without 'development:test'
RUN bundle check || bundle install --jobs=$(nproc)

# Install Yarn Libraries
RUN yarn install --check-files

# Copy the rest of the app
COPY . /usr/src/app

# Precompile the assets
RUN RAILS_SERVE_STATIC_FILES=enabled SECRET_KEY_BASE=secret-key-base RAILS_ENV=production RACK_ENV=production NODE_ENV=production bundle exec rake assets:precompile

# Precompile Bootsnap
run RAILS_SERVE_STATIC_FILES=enabled SECRET_KEY_BASE=secret-key-base RAILS_ENV=production RACK_ENV=production NODE_ENV=production bundle exec bootsnap precompile --gemfile app/ lib/
Run Code Online (Sandbox Code Playgroud)

配置水豚驱动程序

将以下内容放入spec/support/chrome.rb.

# spec/support/chrome.rb

driver = :selenium_chrome_headless

Capybara.server = :puma, {Silent: true}

Capybara.register_driver driver do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument("--headless")
  options.add_argument("--no-sandbox")
  options.add_argument("--disable-dev-shm-usage")
  options.add_argument("--window-size=1400,1400")

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = driver

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by driver
  end
end
Run Code Online (Sandbox Code Playgroud)

我在关于这个主题的博客文章中写了更多细节。