2013-06-04 15 views
19

Czy można używać funkcji renderowania PhantomJS's do PDF, gdy PhantomJS jest używany w połączeniu z Selenium i Python? (tj. zachowanie mimik page.render('file.pdf') zachowanie wewnątrz Python przez Selenium).Python + Selenium + PhantomJS render do PDF

Zdaję sobie sprawę, że używa to GhostDriver, a GhostDriver tak naprawdę nie obsługuje wiele w sposobie drukowania.

Jeśli możliwa jest inna alternatywa, która nie jest selenem, jestem uszy.

+0

Czy obejrzałeś Pypdf2? http://www.blog.pythonlibrary.org/tag/python-pdf-series/ – Amit

+0

@Amit: Raczej szeroko, ponieważ używam go cały czas. Nawet Phaseit sami powiedzieli, że "PyPDF2 nie ma wiedzy o HTML". Nie będzie renderować żadnego HTML. – Rejected

+0

@ Czy chcesz, aby zrzut ekranu wystąpił dokładnie w trakcie testu? A może chcesz załadować stronę i renderować do formatu PDF? –

Odpowiedz

1

Można użyć selenium.selenium.capture_screenshot('file.png'), ale to da ci zrzut ekranu jako png, a nie pdf. Wygląda na to, że nie ma sposobu na zrzut ekranu jako pliku pdf.

Oto docs dla capture_screenshot: http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot

+1

PDF jest kluczowym czynnikiem. Nie mogę sprowadzić się do prostego obrazu z wielu powodów, takich jak wyszukiwanie tekstu, formularze, media osadzone itp. – Rejected

1

Wypróbowane pdfkit? Może renderować pliki PDF ze stron html.

+0

Zajrzałem również do tego. PDFKit konwertuje HTML -> PDF, ale nie ma żadnej dodatkowej funkcjonalności. Analiza zawartości w celu ustalenia, czy strona zawiera pożądaną treść przed smutnym pobraniem pliku PDF, nie jest możliwa. – Rejected

+0

Tak, mam takie same problemy z PDFKit, chciałbym abit bardziej zaawansowane renderowanie, korzystanie z niego w ramach JS jest dość kłopotliwe .. :( – moodh

+0

"Analiza zawartości w celu ustalenia, czy strona zawiera pożądaną zawartość" - > Cóż, nie możesz sam przeprowadzić analizy zawartości i jeśli to się zgadza, po prostu wyślij ją do renderowania za pomocą pakietu pdfkit. Tak ja bym to zrobił – Jonathan

0

@rejected, wiem, że nie wspomniano chcąc skorzystać podprocesów, ale ...

może rzeczywiście być w stanie wykorzystać komunikacja podproces więcej niż przewidywano. Teoretycznie można wziąć Ariya's stdin/stdout example i rozszerzyć go na stosunkowo ogólny skrypt otoki. Może najpierw zaakceptować ładowanie strony, a następnie nasłuchiwać (wykonanie &) swoich akcji testowych na tej stronie. Ostatecznie, można skopać .render lub nawet uczynić rodzajowe przechwytywania dla obsługi błędów:

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

Wykonanie kodu otrzymanego przez stdin powinno być wykonane przez 'eval', a także z moich doświadczeń próbowania tego, to zarówno brak lekarstwo i niewiarygodne. O ile się nie mylę? – Rejected

+0

Podczas gdy chcesz zachować ostrożność przy wprowadzaniu danych (z punktu widzenia niezawodności), prawdopodobnie nie będziesz musiał martwić się bezpieczeństwem, ponieważ (zakładam) jesteś właścicielem procesu. –

+0

Można również wyświetlić listę białych poleceń, itp., Aby szybciej wyświetlać nieoczekiwane błędy. Jednak najlepszym scenariuszem, jaki sobie wyobraziłem, jest wyodrębnienie testów (lub innej logiki), które mogą wystąpić przed zrzutem ekranu do osobnego pliku .js i załadowanie go na stronę (http://phantomjs.org/api/phantom/ method/inject-js.html). Możesz mieć Pythona przy maksymalnym przekroczeniu argumentu dla określonego pliku JS do załadowania. –

8

Oto rozwiązanie przy użyciu selen i specjalnego polecenia dla GhostDriver (powinno działać od GhostDriver 1.1.0 i PhantomJS 1.9. 6, przetestowane z 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") 

zobacz także moją odpowiedź na to samo pytanie here.

Powiązane problemy