Docker,Django和Selenium - Selenium无法连接

30 浏览
0 Comments

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。

0
0 Comments

问题原因:在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无法连接的问题的方法。希望对您有所帮助。

0
0 Comments

问题的出现的原因是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连接问题的配置方法。

0
0 Comments

问题原因: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选项已经被移除了。

0