通过SSH创建带虚拟显示的Selenium浏览器后,如何在VNC中显示?
问题解决方法
核心原因
你通过pyvirtualdisplay创建的Chrome进程绑定在独立的X虚拟显示(比如:0)上,而VNC会话使用的是另一个X显示(比如:1),两个显示相互独立,所以VNC无法看到Chrome窗口。switch_to.window仅用于Selenium会话内的标签页/窗口切换,和窗口所在的X显示环境无关,因此无效;而webdriver.Chrome().current_window_handle是新建了一个Chrome实例,和原有会话无关联,自然会触发窗口不存在的异常。
解决步骤
1. 确认显示编号
- 在VNC会话终端执行,获取当前VNC的显示编号:
输出通常为echo $DISPLAY:1或类似格式。 - 在SSH终端执行,找到
pyvirtualdisplay创建的虚拟显示编号:
输出中会包含类似ps aux | grep Xvfb:0的参数,这就是Chrome当前绑定的显示。
2. 迁移Chrome窗口到VNC显示
先安装窗口迁移工具(若未安装):
sudo apt update && sudo apt install wmctrl xdotool
然后执行以下操作:
- 列出所有窗口,找到Chrome的窗口ID:
在输出中找到标注wmctrl -lGoogle Chrome的行,第一列即为窗口ID(如0x01234567)。 - 将窗口迁移到VNC显示(替换
<窗口ID>和:1为你的实际值):xdotool windowreparent <窗口ID> $(xdotool getrootwindow --display :1)
3. 后续替代方案:直接在VNC会话创建Chrome
如果迁移操作繁琐,后续可以跳过pyvirtualdisplay,直接在VNC会话中启动Chrome:
from selenium import webdriver import os # 绑定VNC的显示编号(替换为你实际的DISPLAY值) os.environ['DISPLAY'] = ':1' driver = webdriver.Chrome()
这样Chrome窗口会直接出现在VNC会话的桌面中。
内容的提问来源于stack exchange,提问作者CalebK
相关产品推荐
相关产品推荐

