You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CircleCI上Django应用Selenium测试报NoSuchElementException求助

Django Selenium测试在CircleCI上失败的排查与解决

你遇到的情况很典型:本地测试顺畅,但CI环境里因为容器特性、网络延迟或配置细节,导致Selenium找不到元素。结合你的代码和CircleCI配置,我整理了几个核心问题点和对应的解决办法:

1. Chrome Headless模式缺少必要参数

你的Chrome配置只加了headless,但CircleCI的容器环境下,还需要额外参数才能让Chrome正常渲染页面、访问网络。修改Driver初始化代码:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("headless")
# 添加容器环境必需的参数
chrome_options.add_argument("disable-gpu")
chrome_options.add_argument("no-sandbox")  # 禁用沙盒模式,否则Chrome会在容器中崩溃
chrome_options.add_argument("window-size=1920,1080")  # 固定窗口尺寸,避免元素布局异常
driver = webdriver.Chrome(chrome_options=chrome_options)

2. Selenium服务器未就绪就执行测试

你的CircleCI配置里启动Selenium后直接跑测试,但Selenium服务启动需要几秒时间,此时测试提前执行会导致页面加载不完整。在Start Selenium步骤后添加等待脚本,确认服务就绪:

- run:
    name: Wait for Selenium to be ready
    command: |
      while ! nc -z localhost 4444; do
        sleep 1
      done

这个脚本会持续检查Selenium默认的4444端口,直到服务启动完成再继续执行测试。

3. 未使用显式等待,依赖页面同步

本地环境页面加载快,直接查找元素没问题,但CircleCI上网络或容器性能有延迟,必须用显式等待确保元素加载完成再操作。修改你的登录方法:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def login(self):
    driver.get(self.live_server_url + reverse("login"))
    # 显式等待元素出现,最多等待10秒
    email_field = WebDriverWait(self.driver, 10).until(
        EC.presence_of_element_located((By.ID, "id_email"))
    )
    email_field.send_keys(u.email)
    
    password_field = WebDriverWait(self.driver, 10).until(
        EC.presence_of_element_located((By.ID, "id_password"))
    )
    password_field.send_keys("12345678")
    
    submit_btn = WebDriverWait(self.driver, 10).until(
        EC.element_to_be_clickable((By.ID, "submit-login"))
    )
    submit_btn.click()

4. Selenium与Chrome版本不兼容

你使用的Selenium Server 3.5.3版本较旧,可能和CircleCI镜像中的Chrome版本不匹配。建议升级到Selenium 4.x稳定版,或者使用webdriver-manager自动管理ChromeDriver版本:
首先安装依赖:

pip install webdriver-manager

然后修改Driver初始化代码:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("headless")
chrome_options.add_argument("disable-gpu")
chrome_options.add_argument("no-sandbox")
chrome_options.add_argument("window-size=1920,1080")
# 自动下载匹配当前Chrome版本的Driver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)

5. Django live_server_url的访问权限

Django的live_server_url默认绑定127.0.0.1,在容器环境中可能需要调整为可外部访问的地址。可以在运行测试时指定参数:
在test.sh中修改测试命令:

python manage.py test --liveserver=0.0.0.0:8000

优先排查显式等待和Selenium启动等待这两个点,这是CI环境中最常见的触发NoSuchElementException的原因。

内容的提问来源于stack exchange,提问作者MarcioPorto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:51