Selenium + ChromeDriver printToPDF

Eli*_*ins 6 python selenium selenium-chromedriver

有没有办法从python + selenium 调用chromedriver的Page.printToPDF()方法?

PhantomJS有一个类似的render()方法可以直接保存到pdf,这只能从phantomjs的特权客户端REPL获得. 这个SO答案显示了如何使用自定义phantomjs webdriver命令(/session/$sessionId/phantom/execute)调用正在运行的selenium驱动程序来调用它this.render().

是否有类似的东西可以为chromedriver做?像phantomjs的execute命令,允许调用devtools方法; 或者printToPDF通过自定义驱动程序命令直接调用的方法?

(注意:我正在尝试渲染html,这是POST的结果,所以像wkhtmltopdf这样的替代解决方案将无法工作.我可以回到使用selenium的屏幕截图 - > png,但这对于存储来说很麻烦).

Flo*_* B. 6

通过Page.printToPDFDevTool API 调用是可能的。但是,此命令是实验性的,并未在所有平台上实现:

from selenium import webdriver
import json, base64

def send_devtools(driver, cmd, params={}):
  resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
  url = driver.command_executor._url + resource
  body = json.dumps({'cmd': cmd, 'params': params})
  response = driver.command_executor._request('POST', url, body)
  if response['status']:
    raise Exception(response.get('value'))
  return response.get('value')

def save_as_pdf(driver, path, options={}):    
  # https://timvdlippe.github.io/devtools-protocol/tot/Page#method-printToPDF
  result = send_devtools(driver, "Page.printToPDF", options)
  with open(path, 'wb') as file:
    file.write(base64.b64decode(result['data']))


options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-gpu")

driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.google.co.uk/")

save_as_pdf(driver, r'page.pdf', { 'landscape': False })
Run Code Online (Sandbox Code Playgroud)

  • 啊,找到了。根据[puppeteer的printToPDF文档](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions),目前仅在无头模式下可用。当我打开它时,一切都将很快完成。 (2认同)