GLM 4.5 Air

Исправление зависания Puppeteer Sharp при создании новой страницы без DevTools

Узнайте, как исправить зависание Puppeteer Sharp при вызове NewPageAsync, когда инструменты разработчика отключены. Полное руководство с кодовыми решениями для автоматизации браузера Microsoft Edge.

Вопрос

Puppeteer Sharp зависает при создании новой страницы, когда инструменты разработчика отключены

Я столкнулся с проблемой, когда Puppeteer Sharp зависает на следующей строке, когда инструменты разработчика отключены:

csharp
var page = await browser.NewPageAsync();

На нашем машине инструменты разработчика отключены. Можно ли запустить код без включенных devtools? Вот моя текущая реализация:

csharp
public static async Task RunDemo()
{
    // 1. Загрузить браузер Chromium, если он еще не присутствует.
    // Это гарантирует, что у Puppeteer Sharp есть исполняемый файл браузера для управления.
    // 2. Запустить браузер в headless режиме (без видимого интерфейса).
    // Установите Headless = false, чтобы видеть окно браузера во время выполнения.

    string edgePath = GetEdgePath();
    var browser = await LaunchBrowserAsync(edgePath);
    
    // 3. Создать новую страницу в браузере.
    var page = await browser.NewPageAsync();

    // 4. Перейти по указанному URL.
    await page.GoToAsync("https://www.google.com");

    // 5. Сделать скриншот страницы и сохранить его в файл.
    string screenshotPath = Path.Combine(Directory.GetCurrentDirectory(), "google_screenshot.png");
    await page.ScreenshotAsync(screenshotPath);

    // 6. Закрыть браузер.
    await browser.CloseAsync();

    System.Console.WriteLine($"Скриншот сохранен в: {screenshotPath}");
}

public static async Task Main(string[] args)
{
    await RunDemo();
}

private static string GetEdgePath()
{
    string edgePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Microsoft", "Edge", "Application", "msedge.exe");
    return edgePath;
}

private static async Task<Browser> LaunchBrowserAsync(string edgePath)
{
    var options = new LaunchOptions
    {
        Headless = false,
        ExecutablePath = edgePath,
        Devtools = true,
        Args = new[] { "--no-sandbox", "--disable-gpu" },
        DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 }
    };

    return (Browser)await Puppeteer.LaunchAsync(options);
}

Как можно изменить этот код, чтобы он работал без включенных инструментов разработчика?

GLM 4.5 Air

Краткий ответ

Проблема возникает из-за того, что Puppeteer Sharp требует специальной конфигурации для работы без инструментов разработчика. Измените ваши LaunchOptions, добавив Devtools = false и аргумент --disable-devtools, чтобы обеспечить корректный запуск браузера без включенных инструментов разработчика.

Содержание


Проблема с DevTools

Когда Puppeteer Sharp пытается создать новую страницу с отключенными инструментами разработчика, он может зависать, потому что экземпляр браузера неправильно настроен для взаимодействия с Puppeteer без протокола devtools. Это особенно актуально при использовании Microsoft Edge вместо стандартного браузера Chromium.

Основная проблема заключается в том, как Puppeteer устанавливает связь между вашим .NET-кодом и экземпляром браузера. Без правильной конфигурации этот канал связи может не работать, что приводит к зависанию вызова NewPageAsync().

Важное замечание: Даже если вы установите Devtools = false, вам все равно может потребоваться включить определенные аргументы командной строки, чтобы обеспечить запуск браузера в совместимом режиме.


Решение с измененным кодом

Вот измененная версия вашего кода, которая должна работать без включенных инструментов разработчика:

csharp
private static async Task<Browser> LaunchBrowserAsync(string edgePath)
{
    var options = new LaunchOptions
    {
        Headless = false, // Установите в true, если нужен headless режим
        ExecutablePath = edgePath,
        Devtools = false, // Явно установлено в false
        Args = new[] 
        { 
            "--no-sandbox", 
            "--disable-gpu", 
            "--disable-devtools", // Явно отключаем devtools
            "--disable-extensions", // Отключаем расширения
            "--disable-background-timer-throttling",
            "--disable-renderer-backgrounding",
            "--disable-backgrounding-occluded-windows",
            "--disable-client-side-phishing-detection"
        },
        DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 }
    };

    return await Puppeteer.LaunchAsync(options);
}

Ключевые изменения:

  1. Явное установление Devtools = false - Это гарантирует, что Puppeteer Sharp не будет пытаться установить соединение devtools.

  2. Добавление аргумента --disable-devtools - Это заставляет Edge запускаться без инструментов разработчика, даже если системные политики могли бы их включить.

  3. Добавление дополнительных аргументов совместимости - Эти аргументы помогают обеспечить более плавную работу при запуске без инструментов разработчика.

Если вы все еще сталкиваетесь с проблемами, попробуйте установить Headless = true для запуска в headless режиме, который часто работает более надежно без инструментов разработчика:

csharp
var options = new LaunchOptions
{
    Headless = true, // Попробуйте headless режим
    ExecutablePath = edgePath,
    Devtools = false,
    Args = new[] 
    { 
        "--no-sandbox", 
        "--disable-gpu", 
        "--disable-devtools",
        "--disable-extensions",
        "--disable-background-timer-throttling",
        "--disable-renderer-backgrounding"
    },
    DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 }
};

