打印网页为pdf
使用selenium无法显式打开打印页面进行截图,因为截图界面是系统级的,浏览器无法越权打开,可以使用调用 CDP 命令使用 Page.printToPDF进行截图
def print_pdf(driver, pdf_path):
print_options = {
'landscape': False, # 是否横向打印,默认为纵向
'printBackground': True, # 是否打印背景色和背景图片
'scale': 1.0, # 页面缩放比例
'paperWidth': 8.5, # 纸张宽度 (英寸)
'paperHeight': 11.0, # 纸张高度 (英寸)
'marginTop': 0.5, # 上边距 (英寸)
'marginBottom': 0.5, # 下边距 (英寸)
'marginLeft': 0.5, # 左边距 (英寸)
'marginRight': 0.5, # 右边距 (英寸),
'displayHeaderFooter': True,
}
# 调用 CDP 命令 Page.printToPDF
result = driver.execute_cdp_cmd('Page.printToPDF', print_options)
# 提取 Base64 编码的 PDF 数据
pdf_base64 = result['data']
# 解码 Base64 字符串为字节数据
pdf_bytes = base64.b64decode(pdf_base64)
# 将字节数据写入 PDF 文件
with open(pdf_path, "wb") as f:
f.write(pdf_bytes)
print(f"网页已成功保存为: {os.path.abspath(pdf_path)}")服务器端调试浏览器
安装tigervnc-server
sudo yum install tigervnc-server设置vnc密码
vncpasswd修改配置文件
sudo vi /lib/systemd/system/[email protected]改为以下内容,<换成你的用户名>需要改为对应的用户名
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=simple
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper <换成你的用户名> %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target- vnc config
vim ~/.vnc/config改为以下内容
geometry=1280x800
depth=24启动并启用VNC服务
sudo systemctl daemon-reload
sudo systemctl start vncserver@:1.service
sudo systemctl enable vncserver@:1.service安装桌面环境
sudo yum groupinstall "GNOME Desktop"vnc配置桌面环境
修改xstartup
vi ~/.vnc/xstartup改为以下内容
#!/bin/sh
exec gnome-session确保文件可执行
chmod +x ~/.vnc/xstartup重启VNC服务
sudo systemctl restart vncserver@:1.service解决selenium无法在服务器图形化启动
安装图形化想启动界面进行调试的时候,发现driver无法启动,以下是解决方法。
我们在ssh里面进行调试
echo $DISPLAY如果有输出这表示你的系统已经正确配置了显示环境,:0 通常指的是本地显示器,而 localhost:10.0 则可能是通过远程连接(如 SSH)转发的显示。
通常无法启动图形化界面是因为当前的display是远程连接(如 SSH)转发的显示,即localhost:10.0
因此我们需要了解一些vnc display相关知识,vnc的DISPLAY对应如下
| 启动命令 | 对应的display |
| vncserver:1 | :1 |
| vncserver:2 | :2 |
| vncserver:3 | :3 |
我们前面启动的命令是sudo systemctl start vncserver@:1.service
因此我们的display是 :1
基于以上,我们需要进行如下修改
- Java
// 强制设置 DISPLAY
Map<String, String> env = new HashMap<>(System.getenv());
env.put("DISPLAY", ":1"); // 改成你 VNC 的 DISPLAY- Python
# 强制指定 DISPLAY
os.environ["DISPLAY"] = ":1" # 改成你的 VNC DISPLAY