Selenium/Webdriver: .execute_script() error wenn string zu lang ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DevNick
User
Beiträge: 2
Registriert: Freitag 19. Januar 2024, 16:41

Hallo zusammen,

ich hab nen Code erstellt, mit dem man ein HTML Code als PDF herunterladen kann. Dabei sendet der User den HTML Code (der zu einem PDF werden soll) an mein Django Backend.
Selenium öffnet dann eine Seite, fügt das HTML mit driver.execute_script() ein und anschließend erstellt er ein PDF mit
driver.execute_cdp_cmd("Page.printToPDF", settings)
.

Das Problem: Manchmal sind auch Bilder im HTML Code, welche ziemlich groß sind und daher einen langen String erzeugen.

Wenn der String eine Länge unter ca. 33.500.000 hat funktioniert der Code.
Ist der String allerdings Länger bekomme ich diesen Fehler:

Code: Alles auswählen

Internal Server Error: /
Traceback (most recent call last):

...

selenium.common.exceptions.WebDriverException: Message: unknown error: Runtime.callFunctionOn threw exception: SyntaxError: Unexpected token ')'
  (Session info: chrome-headless-shell=120.0.6099.225)
Stacktrace:
        GetHandleVerifier [0x00D26EE3+174339]
        (No symbol) [0x00C50A51]
        (No symbol) [0x00966FF6]
        (No symbol) [0x0096AC51]
        (No symbol) [0x0096C7C1]
        (No symbol) [0x009CACD8]
        (No symbol) [0x009B700C]
        (No symbol) [0x009CA104]
        (No symbol) [0x009B6DA6]
        (No symbol) [0x00991034]
        (No symbol) [0x00991F8D]
        GetHandleVerifier [0x00DC4B1C+820540]
        sqlite3_dbdata_init [0x00E853EE+653550]
        sqlite3_dbdata_init [0x00E84E09+652041]
        sqlite3_dbdata_init [0x00E797CC+605388]
        sqlite3_dbdata_init [0x00E85D9B+656027]
        (No symbol) [0x00C5FE6C]
        (No symbol) [0x00C583B8]
        (No symbol) [0x00C584DD]
        (No symbol) [0x00C45818]
        BaseThreadInitThunk [0x76A0FCC9+25]
        RtlGetAppContainerNamedObjectPath [0x77637C6E+286]
        RtlGetAppContainerNamedObjectPath [0x77637C3E+238]
Ich verstehe nicht warum er mir Unexpected token ')' ausgibt, denn ich habe definitiv keinen Syntax Fehler. Der Code funktioniert 1:1, nur mit kleineren Bilder.

Ich vermute eher, dass driver.execute_script() nicht mehr als 33.500.000 Zeichen verarbeiten kann, oder dass der Webdriver beim ausführen des Scripts "abstürzt".
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

Das hat halt niemand bedacht, dass jemand mehr als 33MB übergibt. Das ist ein Bug in selenium. Ich halte das eh nicht für eine Gute Idee, beliebigen fremden Code auf Deinem Server auszuführen. Es gibt ja durchaus Bibliotheken, die HTML in PDF umwandeln können, die dafür auch gemacht sind.
DevNick
User
Beiträge: 2
Registriert: Freitag 19. Januar 2024, 16:41

Also Bibliotheken wie:
  • jspdf
  • html2canvas
  • xhtml2pdf
  • wkhtmltopdf
  • usw.
habe ich zuvor ausprobiert. Das Problem ist aber, dass diese kein CSS3 können/nicht alle CSS Styles umsetzten können. Ich habe bisher keine Bibliothek gefunden, die postions: absolute; und clip-path konnten, daher ja der Aufriss mit Selenium.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist halt, das dein use-case extrem ist. Ich sehe zwei Moeglichkeiten:

- den WebDriver anzuschauen, und diese Limitierung zu entfernen. Das bedeutet im Zweifel C++-Entwicklung, und vielleicht sogar Browser-seitig.
- einen Workaround fuer diese riesen Bilder finden. Ich kenne mich mit PDF nicht besonders gut aus, aber eine denkbare Moeglichkeit waere zB die Bilder durch gleich-grosse Platzhalter zu ersetzen, die dann irgendwie in einem Post-Processing-Schritt mit den originalen ausgetauscht werden.
Antworten