Сбой запуска Chrome в функциях Azure: была предпринята попытка получить доступ к сокету способом, запрещенным его правами доступа

#azure #selenium #selenium-chromedriver #azure-functions #chromium

#azure #selenium #selenium-chromedriver #azure-функции #chromium

Вопрос:

Я написал веб-бота, который использует Selenium framework для обхода. Установил ChromeDriver 72.0.3626.69, а также загрузил Chromium 72.0.3626.121. Приложение инициализирует ChromeDriver с помощью этого включенного двоичного файла Chromium (а НЕ локально установленного двоичного файла Chrome). Все это отлично работает на моем компьютере локально.

Сейчас я пытаюсь перенести приложение в функции Azure. Я написал функцию, протестировал ее, и она отлично работает локально. Но как только я публикую его в Azure Functions, происходит сбой примерно из-за 182 ошибок типа:

Была предпринята попытка получить доступ к сокету способом, запрещенным его правами доступа

Я знаю, что это происходит из-за превышения пределов TCP-соединения Azure sandbox, но единственной попыткой здесь было создать экземпляр ChromeDriver (пока даже никуда не перемещаться!)

Вот скриншот журнала вызовов функций Azure.

введите описание изображения здесь

Эта ошибка появляется примерно 182 раза подряд, и это в основном просто попытка создать экземпляр браузера (или, если быть точным, экземпляр ChromeDriver — не могу быть уверен, что проблема вызвана Chromium или ChromeDriver).

Вопрос: У кого-нибудь возникали проблемы с ChromeDriver / Chromium, создающим так много (явно избыточных) подключений при запуске? И что может помочь избежать этого.

Если это поможет, это в основном фрагмент кода, который завершается сбоем в последней строке:

 ChromeOptions options = new ChromeOptions();
options.BinaryLocation = this.chromePath;
options.AddArgument("no-sandbox");
options.AddArgument("disable-infobars");
options.AddArgument("--disable-extensions");
if (this.headlessMode)
{
    options.AddArgument("headless");
}
options.AddUserProfilePreference("profile.default_content_setting_values.images", 2);

Log.LogInformation("Chrome options compiled. Creating ChromeDriverService...");

var driverService = ChromeDriverService.CreateDefaultService(this.driverPath);
driver = new ChromeDriver(driverService, options, timeout);
  

Ответ №1:

Я полагаю, что вы запускаете эту функцию в функциональном приложении Windows, на которое распространяется довольно много ограничений, как описано в этой wiki.

Но при запуске в Linux функции в основном выполняются в контейнере docker, устраняя большинство этих ограничений, которые есть в Windows. Я считаю, что то, что вы пытаетесь, должно быть возможно там.

Вы могли бы либо просто развернуть свою функцию в функциональном приложении Linux, либо даже создать контейнер и использовать его напрямую.