Веб-задание Azure — тайм-аут при попытке открыть ChromeDriver

Я пытаюсь использовать Azure WebApps с Webjobs для тестирования приложений. Локально работает отлично. Но когда я собираю в облако, возникает проблема, указанная выше.

По-видимому, файл был найден, но он ожидает до истечения времени ожидания.

Кто-нибудь знает, как это решить? Я использую С# Selenium WebDriver.

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Diagnostics;
using System.IO;

namespace Ololu_WebJob
{
    class Program
    {
        static void Main()
        {
            IWebDriver driver = new ChromeDriver();
            driver.Url = "my_url";

            Console.WriteLine(driver.Title);

            driver.Quit();
        }
    }
}

/*
    LOG:
    [02/10/2019 12:27:51 > 7f9c27: SYS INFO] Status changed to Initializing
    [02/10/2019 12:27:51 > 7f9c27: SYS INFO] Job directory change detected: Job file 'Ololu_WebJob.exe' timestamp differs between source and working directories.
    [02/10/2019 12:27:53 > 7f9c27: SYS INFO] Run script 'chromedriver.exe' with script host - 'WindowsScriptHost'
    [02/10/2019 12:27:53 > 7f9c27: SYS INFO] Status changed to Running
    [02/10/2019 12:27:53 > 7f9c27: INFO] Starting ChromeDriver 2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1) on port 9515
    [02/10/2019 12:27:53 > 7f9c27: INFO] Only local connections are allowed.
    [02/10/2019 12:27:53 > 7f9c27: INFO] Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
    [02/10/2019 12:31:55 > 7f9c27: ERR ] Command 'cmd /c ""chromedriv ...' was aborted due to no output nor CPU activity for 121 seconds. You can increase the SCM_COMMAND_IDLE_TIMEOUT app setting (or WEBJOBS_IDLE_TIMEOUT if this is a WebJob) if needed.
    cmd /c ""chromedriver.exe""
    [02/10/2019 12:31:55 > 7f9c27: SYS INFO] Status changed to Failed
    [02/10/2019 12:31:55 > 7f9c27: SYS ERR ] System.AggregateException: One or more errors occurred. ---> Kudu.Core.Infrastructure.CommandLineException: Command 'cmd /c ""chromedriv ...' was aborted due to no output nor CPU activity for 121 seconds. You can increase the SCM_COMMAND_IDLE_TIMEOUT app setting (or WEBJOBS_IDLE_TIMEOUT if this is a WebJob) if needed.
    cmd /c ""chromedriver.exe""
       at Kudu.Core.Infrastructure.IdleManager.WaitForExit(IProcess process) in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\IdleManager.cs:line 45
       at Kudu.Core.Infrastructure.ProcessExtensions.<Start>d__12.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\ProcessExtensions.cs:line 212
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Kudu.Core.Infrastructure.Executable.<ExecuteAsync>d__31.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\Executable.cs:line 255
       --- End of inner exception stack trace ---
       at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
       at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
       at System.Threading.Tasks.Task`1.get_Result()
       at Kudu.Core.Infrastructure.Executable.ExecuteInternal(ITracer tracer, Func`2 onWriteOutput, Func`2 onWriteError, Encoding encoding, String arguments, Object[] args) in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\Executable.cs:line 216
       at Kudu.Core.Infrastructure.Executable.ExecuteReturnExitCode(ITracer tracer, Action`1 onWriteOutput, Action`1 onWriteError, String arguments, Object[] args) in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\Executable.cs:line 165
       at Kudu.Core.Jobs.BaseJobRunner.RunJobInstance(JobBase job, IJobLogger logger, String runId, String trigger, ITracer tracer, Int32 port) in C:\Kudu Files\Private\src\master\Kudu.Core\Jobs\BaseJobRunner.cs:line 272
    ---> (Inner Exception #0) ExitCode: -1, Output: Command 'cmd /c ""chromedriv ...' was aborted due to no output nor CPU activity for 121 seconds. You can increase the SCM_COMMAND_IDLE_TIMEOUT app setting (or WEBJOBS_IDLE_TIMEOUT if this is a WebJob) if needed., Error: Command 'cmd /c ""chromedriv ...' was aborted due to no output nor CPU activity for 121 seconds. You can increase the SCM_COMMAND_IDLE_TIMEOUT app setting (or WEBJOBS_IDLE_TIMEOUT if this is a WebJob) if needed., Kudu.Core.Infrastructure.CommandLineException: Command 'cmd /c ""chromedriv ...' was aborted due to no output nor CPU activity for 121 seconds. You can increase the SCM_COMMAND_IDLE_TIMEOUT app setting (or WEBJOBS_IDLE_TIMEOUT if this is a WebJob) if needed.
    cmd /c ""chromedriver.exe""
       at Kudu.Core.Infrastructure.IdleManager.WaitForExit(IProcess process) in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\IdleManager.cs:line 45
       at Kudu.Core.Infrastructure.ProcessExtensions.<Start>d__12.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\ProcessExtensions.cs:line 212
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Kudu.Core.Infrastructure.Executable.<ExecuteAsync>d__31.MoveNext() in C:\Kudu Files\Private\src\master\Kudu.Core\Infrastructure\Executable.cs:line 255<---

*/

person Marcelo Cintra    schedule 10.02.2019    source источник
comment
Просто установка URL ничего не делает. вы должны использовать driver.Navigate().GoToUrl(url);. Далее следует дождаться навигации, чтобы получить титул.   -  person Nikolaus    schedule 10.02.2019
comment
Нет, это так! Приведенный выше код является лишь примером, но он работает правильно на любом компьютере. Он показывает ошибку веб-задания Azure Webapp.   -  person Marcelo Cintra    schedule 11.02.2019


Ответы (1)


По моему опыту, вы не можете напрямую использовать selenium и chromedriver без установленного экземпляра Chrome или Chromium в Azure WebApp, как требование ChromeDriver Настройка, указанная ниже.

  • Убедитесь, что Chromium/Google Chrome установлены в распознаваемом месте

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

Однако из-за некоторых ограничений песочницы Azure WebApp, в том числе Win32k.sys (User32/GDI32) Restrictions и Local Address Requests< /a> вы не сможете запустить Chrome или Chromium без поддержки GDI через chromedriver, даже если вы загрузите переносимый дистрибутив Chrome или Chromium в Azure WebApp и настроите переменные среды.

Хотя ваша информация об ошибке не указывала на настоящую причину проблемы в вашем коде C#, я получил информацию об ошибке в Python в Azure WebApp, как показано ниже.

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

Таким образом, обходным путем является прямое использование selenium и chromedriver на виртуальной машине Azure. Или, учитывая ваш сценарий, вы можете запустить chromedriver на порту 9515 по умолчанию на виртуальной машине Azure и настроить роль NSG виртуальной машины, чтобы разрешить входящий порт 9515, а затем использовать класс OpenQA.Selenium.Remote.RemoteWebDriver для подключения удаленного веб-драйвера в Azure WebJob.

Вот пример кода для использования RemoteWebDriver, который взят из Примеры C# (CSharp) OpenQA.Selenium.Remote RemoteWebDriver.FindElement

IWebDriver webDriver = new RemoteWebDriver(new Uri("http://<vm host ip>:9515"), DesiredCapabilities.Chrome());
person Peter Pan    schedule 11.02.2019
comment
@MarceloCintra Любое обновление или беспокойство? Если мой ответ полезен для вас, не могли бы вы отметить его? - person Peter Pan; 11.03.2019