linux运行无头浏览器执行js代码

具体怎么实现linux运行无头浏览器执行js代码

执行过程中出错: TypeError: this.send is not a function at Hlclient.sendResult (eval at evaluate (:290:30), :113:10) at UtilityScript.evaluate (:297:18) at UtilityScript. (:1:44)

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 代码

如果你有具体需求(比如登录某网站、抓取动态数据、定时任务),欢迎继续提问!