Puppeteer Sharp зависает при создании новой страницы, когда инструменты разработчика отключены
Я столкнулся с проблемой, когда Puppeteer Sharp зависает на следующей строке, когда инструменты разработчика отключены:
var page = await browser.NewPageAsync();
На нашем машине инструменты разработчика отключены. Можно ли запустить код без включенных devtools? Вот моя текущая реализация:
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);
}
Как можно изменить этот код, чтобы он работал без включенных инструментов разработчика?
Краткий ответ
Проблема возникает из-за того, что Puppeteer Sharp требует специальной конфигурации для работы без инструментов разработчика. Измените ваши LaunchOptions
, добавив Devtools = false
и аргумент --disable-devtools
, чтобы обеспечить корректный запуск браузера без включенных инструментов разработчика.
Содержание
- Проблема с DevTools
- Решение с измененным кодом
- Альтернативные подходы
- Шаги по устранению неполадок
- Лучшие практики для Puppeteer Sharp с Edge
Проблема с DevTools
Когда Puppeteer Sharp пытается создать новую страницу с отключенными инструментами разработчика, он может зависать, потому что экземпляр браузера неправильно настроен для взаимодействия с Puppeteer без протокола devtools. Это особенно актуально при использовании Microsoft Edge вместо стандартного браузера Chromium.
Основная проблема заключается в том, как Puppeteer устанавливает связь между вашим .NET-кодом и экземпляром браузера. Без правильной конфигурации этот канал связи может не работать, что приводит к зависанию вызова NewPageAsync()
.
Важное замечание: Даже если вы установите
Devtools = false
, вам все равно может потребоваться включить определенные аргументы командной строки, чтобы обеспечить запуск браузера в совместимом режиме.
Решение с измененным кодом
Вот измененная версия вашего кода, которая должна работать без включенных инструментов разработчика:
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);
}
Ключевые изменения:
-
Явное установление
Devtools = false
- Это гарантирует, что Puppeteer Sharp не будет пытаться установить соединение devtools. -
Добавление аргумента
--disable-devtools
- Это заставляет Edge запускаться без инструментов разработчика, даже если системные политики могли бы их включить. -
Добавление дополнительных аргументов совместимости - Эти аргументы помогают обеспечить более плавную работу при запуске без инструментов разработчика.
Если вы все еще сталкиваетесь с проблемами, попробуйте установить Headless = true
для запуска в headless режиме, который часто работает более надежно без инструментов разработчика:
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 обеспечивает лучшую совместимость:
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 с портом удаленной отладки:
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, может работать лучше:
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);
}
Шаги по устранению неполадок
Если вы все еще сталкиваетесь с проблемами, выполните следующие шаги по устранению неполадок:
-
Проверьте совместимость версии Edge
- Убедитесь, что вы используете поддерживаемую версию Edge (Edge 80+ лучше всего работает с Puppeteer Sharp)
- Обновите Edge до последней версии
-
Добавьте больше логирования
csharptry { 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}"); }
-
Протестируйте с разными URL
- Сначала попробуйте перейти к более простым URL
- Протестируйте как с HTTP, так и с HTTPS URL
-
Проверьте системные требования
- Убедитесь, что у вас достаточно дискового пространства для браузера
- Проверьте наличие необходимых системных разрешений
-
Попробуйте запустить с повышенными привилегиями
- Иногда запуск от имени администратора помогает, особенно на системах со строгими политиками безопасности
Лучшие практики для Puppeteer Sharp с Edge
При использовании Puppeteer Sharp с Microsoft Edge следуйте этим лучшим практикам:
-
Всегда указывайте аргументы браузера
- Включайте
--no-sandbox
и--disable-gpu
для лучшей совместимости - Добавляйте
--disable-devtools
, когда не используете инструменты разработчика
- Включайте
-
Правильно обрабатывайте таймауты
csharpvar page = await browser.NewPageAsync(); await page.SetDefaultTimeoutAsync(30000); // Таймаут 30 секунд
-
Реализуйте правильную обработку ошибок
csharptry { await page.GoToAsync("https://example.com", new NavigationOptions { Timeout = 30000 }); } catch (NavigationException ex) { Console.WriteLine($"Ошибка навигации: {ex.Message}"); // Реализуйте логику отката }
-
Используйте headless режим для production
- Headless режим обычно более стабильный и производительный
- Используйте режим с заголовком только для целей отладки
-
Регулярно обновляйте библиотеки
- Регулярно обновляйте Puppeteer Sharp до последней версии
- Держите ваш браузер Edge обновленным
Заключение
Чтобы решить проблему, когда Puppeteer Sharp зависает при создании новой страницы с отключенными инструментами разработчика:
- Измените ваши
LaunchOptions
, явно установивDevtools = false
- Добавьте аргумент
--disable-devtools
в параметры запуска браузера - Рассмотрите дополнительные аргументы для лучшей совместимости
- Если проблемы сохраняются, попробуйте запустить в headless режиме или использовать автономную версию Chromium
Ключевым является обеспечение правильной связи между вашим .NET-кодом и экземпляром браузера, что требует тщательной конфигурации как Puppeteer Sharp, так и параметров запуска браузера.
Если вы продолжаете сталкиваться с проблемами, проверьте совместимость версии вашего браузера Edge и рассмотрите возможность реализации более надежной обработки ошибок в вашем коде для диагностики потенциальных проблем.