在Azure Web App上运行Selenium

我有一个Azure Web应用程序,当我在控制器上调用Action时,我想用它来屏幕抓取网站,就像这样。

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 testing并在Visual Studio中运行?

PhantomJS今天在Azure Web Apps运行的沙箱中不起作用。 请参阅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的解决方案。 Selenium用于自动化webapp的手动测试。 基本上,自动填写表单,单击按钮等。

即使Selenium和您的PhantomJS驱动程序确实在Azure webapp上运行没有问题,每1 Http请求也会有一个浏览器的瓶颈。 我怀疑你很快会遇到性能问题。

此外,驱动程序加载PhantomJS,请求页面,交互和关闭PhantomJS所需的时间很慢。

在您的情况下,听起来您没有与源站点交互,只需要数据。 所以也许只需解析HTML DOM就足够了。