2013-06-04 11 views
19

PhantomJSをSeleniumとPythonと組み合わせて使用​​する場合、PhantomJS'sレンダリングをPDF機能に使用できますか? (つまり、Pythonの中でSeleniumを使っての動作を模倣するpage.render('file.pdf'))。Python + Selenium + PhantomJS PDFへのレンダリング

これはGhostDriverを使用しており、GhostDriverは実際に印刷の方法をあまりサポートしていないことを認識しています。

セレニウムではない別の方法が可能な場合は、私はすべて耳にします。

+0

Pypdf2を見ましたか? http://www.blog.pythonlibrary.org/tag/python-pdf-series/ – Amit

+0

@Amit:むしろ、私はいつも使っているように広範囲に渡ります。 Phaseitでさえ、「PyPDF2はHTMLの知識がない」と言いました。 HTMLを確実にレンダリングすることはありません。 – Rejected

+0

@Rejectedテスト中に正確な状態でスクリーンショットが発生する必要がありますか?または、ページを読み込んでPDFにレンダリングするだけですか? –

答えて

1

あなたはselenium.selenium.capture_screenshot('file.png')を使用することができますが、それはあなたがPDFではなくpngとしてスクリーンショットを与えるでしょう。スクリーンショットをpdfとして入手する方法はないようです。

+1

PDFは重要な要素です。私は、テキスト検索、フォーム、埋め込みメディアなどのような多くの理由で単純なイメージに落とすことはできません。 – Rejected

1

pdfkitを試みたhttp://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot

ここcapture_screenshotのためのドキュメントがありますか? HTMLページからPDFファイルをレンダリングすることができます。 @rejected

+0

私もそれを調べました。 PDFKitはHTML - > PDFを変換しますが、これ以上の機能はありません。悲しいことにPDF化する前にページに所望のコンテンツが含まれているかどうかを判断するコンテンツ分析は不可能です。 – Rejected

+0

ええ、私はPDFKitで同じ問題を抱えています、私はより高度なレンダリングをabitしたいと思います。JSフレームワークでそれを使用するのは面倒です。:( – moodh

+0

"ページに必要なコンテンツが含まれているかどうかを判断するコンテンツ分析" >あなた自身でコンテンツ分析を行うことはできません。一致していれば、それをpdfkitでレンダリングするだけで送信できます。 – Jonathan

0

、私はあなたが実際にあなたが予想よりもサブプロセス通信の詳細を活用することができるかもしれあなたがサブプロセスを使用することを望んでいない言及したが、知っている...

。理論的には、Ariya's stdin/stdout exampleを使って比較的一般的なラッパースクリプトに拡張することができます。最初にロードするページを受け入れ、そのページでテストアクションを待ち受けます(&実行)。結局、あなたは.renderをキックオフたり、エラー処理のための一般的なキャプチャを作ることができる:

try { 
    // load page & execute stdin commands 
} catch (e) { 
    page.render(page + '-error-state.pdf'); 
} 
+0

stdinを介して受け取ったコードを実行するには、 'eval'を介して行う必要があります。これをやろうとした私の経験から、それは両方のinse治癒し、信頼できない。私が間違っていない限り? – Rejected

+0

あなたは信頼性の観点からあなたの意見に慎重になりたいと思うかもしれませんが、あなたがプロセスを所有しているので、おそらくセキュリティについて心配する必要はありません。 –

+0

また、予期しないエラーが発生した場合に速くスローするために、特定のコマンドなどをホワイトリストに表示することもできます。しかし、私が想像している最良のシナリオは、スクリーンキャプチャの前に発生する可能性のあるテスト(またはその他のロジック)を別の.jsファイルに抽出し、ページにロードすることです(http://phantomjs.org/api/phantom/ method/inject-js.html)。特定のファイルJSがロードされる最大の引数をPythonに与えることができます。 –

8

ここGhostDriver のためのセレンとの特別なコマンドを使用したソリューションは、(それがGhostDriver 1.1.0とPhantomJS 1.9以降動作するはずです。 PhantomJS 1.9.8でテスト6):

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

"""Download a webpage as a PDF.""" 


from selenium import webdriver 


def download(driver, target_path): 
    """Download the currently displayed page to target_path.""" 
    def execute(script, args): 
     driver.execute('executePhantomScript', 
         {'script': script, 'args': args}) 

    # hack while the python interface lags 
    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute') 
    # set page format 
    # inside the execution script, webpage is "this" 
    page_format = 'this.paperSize = {format: "A4", orientation: "portrait" };' 
    execute(page_format, []) 

    # render current page 
    render = '''this.render("{}")'''.format(target_path) 
    execute(render, []) 


if __name__ == '__main__': 
    driver = webdriver.PhantomJS('phantomjs') 
    driver.get('http://stackoverflow.com') 
    download(driver, "save_me.pdf") 

も同じ質問hereに私の答えを参照してください。

関連する問題