2017-12-19 4 views
0

Ich arbeite an einem Winforms-Projekt in VS2017. Ich benutze das Geckofx45 Version 45.0.33 Nuget Paket vom 17.11.2017. Ich habe das Projekt für 32-Bit eingerichtet.GeckoFx45 Document Header, Körper sind leer

Die initializer ist codiert als: der

public MainForm(IConfigurationRoot configuration) 
{ 
    InitializeComponent(); 

    ... 

    WebDisplay = new GeckoWebBrowser() 
    { 
     Dock = DockStyle.Fill 
    }; 

    WebDisplay.Navigate("https://www.google.com/"); 
    while (WebDisplay.IsBusy) 
     Application.DoEvents(); 

    GeckoHtmlElement payloadElement = WebDisplay 
     .Document 
     .GetHtmlElementById("viewport"); 

    ... 
} 

Lassen Sie brechen hier und beobachten Sie das Problem:

[STAThread] 
static void Main() 
{ 
    ... 

    Xpcom.Initialize("Firefox"); 

    .... 
} 

Der aktuelle Proof-of-Concept-Code in der Hauptform Konstruktor zur Zeit etwa wie folgt aussieht . Das Browser-Steuerelement wird in der erwarteten Form gerendert und zeigt die Google-Startseite. Wenn ich mit der rechten Maustaste auf das Steuerelement für Quelle anzeigen klicke, sehe ich den HTML-Code, den ich vom Navigationsziel erwarte. Alles checkt in der UX-Ebene aus.

Allerdings muss ich im DOM stöbern, und meine Abfragen kommen alle null zurück. Nicht nur GetHtmlElementById kann nichts zurückgeben, weitere Exploration der Document-Eigenschaft (oder die DomDocument-Eigenschaft oder eines der anderen DOM-Accessoren, die ich gesehen habe) zeigen 2 Kinder auf der Wurzel (Header, Body), die beide sind leer: WebDisplay.Document.Body.HasChildNodes = false.

Der Kicker ist, das Steuerelement ist klar Rendering der erwartete Inhalt; Es ist die API, die nichts als ein leeres Header- und Body-Element zeigt.

Was mache ich hier falsch? Vielen Dank!

Antwort

0

In Ordnung, ich war in der Lage, dies zu sortieren. Wie vermutet, war dies ein Timing-Problem. Der Versuch, IsBusy zu verwenden (ein Vorschlag, den ich hier auf SO gefunden habe) reicht nicht aus, um sicherzustellen, dass das DOM vor der Abfrage geladen wird.

In meinem Anwendungsfall muss ich in der Lage sein, Inhalt dynamisch in das DOM bei der ersten Anzeige des Formulars zu rendern. Um dies zu tun, muss das DocumentCompleted Ereignis verwendet werden:

WebDisplay.DocumentCompleted 
    += new EventHandler<GeckoDocumentCompletedEventArgs>(WebDisplay_DocumentCompleted); 

Den Versuch, das DOM aus dem Formular-Konstruktor zur Abfrage wird nicht funktionieren. Prost!