Docker,Django和Selenium - Selenium无法连接
Docker,Django和Selenium - Selenium无法连接
我已经配置了Docker来运行Postgres和Django,使用docker-compose.yml并且它正常工作。我遇到的问题是Selenium无法连接到Django的liveserver。现在对我来说是有意义的(至少对我来说),Django必须访问Selenium来控制浏览器,而Selenium必须访问Django来访问服务器。
我尝试使用docker的'ambassador'模式,使用以下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。
我还尝试了这个解决方案https://github.com/docker/compose/issues/1991,但是这不起作用,因为我无法同时让Django连接到Postgis和Selenium。
我尝试了下面列出的网络功能,但结果是一样的。
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
所以我该如何让Selenium连接到Django?
我已经玩了几天这个问题了-真的很感激任何帮助。
更多信息:
另一个奇怪的事情是,当测试服务器不使用docker运行(使用我之前的virtualenv等配置)时,如果我运行./manage.py test foo,我可以通过任何浏览器访问服务器,在http://localhost:8081并得到网页服务,但是当我运行相同的命令在docker下运行时,我无法访问测试服务器。这很奇怪,因为我映射了端口8081:8081-这是否有关?
注意:我使用的是OSX和Docker v1.9.1。
问题原因:在Docker中运行Django测试时,Selenium无法连接。
解决方法:通过获取容器的IP地址并将其作为环境变量传递给Django,使Selenium知道测试服务器的URL。
文章内容如下:
在使用Docker中运行Django测试时,我遇到了一个问题,Selenium无法连接。后来我找到了一个更好的解决方案,不需要硬编码IP地址。下面是我用于在Django中使用Docker运行测试的配置。
首先是docker-compose文件,其中包含了各个服务的配置。其中,selenium服务是用于运行Selenium的容器。
version: '2'
services:
postgis:
build:
context: .
dockerfile: ./docker/postgis/Dockerfile
container_name: postgis
volumes:
- /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"
接下来是Dockerfile文件,用于配置Django容器的入口点。
ENTRYPOINT ["/docker/django/entrypoint.sh"]
然后,在入口点文件中,我们需要获取容器的IP地址,并将其作为环境变量传递给Django,以便Selenium知道测试服务器的URL。
#!/bin/bash set -e if [[ "'$*'" == *"manage.py test"* ]] then THIS_CONTAINER_ID_LONG=`cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1` THIS_CONTAINER_ID_SHORT=${THIS_CONTAINER_ID_LONG:0:12} THIS_DOCKER_CONTAINER_IP_LINE=`cat /etc/hosts | grep $THIS_CONTAINER_ID_SHORT` THIS_DOCKER_CONTAINER_IP=`(echo $THIS_DOCKER_CONTAINER_IP_LINE | grep -o '[0-9]\+[.][0-9]\+[.][0-9]\+[.][0-9]\+')` 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 "$@"
在Django的配置文件中,我们需要设置SITE_DOMAIN变量。
SITE_DOMAIN = 'django'
最后,我们可以使用docker-compose运行测试。
docker-compose run django ./manage.py test
以上是解决Selenium无法连接的问题的方法。希望对您有所帮助。
问题的出现的原因是Django无法连接到Selenium。解决方法是在Docker配置中添加正确的链接和环境变量。
在Docker配置中,需要添加以下内容:
links:
- selenium
environment:
- SELENIUM_HOST=http://selenium:4444/wd/hub
- DJANGO_LIVE_TEST_SERVER_ADDRESS=django:8081-8100
这样,Django就可以通过链接访问Selenium的4444端口,并且Selenium可以通过链接访问Django的8081-8100端口。
此外,还可以省略Selenium配置中的4444端口和Django配置中的8081端口的显式暴露。因为这些端口默认已经暴露,并且由于Django容器与Selenium容器的链接,Django容器可以直接访问Selenium容器的4444端口。
另外,为了避免并行运行测试时出现“Address already in use”错误,可以使用一组端口作为测试服务器的地址范围。这样,当测试并行运行时,每个测试都可以使用不同的端口,避免端口冲突。
这是解决Docker、Django和Selenium连接问题的配置方法。
问题原因:Selenium无法连接的原因是由于在Docker中使用Django时,Django启动了一个livetestserver,默认情况下它在localhost:8081上运行。然而,当Selenium尝试连接到localhost:8081时,连接被拒绝。
解决方法:通过将网络的IP地址作为主机名替换localhost,可以解决Selenium无法连接的问题。具体来说,将localhost:8081替换为django:8081,其中django是Django容器的名称。这可以通过在Django中使用./manage.py test myapp --liveserver=django:8081
来实现。
以下是完整的
在使用Docker、Django和Selenium的过程中,有时会遇到Selenium无法连接的问题。这个问题的出现是由于在Docker中使用Django时,Django启动了一个livetestserver,默认情况下它在localhost:8081上运行。然而,当Selenium尝试连接到localhost:8081时,连接被拒绝。
为了解决这个问题,我们可以通过将网络的IP地址作为主机名替换localhost来解决。具体来说,将localhost:8081替换为django:8081,其中django是Django容器的名称。这可以通过在Django中使用./manage.py test myapp --liveserver=django:8081
来实现。
这个解决方法是由用户luke-aus在评论中提供的。他指出,通过输入网络的IP地址,问题得到了解决。
在实际操作中,我们可以在运行中的Django容器中使用curl -I http://localhost:8081
命令来检查livetestserver是否正常工作。如果返回状态为'HTTP/1.0 200 OK',则表示Django容器可以正常访问。然而,当我们在运行中的Selenium容器中运行curl -I http://localhost:8081
命令时,会返回curl: (7) Failed to connect to localhost port 8081: Connection refused
,即连接被拒绝。
通过将localhost替换为django,我们可以解决Selenium无法连接的问题。在Django容器中运行curl -I http://django:8081
命令,我们可以看到livetestserver正常工作。
感谢用户luke-aus的建议,我们得以解决这个问题,并将他的评论整合到了这个答案中,以便更多人能看到。
最后,我们也注意到了一位用户提到的问题,即为什么要使用virtualbox。对此,我们没有做出回答。
同时,我们也注意到有用户提到--liveserver选项已经被移除了。