在 Azure Web App 上运行 Selenium

本文关键字:运行 Selenium App Azure Web | 更新日期: 2023-09-27 18:36:39

我有一个 Azure Web 应用,我想在控制器上调用操作时使用它来筛选网站,如下所示。

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 应用时,我收到此错误

无法在 http://localhost:51169/上启动驱动程序服务

我认为这与防火墙有关,因为我需要在应用程序首次运行时在我的防火墙设置中批准 PhantomJS。我的问题是如何让它在 Azure 中部署?甚至可能吗,或者我是否需要将其配置为某些单元测试并从Visual Studio中运行它?

在 Azure Web App 上运行 Selenium

PhantomJS目前在运行Azure Web Apps的沙盒中不起作用。请参阅 wiki 以获取已知当前不起作用的内容列表,以及有关沙盒的许多其他信息。

我会重新考虑您在这里使用硒的解决方案。Selenium用于自动手动测试您的Web应用程序。基本上,自动填写表单,单击按钮等。

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

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

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

我将在这里发布这个适用于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;

听起来你应该做的是发布到 Azure WebRole。看看这个答案...https://stackoverflow.com/a/43532701/1486716