Docker环境下Django集成Selenium测试时出现ERR_CONNECTION_REFUSED连接拒绝问题求助
嘿,太懂这种折腾Docker+Django+Selenium时遇到连接拒绝的崩溃感了!咱们一步步来排查和解决你的问题:
核心问题分析
你的问题主要出在容器间网络访问逻辑和端口配置不匹配这两个点上,咱们逐个击破:
1. 先把端口配置统一!
你看,你的Django容器里runserver用的是0.0.0.0:8006,但测试类BaseSeleniumTests里把port设成了8086——这俩端口完全不搭啊!live_server_url会默认用你测试类里的8086端口,但Django实际在8006端口运行,肯定连不上。
修改测试类的端口配置:
@tag('live') class BaseSeleniumTests(StaticLiveServerTestCase): fixtures = ["f1"] port = 8006 # 改成和Django容器一致的8006! # ... 其他代码不变
2. 容器间访问别用localhost,要用服务名!
在Docker网络里,每个容器的localhost只指向自己,所以你测试代码里用http://localhost:4444/wd/hub连接Selenium Hub是错的——应该用Docker Compose里的服务名selenium-hub,因为所有服务都在同一个my-net网络里,服务名可以直接解析到对应容器。
同样,Selenium要访问Django服务,也不能用live_server_url(它默认指向测试容器的localhost),得用Django容器的服务名django来访问。
修改测试代码的连接逻辑:
@classmethod def setUpClass(self): super().setUpClass() options = Options() options.add_argument("--no-sandbox") options.add_argument("--headless=new") # 测试环境推荐加无头模式,避免显示问题 # 用selenium-hub服务名连接,代替localhost self.selenium = Remote("http://selenium-hub:4444/wd/hub", options=options) self.selenium.implicitly_wait(10) self.actions = ActionChains(self.selenium) # 定义Django服务的访问地址,用服务名+端口 self.django_base_url = "http://django:8006" def login(self, email='emilynconlan@einrot.com'): # 用自定义的django_base_url代替live_server_url self.selenium.get(f"{self.django_base_url}{reverse('account_login')}") # ... 后面的登录逻辑不变 def test_article(self): self.login() # 同样替换成django_base_url self.selenium.get(f"{self.django_base_url}/article_list/") # ... 后面的测试逻辑不变
3. 别忘了配置Django的ALLOWED_HOSTS
Django默认会拒绝不在ALLOWED_HOSTS里的请求,所以你需要在Django的settings.py里加上django这个服务名(Docker容器间访问用的主机名):
ALLOWED_HOSTS = ['django', 'localhost', '127.0.0.1'] # 测试环境也可以直接设为 ALLOWED_HOSTS = ['*'],方便调试
4. 额外:确保Django服务完全就绪再跑测试
depends_on只是保证容器启动顺序,不代表Django服务已经完全加载完成(比如数据库连接还没建立)。你可以在测试的login方法开头加个简单的等待逻辑,或者在Docker Compose里用wait-for-it之类的工具让Django容器等数据库就绪后再启动runserver。
比如修改Django容器的command:
command: > sh -c " python manage.py wait_for_db && python manage.py runserver 0.0.0.0:8006 "
(需要先安装django-wait-for-db或者自己写等待逻辑)
做完这些修改后,再跑测试应该就能正常连接了!如果还有问题,可以检查下Docker容器的日志,看看Django有没有正常启动,Selenium Hub有没有接收到连接请求。
内容来源于stack exchange

