Запуск Selenium на Azure Web App

У меня есть веб-приложение Azure, которое я хочу использовать для экранирования веб-сайта, когда я вызываю действие на контроллере, например.

var driver = new PhantomJSDriver();
driver.Url = "http://url.com";
driver.Navigate();
var source = driver.PageSource;
var pathElement = driver.FindElementByXPath("//table[@class='someclassname']");

string innerHtml = "";
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
if (js != null)
{
    innerHtml = (string)js.ExecuteScript("return arguments[0].innerHTML;", pathElement);
}
return innerHtml;

Это работает нормально локально, однако, когда я загружаю в свое Azure Web App, я получаю эту ошибку

Не удается запустить службу драйвера на http://localhost:51169/

Я предполагаю, что это связано с брандмауэрами, поскольку мне нужно одобрить PhantomJS в настройках моего брандмауэра при первом запуске приложения. Мой вопрос в том, как мне заставить это работать в Azure? Возможно ли это, или мне нужно настроить это как часть Unit Test и запустить его из Visual Studio?

Ответ 1

PhantomJS сегодня не работает в песочнице, в которой работают Azure Web Apps. См. wiki для списка вещей, которые, как известно, не работают в настоящее время, а также много другой информации о песочнице.

Ответ 2

Я опубликую здесь этот фрагмент, который работает на Azure. Однако он не может использоваться в производстве, так как я продолжаю получать случайные ошибки соединения, такие как:

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

Точный же код хорошо работает в среде приложений консоли или Windows.

PhantomJSDriver driver = null;
        PhantomJSDriverService service;

        ServicePointManager.ServerCertificateValidationCallback = new
            RemoteCertificateValidationCallback
            (
               delegate { return true; }
            );

        int retry = 0;

        while (driver == null && retry < 3)
        {
            try
            {
                service = PhantomJSDriverService.CreateDefaultService();
                var uri = service.ServiceUrl;
                var port = service.Port;
                service.LocalToRemoteUrlAccess = true;
                var ghostDriverPath = service.GhostDriverPath;
                service.HideCommandPromptWindow = true;
                service.Start();

                var options = new PhantomJSOptions();
                driver = new PhantomJSDriver(service, options);
            }
            catch (Exception ex)
            {
                if (driver != null)
                {
                    driver.Close();
                    driver.Quit();
                    driver = null;
                }
                Thread.Sleep(retry * 1500);

                ServiceAudit.Default.TraceDebug($"Starting web driver failed on {retry} try");
            }
            retry++;
        }

        if (driver == null)
        {
            ServiceAudit.Default.TraceError($"Web driver could not be started");
        }

        return driver;

Ответ 3

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

Даже если Selenium и ваш драйвер PhantomJS работают в вашем веб-приложении Azure без проблем, у вас будет узкое место - один браузер на 1 запрос Http. Я подозреваю, что вы очень скоро столкнетесь с проблемами производительности.

Кроме того, время, которое требуется драйверам для загрузки PhantomJS, запроса страницы, взаимодействия и закрытия PhantomJS, невелико.

В вашем случае кажется, что вы не взаимодействуете с исходным сайтом, вам просто нужны данные. Так что, возможно, достаточно просто разобрать HTML DOM.

Ответ 4

Похоже, что вы должны делать, это публиковать в Azure WebRole. Проверьте этот ответ... fooobar.com/info/13578829/...