簡體   English   中英

在Azure Web App上運行Selenium

[英]Running Selenium on Azure Web App

我有一個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中部署這個工作? 它是否可能,或者我是否需要將其配置為單元測試並在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就足夠了。

聽起來你應該做的就是發布到Azure WebRole。 看看這個答案... https://stackoverflow.com/a/43532701/1486716

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM