我已经将Docker配置为使用docker-compose.yml运行Postgres和Django,它运行良好。
我遇到的问题是硒无法连接到Django直播服务器。
现在(至少对我来说)django必须访问selenium才能控制浏览器,而selenium必须访问django才能访问服务器。
我尝试使用docker大使模式,使用以下配置从这里docker-compose.yml:https://github.com/docker/compose/issues/666
postgis:
dockerfile: ./docker/postgis/Dockerfile
build: .
container_name: postgis
django-ambassador:
container_name: django-ambassador
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name django -name selenium"
django:
dockerfile: ./docker/Dockerfile-dev
build: .
command: python /app/project/manage.py test my-app
container_name: django
volumes:
- .:/app
ports:
- "8000:8000"
- "8081:8081"
links:
- postgis
- "django-ambassador:selenium"
environment:
- SELENIUM_HOST=http://selenium:4444/wd/hub
selenium:
container_name: selenium
image: selenium/standalone-firefox-debug
ports:
- "4444:4444"
- "5900:5900"
links:
- "django-ambassador:django"
当我检查时http://DOCKER-MACHINE-IP:4444/wd/hub/static/resource/hub.html我可以看到firefox启动了,但所有测试都失败了,因为firefox无法连接到django
'Firefox can't establish a connection to the server at localhost:8081'
我也在这里尝试了这个解决方案https://github.com/docker/compose/issues/1991但是这不起作用,因为我无法让django同时连接到postgis和selenium
'django.db.utils.OperationalError: could not translate host name "postgis" to address: Name or service not known'
我试着使用下面列出的网络功能
postgis:
dockerfile: ./docker/postgis/Dockerfile
build: .
container_name: postgis
net: appnet
django:
dockerfile: ./docker/Dockerfile-dev
build: .
command: python /app/project/manage.py test foo
container_name: django
volumes:
- .:/app
ports:
- "8000:8000"
- "8081:8081"
net: appnet
environment:
- SELENIUM_HOST=http://selenium:4444/wd/hub
selenium:
container_name: selenium
image: selenium/standalone-firefox-debug
ports:
- "4444:4444"
- "5900:5900"
net: appnet
但结果是一样的
'Firefox can't establish a connection to the server at localhost:8081'
那么,如何让selenium连接到django?
我已经玩了几天了-非常感谢任何帮助。
更多信息
另一件奇怪的事情是,当testserver运行时,如果我运行,则不使用docker(使用我以前的virtualenv配置等)/管理py test foo我可以通过以下位置的任何浏览器访问服务器:http://localhost:8081并获得服务的网页,但我无法访问测试服务器时,我运行等效的命令,如果我在docker下运行它。这很奇怪,因为我正在映射端口8081:8081-这有关系吗?
注意:我使用的是OSX和Docker v1.9.1
我也一直在努力解决这个问题,最终我找到了一个对我有效的解决方案。您可以尝试以下方式:
postgis:
dockerfile: ./docker/postgis/Dockerfile
build: .
django:
dockerfile: ./docker/Dockerfile-dev
build: .
command: python /app/project/manage.py test my-app
volumes:
- .:/app
ports:
- "8000:8000"
links:
- postgis
- selenium # django can access selenium:4444, selenium can access django:8081-8100
environment:
- SELENIUM_HOST=http://selenium:4444/wd/hub
- DJANGO_LIVE_TEST_SERVER_ADDRESS=django:8081-8100 # this gives selenium the correct address
selenium:
image: selenium/standalone-firefox-debug
ports:
- "5900:5900"
我认为您不需要在selenium配置中包括端口4444。默认情况下,该端口是公开的,不需要将其映射到主机,因为django容器可以通过其到selenium容器的链接直接访问它。
[编辑]我发现您也不需要显式公开django容器的8081端口。此外,我为测试服务器使用了一系列端口,因为如果测试并行运行,您可能会收到“地址已在使用”错误,如下所述。
每当您看到localhost时,请先尝试端口转发该端口(在VM级别)
请参阅“从外部连接到docker容器内运行的服务”
VBoxManage controlvm "default" natpf1 "tcp-port8081,tcp,,8081,,8081"
VBoxManage controlvm "default" natpf1 "udp-port8081,udp,,8081,,8081"
(将默认
替换为docker-Machine的名称:请参阅docker-Machine ls
)
这与docker主机级别(基于boot2docker的Linux主机)的端口映射不同
OP luke aus在评论中确认:
输入网络的IP地址解决了问题!
我最终找到了一个更好的解决方案,不需要我硬编码IP地址。下面是我使用docker在django中运行测试时使用的配置。
# docker-compose base file for everything
version: '2'
services:
postgis:
build:
context: .
dockerfile: ./docker/postgis/Dockerfile
container_name: postgis
volumes:
# If you are using boot2docker, postgres data has to live in the VM for now until #581 fixed
# for more info see here: https://github.com/boot2docker/boot2docker/issues/581
- /data/dev/docker_cookiecutter/postgres:/var/lib/postgresql/data
django:
build:
context: .
dockerfile: ./docker/django/Dockerfile
container_name: django
volumes:
- .:/app
depends_on:
- selenium
- postgis
environment:
- SITE_DOMAIN=django
- DJANGO_SETTINGS_MODULE=settings.my_dev_settings
links:
- postgis
- mailcatcher
selenium:
container_name: selenium
image: selenium/standalone-firefox-debug:2.52.0
ports:
- "4444:4444"
- "5900:5900"
ENTRYPOINT ["/docker/django/entrypoint.sh"]
#!/bin/bash
set -e
# Now we need to get the ip address of this container so we can supply it as an environmental
# variable for django so that selenium knows what url the test server is on
# Use below or alternatively you could have used
# something like "$@ --liveserver=$THIS_DOCKER_CONTAINER_TEST_SERVER"
if [[ "'$*'" == *"manage.py test"* ]] # only add if 'manage.py test' in the args
then
# get the container id
THIS_CONTAINER_ID_LONG=`cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1`
# take the first 12 characters - that is the format used in /etc/hosts
THIS_CONTAINER_ID_SHORT=${THIS_CONTAINER_ID_LONG:0:12}
# search /etc/hosts for the line with the ip address which will look like this:
# 172.18.0.4 8886629d38e6
THIS_DOCKER_CONTAINER_IP_LINE=`cat /etc/hosts | grep $THIS_CONTAINER_ID_SHORT`
# take the ip address from this
THIS_DOCKER_CONTAINER_IP=`(echo $THIS_DOCKER_CONTAINER_IP_LINE | grep -o '[0-9]\+[.][0-9]\+[.][0-9]\+[.][0-9]\+')`
# add the port you want on the end
# Issues here include: django changing port if in use (I think)
# and parallel tests needing multiple ports etc.
THIS_DOCKER_CONTAINER_TEST_SERVER="$THIS_DOCKER_CONTAINER_IP:8081"
echo "this docker container test server = $THIS_DOCKER_CONTAINER_TEST_SERVER"
export DJANGO_LIVE_TEST_SERVER_ADDRESS=$THIS_DOCKER_CONTAINER_TEST_SERVER
fi
eval "$@"
SITE_DOMAIN = 'django'
docker-compose run django ./manage.py test
问题内容: 我已经将Docker配置为使用docker-compose.yml运行Postgres和Django,并且工作正常。 我遇到的麻烦是Selenium无法连接到Django liveserver。 现在(至少对我而言),django必须访问selenium才能控制浏览器,而selenium必须访问django才能访问服务器。 我已经尝试从此处使用docker- compose.yml的以
当我使用Chrome驱动程序运行时,我的selenium功能测试失败,但在使用Firefox时工作正常。 Mac OS X山狮 Chrome版本22.0.1229.94 构建信息:版本:“2.2.1”,修订版:“16551”,时间:“2012-04-11 21:42:35” 系统信息:os。名称:“Mac OS X”,操作系统。拱门:“x86_64”,操作系统。版本:“10.8.2”,java。版
我在facebook php webdriver上工作,我在Ubuntu上工作,selenium独立服务器与webdriver库在同一个目录下。 当我执行以下代码时,我使用本地ip地址192.168.x.x连接到linux 我经常得到这个错误“未捕获的异常”UnhandledWebDriverError“,消息是”无法在45000 ms后连接到端口7055上的主机127.0.0.1“。Firefo
null V: BrowserTimeout:0 调试:false DownPollingLimit:2 集线器:http://jenkins主机:jenkins端口 ID:http://node ip:node端口 null 异常的第一行说它无法解析某些东西,但我不能理解什么? 我是不是漏掉了什么?我是第一次做网格设置。
警告会话0x0,因为服务器空、意外错误、关闭套接字连接并试图重新连接(org.apache.zookeeper.clientcnxn)java.net.ConnectException:连接被拒绝 zookeeper首先开始,它在2181上,当开始Kafka时,它看着2181“zookeeper”然后在我身上爆炸。忠告?
我正在研究一套Selenium WebDriver(不是Selenium RC,也不使用Selenium-Server)测试,这些测试通过对mstest的命令行调用执行。我将它们分解为我们计划测试的每个浏览器的测试类(目前是Chrome、Firefox和IE9),每个测试类都有一个启动方法,它登录到测试中的系统,然后执行请求的测试,还有一个拆分方法,它使用webdriver.quit()关闭浏览器