AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi auf EdgeBrowser.ExecuteScript warten
Thema durchsuchen
Ansicht
Themen-Optionen

auf EdgeBrowser.ExecuteScript warten

Ein Thema von herik · begonnen am 27. Jun 2024 · letzter Beitrag vom 28. Jun 2024
Antwort Antwort
herik

Registriert seit: 17. Okt 2007
Ort: Spitzkunnersdorf / Sachsen
15 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 27. Jun 2024, 10:48
gubbe ich bin dir sehr dankbar für deine Hilfe.

Zitat:
Es kann natürlich sein, dass das HTML im Browser noch durch Javascript abgeändert wird. Du fragst ja mit document.documentElement.outerHTML nicht den eigentlichen HTML-Quellcode an, der geladen wurde, sondern den aktuellen Stand zum Zeitpunkt der Ausführung. Wenn jetzt Javascript selbst auf das "onload" wartet und Daten nachlädt, sieht das Ergebnis einige Zeit später anders aus.
Ich denke mal das es genau das Problem ist. Und die Lösung die Du mir hier bietest ist mir sehr sympathisch!
Allerdings funktioniert es noch nicht wie es soll. Ich will mir ja auch nicht alles vorkauen lassen, aber ich habe wirklich keinen Plan von JavaScript. Deswegen kann ich es auch nicht wirklich nachvollziehen. Der Grundgedanke ist mir aber klar.

So bin ich jetzt vorgegangen:

Ich habe jetzt im Objectinspektor im EdgeBrowser1 "ONWebMessageReceived" mit deiner Procedure versehen.

Im "TForm2.EdgeBrowser1NavigationCompleted" habe ich folgende Zeile eingefügt.

EdgeBrowser1.ExecuteScript('document.addEventListener("DOMContentLoaded", (event) => { chrome.webview.postMessage(document.documentElement.outerHTML);});');
Eigentlich sollte ja jetzt nach dem die Webmessage kommt das Showmessage aktiv werden. Aber leider tut sich da nix.


Jetzt ist die Frage, ob die Message gesendet wird oder ich sie nicht empfange.
Erik
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.197 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 27. Jun 2024, 10:57
Ich bin da jetzt nicht so fit, aber wer garantiert, dass der Zug in TEdgeBrowser.OnNavigationCompleted nicht schon abgefahren ist, also auf Browser-Seite das DOMContentLoaded schon bereits lange ausgelöst wurde?
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 27. Jun 2024, 11:12
Ich bin da jetzt nicht so fit, aber wer garantiert, dass der Zug in TEdgeBrowser.OnNavigationCompleted nicht schon abgefahren ist, also auf Browser-Seite das DOMContentLoaded schon bereits lange ausgelöst wurde?
Ich garantiere das nicht

So verwende ich das auch nicht und es war erst mal eine Idee, um den richtigen Zeitpunkt zum Auslesen zu finden.

Woran es liegt, kann man ja testen.

EdgeBrowser1.ExecuteScript('chrome.webview.postMessage(document.documentElement.outerHTML)');

Dann wird das Postmessage direkt aufgerufen. Kommt die Nachricht an? Wenn ja, ist es tatsächlich so, dass DOMContentLoaded schon aufgerufen wurde, bevor der Eventhandler in OnNavigationCompleted gesetzt werden konnte. Dann müsste man dem zuvorkommen oder das Event in Delphi abfangen. Würde ich dann genauer beschreiben.
  Mit Zitat antworten Zitat
herik

Registriert seit: 17. Okt 2007
Ort: Spitzkunnersdorf / Sachsen
15 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 27. Jun 2024, 12:16
Ich habe es jetzt nochmal in einem frischen Projekt getestet um mögliche Einflüsse auszuschließen.
Dabei bin ich auf EdgeBrowser1.WebMessageEnabled:=true; gekommen, was ich bei mir im eigentlichen Projekt drinnen hatte.

Dieses habe ich nun ausgeblendet und dann funktioniert das hier.
EdgeBrowser1.ExecuteScript('window.chrome.webview.postMessage(document.documentElement.outerHTML)'); Jetzt stellt sich mir aber gerade die Frage, aktiviere ich nicht damit eigentlich Webmessages??? Naja, das scheint auf jeden Fall erstmal ein Grund gewesen zu sein!

Jetzt wo ja die Webmassage definitiv empfangen wird, wollte ich nun das hier testen:
EdgeBrowser1.ExecuteScript('document.addEventListener("DOMContentLoaded", (event) => { chrome.webview.postMessage(document.documentElement.outerHTML);});'); und das funktioniert weiterhin nicht.

Also wird jetzt "Der schöne Günther" den Finger schon drauf haben.

Wenn nun das
Code:
TEdgeBrowser.OnNavigationCompleted
zu spät ist, wann ist es dann sinnvoll das "ExecuteScript" zu starten.
Erik
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 27. Jun 2024, 14:36
Das EdgeBrowser1.WebMessageEnabled:=true; funktioniert bei mir auch nicht. Da gibt es wohl einen Bug beim Setzen der Eigenschaft, vielleicht beim Konvertieren des Delphi-Boolean in den Integer-Wert, den das Interface erwartet. Werde ich mir mal genauer anschauen, denn vielleicht sind noch andere Eigenschaften betroffen.
Aber der Default-Wert ist bereits True, daher müssen wir es hier nicht setzen.

