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

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

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

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

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

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

enter image description here

Эта ошибка появляется около 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 Ответ

0 голосов
/ 12 марта 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...