22

PhantomJS's当 PhantomJS 与 Selenium 和 Python 结合使用时,是否可以使用渲染到 PDF 功能?page.render('file.pdf')(即通过 Selenium模拟Python 内部的行为)。

我意识到这使用GhostDriver,并且GhostDriver在打印方式上并没有真正支持太多。

如果不是 Selenium 的另一种选择是可能的,我全神贯注。

4

4 回答 4

11

这是一个使用 selenium 和 GhostDriver 特殊命令的解决方案(它应该从 GhostDriver 1.1.0 和 PhantomJS 1.9.6 开始工作,用 PhantomJS 1.9.8 测试):

#!/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")

另请参阅我对同一问题的回答

于 2015-02-01T23:21:30.020 回答
1

你可以使用selenium.selenium.capture_screenshot('file.png'),但这会给你一个png而不是pdf的屏幕截图。似乎没有办法将屏幕截图作为 pdf 格式获取。

以下是 capture_screenshot 的文档:http ://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot

于 2014-03-30T22:29:43.190 回答
1

试过pdfkit吗?它可以从 html 页面呈现 PDF 文件。

于 2014-04-02T10:13:24.283 回答
0

@rejected,我知道您提到不想使用子流程,但是...

实际上,您可能能够比您预期的更多地利用子流程通信。从理论上讲,您可以采用Ariya 的 stdin/stdout 示例并将其扩展为相对通用的包装脚本。它可能首先接受要加载的页面,然后在该页面上侦听(并执行)您的测试操作。最终,您可以启动.render甚至进行通用捕获以进行错误处理:

try {
  // load page & execute stdin commands
} catch (e) {
  page.render(page + '-error-state.pdf');
}
于 2014-04-04T18:20:25.463 回答