在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就足够了。
- ASP.NET Core Web API:程序不包含适用于入口点的静态“Main”方法
- 如何在ASP.NET MVC 4 Web API中测试自定义DelegatingHandler?
- WebAPI 2属性路由,区域不起作用
- 控制器动作命名约定
- 使用表单发布validationOAuth承载令牌
- entity framework在Web api / MVC中使用异步控制器进行处理
- 如何从HttpResponseMessage检索传递的exception(HttpStatusCode,Exception)
- 如何使用自定义标头将任意JSON数据发送到REST服务器?
- ASP.NET Web API:如果从资源设置错误消息,则模型有效