11

Ich habe eine Azure Web App, die ich zum scrape einer Website verwenden möchte, wenn ich eine Aktion auf einem Controller aufrufen, so.Running Selenium auf Azure Web App

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; 

Dies funktioniert vor Ort in Ordnung, aber wenn ich zu meinem Azure Web App laden, bekomme ich diesen Fehler

den Treiber-Dienst auf http://localhost:51169/

Ich gehe davon aus nicht gestartet hat dies zu mache mit Firewalls, da ich PhantomJS in meinen Firewall-Einstellungen beim ersten Start der App genehmigen muss. Meine Frage ist, wie kann ich das in Azure bereitstellen? Ist es überhaupt möglich, oder muss ich das als Unit Test konfigurieren und aus Visual Studio heraus ausführen?

+2

Haben Sie jemals eine Lösung für Ihr Problem gefunden? Weil ich im selben Boot bin. – Martin

+0

Konnten Sie das jemals schaffen? Wie wäre es mit dir @Martin – paqogomez

Antwort

6

PhantomJS funktioniert heute nicht in der Sandbox, unter der Azure Web Apps ausgeführt wird. Eine Liste der Dinge, von denen bekannt ist, dass sie derzeit nicht funktionieren, sowie viele andere Informationen über die Sandbox finden Sie unter wiki.

+0

Ich sehe, wissen Sie etwas wie ChomeDriver Arbeit in Azure? –

+1

Tut mir leid, ich weiß es nicht, aber es könnte einen Versuch wert sein. Leider blockieren die GDI-Einschränkungen viele Szenarien in diesem Bereich. –

+0

Gut danke für die Info, ich werde es ausprobieren. –

0

Ich werde hier dieses Snippet, das auf Azure funktioniert. Es ist jedoch weit davon entfernt verwendbar in der Produktion, als ich zufällig einen Verbindungsfehler wie bekomme immer wieder:

konnte keine Verbindung zum Remote-Server innere Nachricht verbinden: konnte keine Verbindung zum Remote-Server innere Botschaft verbinden: Ein Versuch, den Zugriff gemacht wurde ein Socket in einer durch seine Zugriffsberechtigungen verbotenen Weise

Der genau gleiche Code funktioniert gut in einer Konsole oder Windows-Anwendungsumgebung.

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;