签到失败主因是页面未加载完成就操作,应改用WebDriverWait等待元素;Cookie失效因domain/path不匹配,需按模板设置;Linux部署卡死因缺少图形依赖,须安装libgbm1等库并禁用沙箱;Session校验还涉及localStorage和自定义header,需同步提取。

签到失败但浏览器手动能过?先检查 driver.get() 后有没有等页面加载完成
很多脚本跑着报错,比如元素找不到、点击无响应,其实不是逻辑问题,而是 driver.get() 发起请求后立刻执行查找操作,此时 DOM 还没渲染完。Selenium 默认不等待页面 load 完成就往下走,尤其遇到 SPA(如 Vue/React)页面,document.readyState 可能还是 loading。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 不用
time.sleep(3)硬等——不稳定,慢,且容易被反爬识别为非人行为 - 改用
WebDriverWait配合expected_conditions,比如等某个签到按钮出现:from selenium.webdriver.support.ui import WebDriverWait<br>from selenium.webdriver.support import expected_conditions as EC<br>wait = WebDriverWait(driver, 10)<br>btn = wait.until(EC.element_to_be_clickable((By.ID, "sign-btn")))
- 对登录态敏感的页面,额外加一句
wait.until(lambda d: d.execute_script("return document.readyState") == "complete"),确保 JS 渲染到位
Cookie 自动续期总失效?别直接 driver.add_cookie() 就完事
从浏览器导出的 Cookie 字符串或 JSON 直接塞进 driver.add_cookie() 很可能无效,原因在于:Selenium 要求 Cookie 字典必须包含 name、value、domain(注意不是 URL 中的 host)、path,缺一不可;而且 domain 值如果带前导点(如 .example.com),而当前 driver 访问的是 https://www.example.com,Selenium 会拒绝添加。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 保存 Cookie 前,先用
driver.get_cookies()拿一份“合法模板”,再替换value字段,避免 domain/path 错位 - 加载 Cookie 必须在
driver.get("https://target-site.com")之后、且 URL 的 domain 和 Cookie 的domain字段严格匹配(比如访问https://app.example.com,就不能加载domain: ".example.com"的 Cookie,得改成"app.example.com") - 部分站点校验
HttpOnly或Secure标志,这些字段 Selenium 无法设置,所以优先用已登录状态下driver.get_cookies()导出,而不是手拼
为什么本地能跑,部署到 Linux 服务器就卡死?headless 模式下字体和 GPU 支持是隐形门槛
脚本在 macOS/Windows 本地调试成功,扔到 Ubuntu 服务器上跑 headless 模式时,常见现象是页面白屏、元素一直 not found、甚至 driver.get() 卡住超时——大概率不是代码问题,而是 Chromium 在无图形环境缺少基础依赖。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装必备系统库:
sudo apt-get install -y libx11-xcb1 libxcb-cursor0 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1 libxcb-xrm0 libxcb-icccm4 libgbm1 libasound2 - 启动 ChromeOptions 时显式禁用沙箱和 GPU:
options.add_argument("--no-sandbox")<br>options.add_argument("--disable-dev-shm-usage")<br>options.add_argument("--disable-gpu") - 如果目标网站用 WebFont 或 canvas 渲染关键按钮,加一条:
options.add_argument("--font-render-hinting=none"),避免字体未加载导致布局错乱
自动签到脚本隔几天就挂?别只盯着 Cookie,Session ID 和 localStorage 也可能被联动校验
有些网站(比如用 Spring Security + JWT 的后台)不仅靠 Cookie 维持登录态,还会把临时 token 存在 localStorage 里,前端每次请求都读取它拼进 header;或者服务端把 Session ID 写进 Cookie 后,又用该 ID 加密生成另一个字段(如 X-Auth-Sign)随响应下发,下次请求必须带上——这种设计下,光更新 Cookie 没用,localStorage 和自定义 header 都得同步。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用浏览器开发者工具的 Network 面板,过滤 XHR/Fetch 请求,看签到接口的 Request Headers 里有没有非常规字段(如
X-Token-Sign、X-Timestamp),这些往往来自 JS 运行时计算 - 在 Selenium 中还原这类逻辑:用
driver.execute_script("return localStorage.getItem('auth_token')")拿值,再手动加到requests.post()的 headers 里(如果混合用了 requests) - 更稳妥的做法是全程只用 Selenium 执行签到动作(即点按钮、等响应),而不是切到 requests 发请求——避免漏掉前端埋的任何校验环节
真正难的从来不是写几行 find_element,而是搞清楚那个签到按钮背后,到底有多少层状态在互相咬合。少一个 domain 字段,漏一次 localStorage 同步,或者 headless 下少装一个 libgbm1,脚本就静默失败——这些地方不报错,只沉默。


















