Запуск Selenium в веб-приложении Azure
У меня есть веб-приложение 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, я получаю эту ошибку
Не удается запустить службу драйверов на http://localhost:51169/
Я предполагаю, что это связано с брандмауэрами, так как мне нужно утвердить PhantomJS в настройках брандмауэра при первом запуске приложения. Мой вопрос в том, как заставить это работать в Azure? Возможно ли это, или мне нужно настроить это как некоторый модульный тест и запустить его из Visual Studio?
3 ответов
PhantomJS не работает сегодня в песочнице, в которой работают веб-приложения Azure. Вижу wiki для списка вещей, которые, как известно, не работают в настоящее время, а также много другой информации о песочнице.
я опубликую здесь этот фрагмент, который работает в 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;
Я бы переосмыслил ваше решение об использовании Селена здесь. Селен используется для автоматизации ручного тестирования веб-приложений. В принципе, автоматизируйте заполнение формы, нажмите кнопку и т. д.
даже если Selenium и драйвер PhantomJS работают на вашем Azure webapp без проблем, у вас будет узкое место одного браузера на 1 Http-запрос. Я подозреваю, что вы столкнетесь с проблемами производительности в ближайшее время.
кроме того, время, необходимое водителям для загрузки PhantomJS, запрашивает страница, взаимодействие и закрытие PhantomJS происходит медленно.
в вашем случае похоже, что вы не взаимодействуете с исходным сайтом, вам просто нужны данные. Поэтому, возможно, просто разбора HTML DOM будет достаточно.