2014-04-17 10 views
8

ausführen Ich suche nach PDF-Rendering mit PhantomJS über GhostDriver, nicht nur PDF zu rendern. Als ich am nächsten Code zu verwenden, dann Seite normalerweise geladen:Wie Webpage Code mit PhantomJS über GhostDriver (Selen)

from selenium import webdriver 

driver = webdriver.PhantomJS('./node_modules/phantomjs/bin/phantomjs') 
driver.set_window_size(1024, 768) 
driver.get('http://stackoverflow.com') 

Wenn ich das nächste Skript über die Befehlszeile verwenden https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js dann perfekt pdf erzeugt.

Jetzt möchte ich Skript ausführen wie rasterize.js (page.render('file.pdf')) aber über webdriver. webdriver hat execute_script Methode, aber es sieht aus wie PhantomJS Code-Bewertung und keinen Zugriff auf webpage Instanz Kontext. Auch webdriver hat get_screenshot_as_base64 Methode, aber es gibt nur png zurück.

Ich verwende die neuesten Versionen von selenium, phantomjs, nodejs.

Also meine Frage, wie ich Zugriff auf PhantomJS Webseite Instanz über GhostDriver erhalten und render Methode bewerten?

+0

Ich suche das, auch ... irgendjemand? – j040p3d20

+0

Für nur PDF-Generierung (nicht 'GhostDriver' oder' WebDriver') können Sie 'ghost.py' (brauchen QT), Wrapper mit' pyexecjs' oder 'subprocesses' verwenden. Es existieren auch Python-Pakete als 'pdfkit' und' wkhtmltopdf' als Wrapper für 'wkhtmltopdf' - es sollte dieselben Ergebnisse haben, da auch webkit. 'weasyprint' auch gut aber nicht webkit. – tbicr

Antwort

9

Es gibt eine spezielle Art und Weise PhantomJS Skript von GhostDriver, mit dem nächsten Befehl auszuführen:

POST /session/id/phantom/execute 

Es wurde aufgenommen in GhostDriver v1.1.0, so sollte es da PhantomJS v.1.9.6 arbeitet.

Schauen Sie sich das Beispiel:

def execute(script, args): 
    driver.execute('executePhantomScript', {'script': script, 'args' : args }) 

driver = webdriver.PhantomJS('phantomjs') 

# hack while the python interface lags 
driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute') 

driver.get('http://stackoverflow.com') 

# set page format 
# inside the execution script, webpage is "this" 
pageFormat = '''this.paperSize = {format: "A4", orientation: "portrait" };''' 
execute(pageFormat, []) 

# render current page 
render = '''this.render("test.pdf")''' 
execute(render, []) 

Beachten Sie, dass in OS X PhantomJS renders web page as images mit nicht wählbaren Text, aufgrund der Beschränkungen von Qt-Rendering-Engine in OS X (zumindest mit PhantomJS v.1.9.8 und früher).

+0

Und für Nicht-Python-Implementierungen? Gibt es eine Möglichkeit, dies in Java oder einer anderen Implementierung als Python zu tun? – Tibbers

Verwandte Themen