如何在无活跃RDP会话的谷歌云VM上运行Python Selenium测试?
解决Python Selenium在无RDP会话的谷歌云VM上运行的问题
核心原因
Java版能正常运行是因为Java的AWT和Selenium实现可直接调用系统图形资源,不受RDP会话状态影响;而Python的Selenium绑定(尤其配合ChromeDriver)默认依赖当前桌面会话上下文,关闭RDP后会话被挂起,图形环境释放,导致页面渲染和截图失败。
可行解决方案
1. 启用Chrome新版无头模式(优先尝试)
Chrome的--headless=new模式无需依赖虚拟显示器,可直接在无桌面环境下运行,配置如下:
from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--window-size=1920,1080') # 确保截图尺寸完整 driver = webdriver.Chrome(options=chrome_options) driver.get("https://example.com") driver.save_screenshot("test_screenshot.png") driver.quit()
2. 正确配置虚拟显示器并绑定进程
如果必须使用有头模式,需确保虚拟显示器与ChromeDriver进程正确关联:
- 安装依赖:
sudo apt-get install xvfb(Debian/Ubuntu系统),pip install pyvirtualdisplay - 代码中显式启动并绑定:
from pyvirtualdisplay import Display from selenium import webdriver # 启动虚拟显示器 display = Display(visible=0, size=(1920, 1080)) display.start() # 配置Chrome使用该显示器 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(f'--display={display.display}') chrome_options.add_argument('--no-sandbox') driver = webdriver.Chrome(options=chrome_options) # 执行测试逻辑 driver.get("https://example.com") driver.save_screenshot("virtual_display_screenshot.png") # 清理资源 driver.quit() display.stop()
3. 用systemd服务保持虚拟显示器常驻
避免手动启动的虚拟显示器随会话关闭终止,创建systemd服务:
- 创建服务文件
/etc/systemd/system/selenium-xvfb.service:
[Unit] Description=Persistent X Display for Selenium After=network.target [Service] User=你的用户名 Type=forking ExecStart=/usr/bin/Xvfb :1 -screen 0 1920x1080x24 ExecStop=/usr/bin/pkill -f "Xvfb :1" Restart=always [Install] WantedBy=multi-user.target
- 启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start selenium-xvfb.service sudo systemctl enable selenium-xvfb.service
- 代码中指定使用
:1端口:
chrome_options.add_argument('--display=:1')
4. 修改谷歌云VM的RDP会话设置
登录谷歌云控制台,找到目标VM实例,编辑实例的"远程桌面"设置,将"会话保持"设为"始终保持",重启VM后测试。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

