#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, либо даже создать контейнер и использовать его напрямую.