From 6b66689f243864c7137b2c92d7032814c49abb50 Mon Sep 17 00:00:00 2001 From: Stanislav Pankevich Date: Thu, 27 Feb 2025 21:52:24 +0100 Subject: [PATCH] Add a timeout option: --page-load-timeout --- html2print/html2print.py | 25 +- .../05_page_load_timeout/index1.html | 679 ++++++++++++++++++ .../05_page_load_timeout/test.itest | 3 + .../integration/05_page_load_timeout/test.py | 9 + 4 files changed, 713 insertions(+), 3 deletions(-) create mode 100644 tests/integration/05_page_load_timeout/index1.html create mode 100644 tests/integration/05_page_load_timeout/test.itest create mode 100644 tests/integration/05_page_load_timeout/test.py diff --git a/html2print/html2print.py b/html2print/html2print.py index 7493cd4..47315e9 100644 --- a/html2print/html2print.py +++ b/html2print/html2print.py @@ -302,7 +302,9 @@ class Done(Exception): return data -def create_webdriver(chromedriver: Optional[str], path_to_cache_dir: str): +def create_webdriver( + chromedriver: Optional[str], path_to_cache_dir: str, page_load_timeout: int +) -> webdriver.Chrome: print("html2print: creating ChromeDriver service.", flush=True) # noqa: T201 if chromedriver is None: path_to_chrome = ChromeDriverManager().get_chrome_driver( @@ -342,7 +344,7 @@ def create_webdriver(chromedriver: Optional[str], path_to_cache_dir: str): options=webdriver_options, service=service, ) - driver.set_page_load_timeout(60) + driver.set_page_load_timeout(page_load_timeout) return driver @@ -397,6 +399,19 @@ def main(): type=str, help="Optional path to a cache directory whereto the ChromeDriver is downloaded.", ) + command_parser_print.add_argument( + "--page-load-timeout", + type=int, + default=2 * 60, + # 10 minutes should be enough to print even the largest documents. + choices=range(0, 10 * 60), + help=( + "How long shall HTML2Print wait while the Chrome Driver is printing " + "a given HTML page to PDF. " + "This is mainly driven by the time it takes for Chrome to open an " + "HTML file, load it, and let HTML2PDF.js finish its job." + ), + ) command_parser_print.add_argument( "paths", nargs="+", help="Paths to input HTML file." ) @@ -418,10 +433,14 @@ def main(): elif args.command == "print": paths: List[str] = args.paths + page_load_timeout: int = args.page_load_timeout + path_to_cache_dir = ( args.cache_dir if args.cache_dir is not None else DEFAULT_CACHE_DIR ) - driver = create_webdriver(args.chromedriver, path_to_cache_dir) + driver = create_webdriver( + args.chromedriver, path_to_cache_dir, page_load_timeout + ) @atexit.register def exit_handler(): diff --git a/tests/integration/05_page_load_timeout/index1.html b/tests/integration/05_page_load_timeout/index1.html new file mode 100644 index 0000000..db0d82f --- /dev/null +++ b/tests/integration/05_page_load_timeout/index1.html @@ -0,0 +1,679 @@ + + + + + + Test page + + + + + +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ +
+

Hello world!

+
+
+

Hello world!

+
+ + + + diff --git a/tests/integration/05_page_load_timeout/test.itest b/tests/integration/05_page_load_timeout/test.itest new file mode 100644 index 0000000..7f9f8d5 --- /dev/null +++ b/tests/integration/05_page_load_timeout/test.itest @@ -0,0 +1,3 @@ +RUN: %expect_exit 1 %html2pdf print --page-load-timeout 0 %S/index1.html %S/Output/index1.pdf 2>&1 | filecheck %s + +CHECK: selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 0.000 diff --git a/tests/integration/05_page_load_timeout/test.py b/tests/integration/05_page_load_timeout/test.py new file mode 100644 index 0000000..14cbf44 --- /dev/null +++ b/tests/integration/05_page_load_timeout/test.py @@ -0,0 +1,9 @@ +from pypdf import PdfReader + +reader = PdfReader("Output/index1.pdf") +assert len(reader.pages) == 1 +assert reader.pages[0].extract_text() == "Hello world!" + +reader = PdfReader("Output/index2.pdf") +assert len(reader.pages) == 1 +assert reader.pages[0].extract_text() == "Hello world!"