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
 
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
172 Beiträge
 
Delphi 12 Athens
 
#13

AW: auf EdgeBrowser.ExecuteScript warten

  Alt 28. Jun 2024, 09:48
Prima, dass es so klappt. Einfach 2 Sekunden zu warten ist natürlich nicht optimal, denn je nach Netzwerkverbindung kann es auch mal länger dauern, bis die Seite vollständig geladen ist. Oder es geht schneller und man verliert Zeit mit warten.

Deine Beispielseite habe ich mir angeschaut. Die verwendet tatsächlich ein Javascript-Framework (Angular) und lädt Daten dynamisch nach.

Der Vorgang startet auch erst im Event "DomContentloaded", daher ist das zu früh, um die Daten auszulesen. Eigentlich ist die Verwendung einer API ja ideal, weil man die Daten dann gleich dort abgreifen könnte, ohne sie umständlich aus dem Browser auszulesen. Das erfordert aber natürlich einen ganz anderen Ansatz. Sollte man eine Geschäftsbeziehung zu dem Anbieter haben, könnte man ja auch den offiziellen Weg gehen und nach einem API-Zugang fragen.

Aber nehmen wir mal an, das ist nicht möglich und möchte die Daten per Browser auslesen. Dann müsste man in NavigationCompleted ein Script ausführen, das wartet, bis die gesuchten Elemente erzeugt wurden und den HTML-Quelltext dann auslesen.

Hier ein Beispiel:
Delphi-Quellcode:
procedure TForm2.EdgeBrowser1NavigationCompleted(Sender: TCustomEdgeBrowser;
  IsSuccess: Boolean; WebErrorStatus: TOleEnum);
var
  Script: string;
begin
   Script := TFile.ReadAllText('script.js', TEncoding.UTF8);
   EdgeBrowser1.executescript(Script);
end;
Und die Datei script.js, die im Exe-Verzeichnis von Delphi liegen muss:
Code:
function waitForElements() {
    var elements = document.getElementsByClassName('productrow');
    if (elements.length > 0) {
      chrome.webview.postMessage(document.documentElement.outerHTML);      
    } else {
        setTimeout(waitForElements, 500);
    }
}

waitForElements();
Die Klasse "productrow" muss man natürlich anpassen an die Klasse der gesuchten Daten.
Natürlich ist noch der Fall zu berücksichtigen, dass keine Elemente erzeugt werden, weil eine Suche gar keine gefunden hat. Das muss eben individuell an die Seite angepasst werden.
Außerdem könnte man jetzt, nachdem man sowieso schon nach einzelnen HTML-Elementen sucht, diese auch gleich statt des gesamten Quelltextes an Delphi liefern und sich so die weitere Verarbeitung über Python sparen.
  Mit Zitat antworten Zitat
 

 

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 17:22 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