我在码头工人的容器中进行了水豚测试。我用它来设置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实例。
我该怎么办?
我对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
答案 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'
设置为绑定到所有可用接口,或指定特定的外部接口。