技术分享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 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。