为何无人值守时Selenium会卡在空白页,手动查看后恢复正常?
解决服务器关闭界面后Selenium机器人停滞的问题
问题本质
服务器远程界面关闭后,浏览器驱动(这里是undetected-chromedriver)失去显示环境支撑,导致卡在页面加载步骤;重新打开界面后恢复显示上下文,驱动才继续运行。
针对性解决方案
Linux服务器
用xvfb虚拟显示工具模拟桌面环境,让浏览器无需真实界面也能正常工作:
- 安装依赖:
- Debian/Ubuntu:
sudo apt-get install xvfb pyvirtualdisplay - CentOS/RHEL:
sudo yum install xorg-x11-server-Xvfb python3-pyvirtualdisplay
- Debian/Ubuntu:
- 代码中集成虚拟显示:
from pyvirtualdisplay import Display # 启动虚拟显示(分辨率按需调整) display = Display(visible=0, size=(1920, 1080)) display.start() # 初始化driver的代码放在后面 driver = uc.Chrome(options=chrome_options, driver_executable_path="chromedriver") driver.maximize_window() action = ActionChains(driver) driver.get("https://www.reddit.com/login") # 后续业务代码... # 程序结束后关闭虚拟显示 display.stop() - 也可以直接用命令行启动脚本:
xvfb-run python your_bot.py
Windows服务器
- 避免直接关闭远程桌面窗口,改用「断开会话」选项,保持桌面会话激活;
- 通过任务计划程序运行脚本:设置任务为不管用户是否登录都要运行,并赋予最高权限;
- 配置Chrome无头模式(无需显示界面),在chrome_options中添加:
chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox")
通用代码优化
- 替换固定
time.sleep(3)为显式等待,避免无意义等待同时保证页面加载完成:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver.get("https://www.reddit.com/login") # 等待登录页面核心元素加载(示例为用户名输入框,根据实际调整) WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, "loginUsername"))) - 确保
chromedriver版本与服务器上的Chrome版本完全一致,避免兼容性卡顿; - 添加超时限制,防止无限停滞:
driver.set_page_load_timeout(30) # 页面加载超时30秒 driver.set_script_timeout(30) # 脚本执行超时30秒
内容的提问来源于stack exchange,提问作者tunatanriverdi
相关产品推荐
相关产品推荐

