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

使用Headless Chrome Driver通过Selenium无法创建账户求助

问题:Headless模式下Selenium点击/表单填写无效,测试显示PASS但未创建用户

由于服务器无法访问数据库,我尝试通过Selenium创建用户。测试显示“PASS”但用户从未被创建,怀疑这与Headless模式有关。请问能否在Headless模式下进行点击操作与表单填写?

环境配置

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_service = ChromeService('/home/bitnami/chromedriver')
driver = webdriver.Chrome(service=self.chrome_service,options=self.chrome_options)

用户创建代码

driver.get(URL)
driver.set_window_size(1657, 1006)
driver.find_element(By.ID, "username").send_keys(USER)
driver.find_element(By.ID, "password").send_keys(PASS)
driver.find_element(By.ID, "_submit").click()
driver.find_element(By.LINK_TEXT, "Ajustes").click()
driver.find_element(By.CSS_SELECTOR, "#administrator-salespersons span").click()
driver.find_element(By.CSS_SELECTOR, ".fa-plus").click()
driver.find_element(By.CSS_SELECTOR, ".btn-sm").click()
driver.find_element(By.ID, "sal_username").send_keys(USER2)
driver.find_element(By.ID, "sal_password").send_keys(PASS2)
driver.find_element(By.ID, "sal_email").send_keys(EMAIL)
driver.find_element(By.ID, "sal_Guardar").click()
driver.quit()

备注: 本地非Headless模式测试时能成功创建用户,服务器端也没有报错。全网搜索未找到包含点击操作的相关示例。


回答

Headless模式完全支持点击操作和表单填写,你的问题大概率是Headless模式下的渲染差异、元素等待不足或环境配置问题导致的隐性失效(测试框架未捕获到错误)。以下是针对性修复方案:

1. 升级Headless模式参数

新版Chrome的旧--headless模式存在渲染兼容性问题,推荐使用官方推荐的新版Headless模式:

chrome_options.add_argument("--headless=new")

2. 添加显式等待,确保元素就绪

你的代码无任何等待逻辑,直接操作元素,Headless模式下页面加载/渲染速度与本地有差异,容易导致元素未就绪就执行操作。替换所有元素查找为显式等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 示例:等待用户名输入框出现并可输入
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "username"))).send_keys(USER)
# 点击操作需确保元素可交互
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "_submit"))).click()
# 所有后续元素操作都替换为这种方式

3. 优化窗口尺寸配置

部分页面会根据窗口尺寸渲染不同布局,Headless下set_window_size可能不生效,直接在Chrome选项中设置窗口尺寸:

chrome_options.add_argument("--window-size=1920,1080")

移除代码中的driver.set_window_size(1657, 1006)。

4. 排查隐性错误

测试显示PASS可能是因为框架未捕获到元素交互失败的异常,添加日志或截图排查:

# 添加Chrome日志输出
chrome_options.add_argument("--enable-logging")
chrome_options.add_argument("--v=1")

# 代码中添加异常捕获
try:
    save_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "sal_Guardar")))
    save_btn.click()
except Exception as e:
    print(f"保存用户失败: {str(e)}")
    driver.save_screenshot("save_failure.png")  # 保存截图查看页面状态

5. 规避反爬限制

Headless模式下Chrome的User-Agent会带有HeadlessChrome标识,部分网站会限制这类请求,手动设置正常的User-Agent:

chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:32:22