Selenium开发笔记

打印网页为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

发表评论