Notion Blog
技术分享1 分钟阅读

Playwright 远程执行解决方案:在不受支持的 CentOS 8 系统上运行现代浏览器测试

问题背景

在 CentOS 8 系统上直接安装 Playwright 时,会遇到以下问题:

BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ubuntu20.04-x64.

这是因为 CentOS 8 不在 Playwright 官方支持的操作系统列表中。当尝试直接安装时,Playwright 会回退到 Ubuntu 20.04 的构建版本,这可能导致兼容性问题或根本无法运行。

解决方案概述

通过 Docker 容器化部署 Playwright Server + 远程客户端连接 的架构,我们可以完美解决这个问题:

服务端:在 Docker 容器中运行 Playwright 和浏览器
客户端:在主机系统上运行测试代码,通过网络连接到容器中的浏览器
通信:通过 CDP(Chrome DevTools Protocol)协议进行远程通信

完整实现步骤

1. Docker 环境准备

首先确保服务器上已安装 Docker 并配置好权限:

# 安装 Docker(CentOS 8)sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组(避免每次使用 sudo)sudo usermod -aG docker $USER
newgrp docker

# 验证安装
docker --version

2. 启动 Playwright Server 容器

使用官方 Playwright 镜像启动服务端:

# 拉取指定版本的镜像
docker pull mcr.microsoft.com/playwright:v1.55.0-noble

# 启动 Playwright Server
docker run -d \
  -p 9332:9332 \
  --name playwright-server \
  --init \
  --ipc=host \
  --shm-size=2gb \
  --workdir /home/pwuser \
  --user pwuser \
  mcr.microsoft.com/playwright:v1.55.0-noble \
  npx -y [email protected] run-server --port 9332 --host 0.0.0.0

参数说明:

p 9332:9332:端口映射,将容器端口暴露给主机
-ipc=host:共享主机 IPC 命名空间,提升浏览器稳定性
-shm-size=2gb:增加共享内存,避免浏览器崩溃
npx -y [email protected]:强制使用指定版本,避免版本冲突

3. 验证服务端状态

检查容器是否正常运行:

# 查看容器状态
docker ps | grep playwright-server

# 检查服务端版本
docker exec -it playwright-server npx playwright --version
# 应该输出:Version 1.55.0# 查看容器日志
docker logs playwright-server

4. 客户端环境配置

在主机系统上安装 Playwright 客户端:

# 安装 Python 版本的 Playwright
pip3.9 install playwright==1.55.0

# 注意:这里不需要运行 playwright install,因为浏览器在容器中运行

5. 编写远程测试代码

创建测试脚本 remote_test.py

from playwright.sync_api import sync_playwright

def test_remote_browser():
    print("正在连接到远程 Playwright Server...")

    with sync_playwright() as p:
        try:
# 连接到远程浏览器
            browser = p.chromium.connect_over_cdp("http://localhost:9332")
            print("✓ 成功连接到远程浏览器")

# 创建新页面
            page = browser.new_page()
            print("✓ 新页面创建成功")

# 访问测试网站
            page.goto("https://example.com")
            print("✓ 页面加载完成")

# 获取页面标题
            title = page.title()
            print(f"✓ 页面标题: {title}")

# 截图保存
            page.screenshot(path="remote_screenshot.png")
            print("✓ 截图已保存为 remote_screenshot.png")

# 关闭浏览器
            browser.close()
            print("✓ 测试完成,浏览器已关闭")

        except Exception as e:
            print(f"✗ 连接失败: {e}")

if __name__ == "__main__":
    test_remote_browser()

6. 运行测试

执行测试脚本:

python3.9 remote_test.py

认证和安全配置

对于需要安全访问的场景,可以添加认证:

docker run -d \
  -p 9332:9332 \
  --name playwright-server \
  --init \
  --ipc=host \
  --workdir /home/pwuser \
  --user pwuser \
  -e PLAYWRIGHT_SERVER_AUTH=username:password  \
  mcr.microsoft.com/playwright:v1.55.0-noble \
  npx -y [email protected] run-server --port 9332 --host 0.0.0.0

客户端连接时添加认证头:

from playwright.sync_api import sync_playwright
import base64

def test_with_auth():
    with sync_playwright() as p:
# Basic Auth 认证
        auth_string = base64.b64encode(b"username:password").decode()
        headers = {"Authorization": f"Basic {auth_string}"}

        browser = p.chromium.connect_over_cdp(
            "http://localhost:9332",
            headers=headers
        )
# ... 测试代码

也可以

from playwright.sync_api import sync_playwright
import base64

def test_with_auth():
    with sync_playwright() as p:
		    # Basic Auth 认证
        browser = p.chromium.connect_over_cdp(
            "ws://username:passwordlocalhost:9332",
        )
# ... 测试代码
有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。