2013-06-04 48 views
19

Có thể sử dụng PhantomJS's hiển thị cho khả năng PDF khi PhantomJS đang được sử dụng kết hợp với Selenium và Python không? (ví dụ: bắt chước hành vi page.render('file.pdf') bên trong Python qua Selenium).Python + Selenium + PhantomJS hiển thị lên PDF

Tôi nhận thấy rằng điều này sử dụng GhostDriverGhostDriver không thực sự hỗ trợ nhiều trong cách in.

Nếu một giải pháp thay thế khác có thể không phải là Selenium, tôi là tất cả các tai.

+0

Bạn đã xem Pypdf2 chưa? http://www.blog.pythonlibrary.org/tag/python-pdf-series/ – Amit

+0

@Amit: Thay vào đó rộng rãi, khi tôi sử dụng nó mọi lúc. Ngay cả Phaseit cũng đã nói rằng "PyPDF2 không có kiến ​​thức về HTML". Nó sẽ không hiển thị bất kỳ HTML nào đáng tin cậy. – Rejected

+0

@ Bị từ chối bạn có cần ảnh chụp màn hình xảy ra ở trạng thái chính xác trong khi thử nghiệm không? Hay bạn chỉ đang tìm cách tải một trang và hiển thị lên PDF? –

Trả lời

1

Bạn có thể sử dụng selenium.selenium.capture_screenshot('file.png') nhưng điều đó sẽ cung cấp cho bạn ảnh chụp màn hình dưới dạng png chứ không phải pdf. Có vẻ như không phải là cách để có ảnh chụp màn hình dưới dạng pdf.

Sau đây là các tài liệu cho capture_screenshot: http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot

+1

PDF là một yếu tố quan trọng. Tôi không thể thả xuống một hình ảnh đơn giản vì vô số lý do, chẳng hạn như tìm kiếm văn bản, biểu mẫu, phương tiện nhúng, v.v. – Rejected

1

Cố gắng pdfkit? Nó có thể hiển thị các tệp PDF từ các trang html.

+0

Tôi cũng đã xem xét nó. PDFKit chuyển đổi HTML -> PDF, nhưng không có chức năng nào khác. Phân tích nội dung để xác định xem một trang có chứa nội dung mong muốn trước khi PDF'ing đáng buồn là không thể. – Rejected

+0

Vâng, tôi đang gặp vấn đề tương tự với PDFKit, tôi muốn abit dựng hình nâng cao hơn, sử dụng nó với khung công tác JS khá phức tạp .. :( – moodh

+0

"Phân tích nội dung để xác định xem trang có chứa nội dung mong muốn" - > Vâng, bạn không thể tự phân tích nội dung và nếu nó phù hợp thì bạn chỉ cần gửi nó để render bằng pdfkit. Đó là cách tôi sẽ làm điều đó – Jonathan

0

@rejected, tôi biết bạn đã đề cập không muốn sử dụng trình con, nhưng ...

Bạn thực sự có thể tận dụng truyền thông tiến trình con nhiều hơn bạn mong đợi. Về mặt lý thuyết, bạn có thể lấy Ariya's stdin/stdout example và mở rộng nó thành một tập lệnh trình bao bọc tương đối chung. Trước tiên, nó có thể chấp nhận một trang để tải, sau đó lắng nghe (& thi hành) các hành động thử nghiệm của bạn trên trang đó. Cuối cùng, bạn có thể khởi sự .render hoặc thậm chí làm cho ảnh chụp chung để xử lý lỗi:

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

Thực thi mã nhận được qua stdin sẽ cần phải được thực hiện thông qua 'eval' và từ kinh nghiệm của tôi về việc cố gắng thực hiện điều này, đó là cả hai inse chữa bệnh và không đáng tin cậy. Trừ khi tôi nhầm? – Rejected

+0

Trong khi bạn muốn thận trọng với đầu vào của mình (từ góc độ tin cậy), có thể bạn sẽ không phải lo lắng về bảo mật vì (tôi giả định) bạn sở hữu quy trình. –

+0

Bạn cũng có thể liệt kê các lệnh cụ thể trong danh sách trắng, v.v. để ném nhanh hơn các lỗi không mong muốn. Tuy nhiên, kịch bản tốt nhất tôi sẽ hình dung là bạn trích xuất các thử nghiệm của mình (hoặc logic khác) có thể xảy ra trước khi chụp màn hình vào một tệp .js riêng biệt và tải nó vào trang (http://phantomjs.org/api/phantom/ method/inject-js.html). Bạn có thể có Python tại một vượt qua tối đa một arg cho các tập tin cụ thể JS để tải. –

8

Đây là một giải pháp sử dụng selen và lệnh đặc biệt cho GhostDriver (nó nên làm việc kể từ GhostDriver 1.1.0 và PhantomJS 1.9. 6, thử nghiệm với 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") 

cũng xem câu trả lời của tôi cho câu hỏi cùng here.

Các vấn đề liên quan