linux运行无头浏览器执行js代码
具体怎么实现linux运行无头浏览器执行js代码
执行过程中出错: TypeError: this.send is not a function at Hlclient.sendResult (eval at evaluate (:290:30),
typeof window[0]?.ABC === 'function'
// 等待全局变量 window.initDone 变为 true(JS 加载完成后会设置该变量)
await page.WaitForFunctionAsync("window.initDone === true");
// 或等待全局函数 window.renderPage 定义完成
await page.WaitForFunctionAsync("typeof window.renderPage === 'function'");
// 此时 JS 已就绪,执行 EvaluateAsync
string result = await page.EvaluateAsync<string>("window.renderPage()");
🔍 错误分析
1. Playwright 的 evaluate 是“干净”的
Playwright 在页面中执行 JS 时,只运行标准浏览器环境(window, document, fetch 等)。
它不会注入像 this.send、window.__playwright__(除非你手动注入)之类的自定义通信函数。
如果你的 JS 代码来自:
某个爬虫框架的模板
Electron 应用的调试代码
旧版 Puppeteer 的 hack 脚本
网站自身的反调试/加密脚本(如 Boss 直聘、企查查等)
那么其中的 this.send 很可能是该环境特有的通信机制,在 Playwright 中自然会报错。
正确做法:只使用标准浏览器 API
在 EvaluateAsync 中,只能使用浏览器原生支持的 JavaScript,
方案二:不要在 JS 中做通信,结果直接 return
所有需要的数据,必须通过 return 返回,Playwright 会自动序列化:
方案三:如果 JS 来自网站本身,先确保它已加载
有时你执行的 JS 依赖网站自己的全局变量(如 window.Hlclient),但页面还没加载完:
// 等待关键脚本加载
await page.WaitForFunctionAsync("() => typeof Hlclient !== 'undefined'");
// 再执行
var result = await page.EvaluateAsync("() => new Hlclient().getData()");
在 Linux 上使用 Playwright 运行无头浏览器并执行 JavaScript 代码,是一个非常常见的自动化/爬虫/测试场景。下面我将为你提供 完整、可运行的步骤和代码示例(适用于 .NET/C#),包括环境准备、依赖安装、代码编写和部署建议。
✅ 目标
- 在 Linux(如 Ubuntu 20.04/22.04)上
- 使用 Playwright 启动 无头 Chromium
- 执行自定义 JS 代码(例如:获取页面数据、模拟点击等)
- 完全后台运行(无 GUI 窗口)
🛠️ 第一步:Linux 环境准备(Ubuntu 示例)
1. 安装 .NET SDK(以 .NET 6 为例)
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt update
sudo apt install -y apt-transport-https
sudo apt install -y dotnet-sdk-6.0
你也可以用 .NET 8,只需替换版本号。
2. 安装系统依赖(Playwright 需要)
Playwright 的 Chromium 在 Linux 上需要一些图形库(即使无头模式也需要):
sudo apt update
sudo apt install -y \
libglib2.0-0 \
libglib2.0-dev \
libnss3 \
libnspr4 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxkbcommon0 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxrandr2 \
libgbm1 \
libasound2 \
libatspi2.0-0 \
libxss1 \
libgtk-3-0 \
xvfb
💡
xvfb是虚拟显示服务器,某些旧版 Playwright 可能需要(新版通常不需要)。
📦 第二步:创建 .NET 项目
dotnet new console -n PlaywrightLinuxDemo
cd PlaywrightLinuxDemo
dotnet add package Microsoft.Playwright
💻 第三步:编写 C# 代码(执行 JS)
// Program.cs
using System;
using System.Threading.Tasks;
using Microsoft.Playwright;
class Program
{
static async Task Main(string[] args)
{
// 1. 安装浏览器(首次运行需执行,也可提前安装)
// await Microsoft.Playwright.Program.Main(new[] { "install", "chromium" });
// 2. 创建 Playwright 实例
using var playwright = await Playwright.CreateAsync();
// 3. 启动无头 Chromium(Linux 默认就是无头,但显式声明更安全)
await using var browser = await playwright.Chromium.LaunchAsync(new()
{
Headless = true, // 无头模式(无窗口)
Args = new[]
{
"--no-sandbox", // Linux 必须(权限问题)
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-gpu"
}
});
// 4. 创建新页面
var page = await browser.NewPageAsync();
// 5. 导航到目标网站
await page.GotoAsync("https://httpbin.org/get");
// 6. 执行 JavaScript 并获取返回值
var userAgent = await page.EvaluateAsync<string>("() => navigator.userAgent");
Console.WriteLine($"User-Agent: {userAgent}");
// 7. 执行更复杂的 JS(例如获取页面标题 + 时间)
var result = await page.EvaluateAsync<JsonElement>(@"
() => {
return {
title: document.title,
url: window.location.href,
now: new Date().toISOString(),
cookies: document.cookie
};
}
");
Console.WriteLine("JS 执行结果:");
Console.WriteLine(result.ToString());
// 8. 你也可以注入脚本、修改 DOM、触发事件等
await page.EvaluateAsync("() => document.body.style.backgroundColor = 'lightblue'");
await page.ScreenshotAsync(new() { Path = "screenshot.png" });
Console.WriteLine("截图已保存为 screenshot.png");
}
}
▶️ 第四步:首次运行前安装浏览器
在项目目录下运行:
# 安装 Playwright CLI(如果尚未安装)
dotnet tool install --global Microsoft.Playwright.CLI
# 安装浏览器(Chromium)
playwright install chromium
浏览器将安装到:
~/.cache/ms-playwright/
🚀 第五步:运行程序
dotnet run
你应该看到类似输出:
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36...
JS 执行结果:
{
"title": "httpbin.org",
"url": "https://httpbin.org/get",
"now": "2025-11-25T10:30:00.000Z",
"cookies": ""
}
截图已保存为 screenshot.png
📁 文件结构(运行后)
PlaywrightLinuxDemo/
├── Program.cs
├── PlaywrightLinuxDemo.csproj
└── screenshot.png ← 自动生成
🐳 (可选)Docker 部署(推荐生产环境使用)
创建 Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /app
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o out
# 运行阶段
FROM mcr.microsoft.com/dotnet/runtime:6.0
WORKDIR /app
# 安装系统依赖
RUN apt update && apt install -y \
libglib2.0-0 \
libnss3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxkbcommon0 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxrandr2 \
libgbm1 \
libasound2 \
libatspi2.0-0 \
libxss1 \
libgtk-3-0
COPY --from=build /app/out .
# 安装 Playwright 浏览器
RUN dotnet tool install --global Microsoft.Playwright.CLI && \
playwright install chromium
CMD ["dotnet", "PlaywrightLinuxDemo.dll"]
构建并运行:
docker build -t playwright-linux .
docker run --rm playwright-linux
⚠️ 常见问题解决
❌ 错误:Running as root without --no-sandbox is not supported
✅ 解决:确保启动时加了 --no-sandbox(见代码中的 Args)
❌ 错误:Failed to launch browser
✅ 解决:检查是否安装了所有系统依赖(见第一步)
❌ 想访问中文网站乱码?
✅ 解决:安装中文字体
sudo apt install -y fonts-wqy-zenhei
✅ 总结
| 步骤 | 操作 |
|---|---|
| 1. 安装 .NET SDK | apt install dotnet-sdk-6.0 |
| 2. 安装系统依赖 | apt install libglib2.0-0 libnss3 ... |
| 3. 创建项目 + 添加 Playwright 包 | dotnet add package Microsoft.Playwright |
4. 编写代码(Headless=true + --no-sandbox) |
见上方示例 |
| 5. 安装浏览器 | playwright install chromium |
| 6. 运行 | dotnet run |
这样,你就可以在 任何 Linux 服务器(包括云服务器、Docker 容器) 上,完全无头地运行浏览器并执行任意 JavaScript 代码。
如果你有具体需求(比如登录某网站、抓取动态数据、定时任务),欢迎继续提问!