使用docker和Capybara

时间:2017-10-18 13:15:46

标签: selenium docker capybara

我在码头工人的容器中进行了水豚测试。我用它来设置selenium:

Capybara.register_driver :selenium do |app|
  require 'selenium/webdriver'
  Selenium::WebDriver::Firefox::Binary.path = ENV['FIREFOX_BINARY_PATH'] || Selenium::WebDriver::Firefox::Binary.path
  Capybara::Selenium::Driver.new(app, :browser => :firefox)
end

当我们使用xvfb运行测试时,它可以工作,但我希望在测试运行时看到真正的浏览器,所以我正在寻找一种在主机中使用浏览器的方法。

我认为可以在主机上启动geckodriver并共享端口4444,但我还没有成功。 Capybara每次都会在容器上发布一个新的geckodriver实例。

我该怎么办?

编辑1:添加更多信息

我对capybara的所有配置都是:

#<Capybara::SessionConfig:0x0055ce67731a00
 @always_include_port=false,
 @app_host="http://domain-test.engagement.lvh.me:1300",
 @automatic_label_click=false,
 @automatic_reload=true,
 @default_host="http://www.example.com",
 @default_max_wait_time=5,
 @default_selector=:css,
 @enable_aria_label=false,
 @exact=false,
 @exact_text=false,
 @ignore_hidden_elements=true,
 @match=:smart,
 @raise_server_errors=true,
 @run_server=true,
 @save_path=#<Pathname:/app/tmp/capybara>,
 @server_errors=[StandardError],
 @server_host=nil,
 @server_port=1300,
 @visible_text_only=false,
 @wait_on_first_by_default=false>

这是我的docker-compose文件:

version: '3'
services:
  web:
    build: .
    command: rails s -b 0.0.0.0
    working_dir: /app
    volumes:
      - .:/app
      - ./tmp/bundle:/usr/local/bundle
      - $SSH_AUTH_SOCK:/ssh-agent
    environment:
      - BUNDLE_JOBS=4
      - SSH_AUTH_SOCK=/ssh-agent
      - MONGO_HOST=mongo
      - REDIS_HOST=redis
      - MEMCACHE_HOST=memcache
    ports:
      - "80:3000"
      - "1300:1300"
    links:
      - mongo
      - redis
      - memcache

  mongo:
    image: mongo:3.4.9
    volumes:
      - ~/data/mongo/db:/data/db

  redis:
    image: redis:2.8.17
    volumes:
      - ~/data/redis:/data

  memcache:
    image: memcached:1.5-alpine

最后我的Dockerfile:

FROM ruby:2.3.1

RUN apt-get update && apt-get install -y build-essential qt5-default \
  libqt5webkit5-dev gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-x \
  xvfb rsync

ARG GECKODRIVER_VERSION=0.19.0
RUN wget --no-verbose -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v$GECKODRIVER_VERSION/geckodriver-v$GECKODRIVER_VERSION-linux64.tar.gz \
  && rm -rf /opt/geckodriver \
  && tar -C /opt -zxf /tmp/geckodriver.tar.gz \
  && rm /tmp/geckodriver.tar.gz \
  && mv /opt/geckodriver /opt/geckodriver-$GECKODRIVER_VERSION \
  && chmod 755 /opt/geckodriver-$GECKODRIVER_VERSION \
  && ln -fs /opt/geckodriver-$GECKODRIVER_VERSION /usr/bin/geckodriver

RUN apt-get install -y libgtk-3-dev \
  && wget --no-verbose https://ftp.mozilla.org/pub/firefox/releases/56.0/linux-x86_64/en-US/firefox-56.0.tar.bz2 \
  && tar -xjf firefox-56.0.tar.bz2 \
  && mv firefox /opt/firefox56 \
  && ln -s /opt/firefox56/firefox /usr/bin/firefox

ENV TZ Europe/Paris
RUN echo $TZ > /etc/timezone && \
    apt-get update && apt-get install -y tzdata && \
    dpkg-reconfigure -f noninteractive tzdata && \
    apt-get clean

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 && \
    echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list && \
    apt-get update && \
    apt-get install -y mongodb-org

RUN gem install bundler

RUN mkdir /app
WORKDIR /app

1 个答案:

答案 0 :(得分:1)

为了让Selenium使用远程geckodriver实例,您需要为其提供url选项。

Capybara.register_driver :selenium do |app|
  require 'selenium/webdriver'
  Capybara::Selenium::Driver.new(app, :browser => :firefox, url: 'http://<your ip as reachable from docker>:<port geckodriver is available on>')
end

这将要求您在想要运行firefox的计算机上运行geckodriver,可能使用--binary选项指定firefox所在的位置。它还可能需要设置Capybara.app_host(以及可能Capybara.always_include_port,具体取决于您的确切配置),以便将浏览器请求路由回在docker实例上运行的测试中的应用程序。

需要考虑的另一件事是AUT需要绑定到docker实例上可从主机访问的接口。默认情况下,Capybara绑定到127.0.0.1接口,该接口可能无法访问,因此您可以将Capybara.server = '0.0.0.0'设置为绑定到所有可用接口,或指定特定的外部接口。