Альтернативные подходы

Если приведенное выше решение не работает, рассмотрите эти альтернативные подходы:

1. Использование Chromium вместо Edge

Иногда использование стандартного браузера Chromium вместо Edge обеспечивает лучшую совместимость:

csharp
private static async Task<Browser> LaunchBrowserAsync()
{
    var options = new LaunchOptions
    {
        Headless = false,
        Devtools = false,
        Args = new[] 
        { 
            "--no-sandbox", 
            "--disable-gpu", 
            "--disable-devtools"
        },
        DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 }
    };

    return await Puppeteer.LaunchAsync(options);
}

2. Использование порта удаленной отладки

Вы можете попробовать запустить Edge с портом удаленной отладки:

csharp
private static async Task<Browser> LaunchBrowserAsync(string edgePath)
{
    var options = new LaunchOptions
    {
        Headless = false,
        ExecutablePath = edgePath,
        Devtools = false,
        Args = new[] 
        { 
            "--no-sandbox", 
            "--disable-gpu", 
            "--remote-debugging-port=9222",
            "--disable-devtools"
        },
        DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 }
    };

    return await Puppeteer.LaunchAsync(options);
}

3. Попробовать автономную версию Puppeteer Sharp

Автономная версия Chromium, поставляемая с Puppeteer Sharp, может работать лучше:

csharp
private static async Task<Browser> LaunchBrowserAsync()
{
    var options = new LaunchOptions
    {
        Headless = false,
        Devtools = false,
        Args = new[] 
        { 
            "--no-sandbox", 
            "--disable-gpu", 
            "--disable-devtools"
        },
        DefaultViewport = new ViewPortOptions { Width = 2000, Height = 900 },
        IgnoreHTTPSErrors = true
    };

    return await Puppeteer.LaunchAsync(options);
}

Шаги по устранению неполадок

Если вы все еще сталкиваетесь с проблемами, выполните следующие шаги по устранению неполадок:

  1. Проверьте совместимость версии Edge

    • Убедитесь, что вы используете поддерживаемую версию Edge (Edge 80+ лучше всего работает с Puppeteer Sharp)
    • Обновите Edge до последней версии
  2. Добавьте больше логирования

    csharp
    try
    {
        var browser = await Puppeteer.LaunchAsync(options);
        Console.WriteLine("Браузер успешно запущен");
        
        var page = await browser.NewPageAsync();
        Console.WriteLine("Страница успешно создана");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Ошибка: {ex.Message}");
        Console.WriteLine($"Стек вызовов: {ex.StackTrace}");
    }
    
  3. Протестируйте с разными URL

    • Сначала попробуйте перейти к более простым URL
    • Протестируйте как с HTTP, так и с HTTPS URL
  4. Проверьте системные требования

    • Убедитесь, что у вас достаточно дискового пространства для браузера
    • Проверьте наличие необходимых системных разрешений
  5. Попробуйте запустить с повышенными привилегиями

    • Иногда запуск от имени администратора помогает, особенно на системах со строгими политиками безопасности

Лучшие практики для Puppeteer Sharp с Edge

При использовании Puppeteer Sharp с Microsoft Edge следуйте этим лучшим практикам:

  1. Всегда указывайте аргументы браузера

    • Включайте --no-sandbox и --disable-gpu для лучшей совместимости
    • Добавляйте --disable-devtools, когда не используете инструменты разработчика
  2. Правильно обрабатывайте таймауты

    csharp
    var page = await browser.NewPageAsync();
    await page.SetDefaultTimeoutAsync(30000); // Таймаут 30 секунд
    
  3. Реализуйте правильную обработку ошибок

    csharp
    try
    {
        await page.GoToAsync("https://example.com", new NavigationOptions { Timeout = 30000 });
    }
    catch (NavigationException ex)
    {
        Console.WriteLine($"Ошибка навигации: {ex.Message}");
        // Реализуйте логику отката
    }
    
  4. Используйте headless режим для production

    • Headless режим обычно более стабильный и производительный
    • Используйте режим с заголовком только для целей отладки
  5. Регулярно обновляйте библиотеки

    • Регулярно обновляйте Puppeteer Sharp до последней версии
    • Держите ваш браузер Edge обновленным

Заключение

Чтобы решить проблему, когда Puppeteer Sharp зависает при создании новой страницы с отключенными инструментами разработчика:

  1. Измените ваши LaunchOptions, явно установив Devtools = false
  2. Добавьте аргумент --disable-devtools в параметры запуска браузера
  3. Рассмотрите дополнительные аргументы для лучшей совместимости
  4. Если проблемы сохраняются, попробуйте запустить в headless режиме или использовать автономную версию Chromium

Ключевым является обеспечение правильной связи между вашим .NET-кодом и экземпляром браузера, что требует тщательной конфигурации как Puppeteer Sharp, так и параметров запуска браузера.

Если вы продолжаете сталкиваться с проблемами, проверьте совместимость версии вашего браузера Edge и рассмотрите возможность реализации более надежной обработки ошибок в вашем коде для диагностики потенциальных проблем.