Das DOMContentLoaded bringt Dir wohl nichts, wenn es schon ausgelöst wurde, bevor in Delphi TEdgeBrowser.OnNavigationCompleted aufgerufen wird.
Das Prinzip, auf etwas zu warten und dann per Javascript das Ergebnis per Postmessage zurückzugeben, funktioniert aber.

Man müsste jetzt die Seite genauer kennen und schauen, was sie noch nach dem Laden macht und wann sie tatsächlich fertig ist.
Zum Beispiel in Chrome laden und den Entwicklertools genauer reinschauen.

Nur zum Test kannst Du aber auch mal eine Verzögerung einbauen, z.B. mit einem Timer in Delphi oder per Javascript:

  EdgeBrowser1.executescript('setTimeout(() => {chrome.webview.postMessage(document.documentElement.outerHTML);}, "2000");'); Ist der Quelltext dann komplett?
  Mit Zitat antworten Zitat
herik

Registriert seit: 17. Okt 2007
Ort: Spitzkunnersdorf / Sachsen
15 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 28. Jun 2024, 04:45
Ich habe jetzt noch ein wenig getestet und versucht. Es sei noch gesagt, dass es nicht nur eine Seite die ich auslesen will. Es sind verschiedene.

Wie "Der schöne Günther" ja schon vermutet hatte, ist der Zug im
Code:
EdgeBrowser1NavigationCompleted
schon abgefahren. Also muss ein Zeitpunkt gefunden werden, wo ich noch auf den Zug aufspringen kann.

Das habe ich jetzt so realisiert:

Delphi-Quellcode:
procedure TForm2.EdgeBrowser1NavigationStarting(Sender: TCustomEdgeBrowser;
  Args: TNavigationStartingEventArgs);
begin
  EdgeBrowser1.ExecuteScript('document.addEventListener("DOMContentLoaded", (event) => { chrome.webview.postMessage(document.documentElement.outerHTML);});');
  //EdgeBrowser1.executescript('setTimeout(() => {chrome.webview.postMessage(document.documentElement.outerHTML);}, "2000");');
end;
als nächstes:

Delphi-Quellcode:
procedure TForm2.EdgeBrowser1WebMessageReceived(Sender: TCustomEdgeBrowser;
  Args: TWebMessageReceivedEventArgs);
var
  WebMessage: PWidechar;
begin
  args.ArgsInterface.TryGetWebMessageAsString(PWidechar(WebMessage));
  //showmessage(Webmessage);
  WebsiteContent_SL.Text:=WebMessage;
  //TFile.writeAllText('Quelltext.txt', WebsiteContent_SL.Text, TEncoding.UTF8);
  DatenAbgreifen;
end;
hierbei lasse ich ja jetzt aber das hier vollkommen aus:

Delphi-Quellcode:
procedure TForm2.EdgeBrowser1ExecuteScript(Sender: TCustomEdgeBrowser;
  AResult: HRESULT; const AResultObjectAsJson: string);
var
  json: TJSONValue; //neu
begin
  json := TJSONObject.ParseJSONValue(AResultObjectAsJson);
  WebsiteContent_SL.Text:=json.AsType<string>;
  Showmessage(IntToStr(Length(WebsiteContent_SL.Text)));
  //TFile.writeAllText('Quelltext.txt', WebsiteContent_SL.Text, TEncoding.UTF8);
  json.Free;
  //DatenAbgreifen;
end;
Kann ich denn auch bei dem
Code:
EdgeBrowser1WebMessageReceived
schon an das JsonObject kommen?
Erik
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 28. Jun 2024, 07:09
Ist "NavigationStarting" nicht viel zu früh?

Hier ist eine schöne Grafik, die den Ablauf zeigt:
https://learn.microsoft.com/de-de/mi...igation-events

An der Stelle ist ja noch gar nichts geladen und man kann die Navigation sogar noch verhindern. Es würde mich wundern, wenn man hier per Javascript schon Event-Handler setzen könnte. Theoretisch müsste das Script noch im Kontext der vorherigen Seiten ausgeführt werden. Wenn Du aber erfolgreich eine Rückmeldung kriegst, hast Du vielleicht Glück und die Scriptausführung wird verzögert bis zum Laden der Seite. Muss ich auch mal ausprobieren.

In der Grafik sieht man aber auch, dass NavigationCompleted nach DomContentloaded aufgerufen wird. Mein Beispiel mit DomContentloaded war hier also nicht sehr hilfreich, auch wenn es bei meinem Test funktionierte.

Also eigentlich wäre NavigationCompleted in Delphi das passende Ereignis, um den Quelltext auszulesen, da hier auch schon Bilder, Scripte etc. geladen sind. Wobei man nur für das Auslesen des Quelltextes evtl. gar nicht möchte, dass Bilder geladen werden, aber das ist ein anderes Thema. Man könnte auch direkt über einen HTTP-Aufruf den Quelltext lesen. Den Browser nutzt man, wenn man man einen Benutzer simulieren muss oder damit Javascript ausgeführt wird. Nur ist in NavigationCompleted zwar alles geladen, aber die Scripte starten teilweise auch erst dann, wenn sie z.B. auf "OnLoad" im Browser warten oder asynchron geladen werden.

Aber um die letzte Frage zu beantworten: Das JSON-Objekt brauchst Du hier ja nicht, weil nur ein String übermittelt wird. Es wäre aber möglich, auch JSON-Daten zu senden und in WebmassageReceived mit args.ArgsInterface.Get_webMessageAsJson auszulesen.

Die PN mit den Beispielwebseiten habe ich erhalten und schaue sie mir später an.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz